Unity 셰이더 가이드
이 문서는 Unity의 셰이더 개발에 대한 기본적인 안내서입니다. 이 문서에서는 Unity의 빌트인 렌더 파이프라인에서의 셰이더를 작성하고 활용하는 방법에 대해 설명하며, 코드 스니펫과 예제 또한 포함되어 있습니다.
1. 씬 설정
셰이더를 테스트하기 위해 다음과 같은 단계를 진행하여야 합니다.
- 3D 오브젝트 생성:
- 메인 메뉴에서
Game Object > 3D Object > Capsule을 선택합니다. - 카메라 위치 조정:
- 계층 구조에서 캡슐을 더블클릭하여 포커스를 맞춘 후, 메인 카메라 오브젝트를 선택하고, 메인 메뉴에서
Game Object > Align with View를 클릭합니다. - 야기 머티리얼 생성:
- 프로젝트 뷰 메뉴에서
Create > Material을 선택하여 새 머티리얼을 생성합니다.
2. 새 셰이더 생성하기
쉐이더를 생성하는 과정은 다음과 같습니다.
- 프로젝트 뷰 메뉴에서
Create > Shader > Unlit Shader를 선택합니다. - 새로운 셰이더 에셋이 생성됩니다.
2.1 메시, 머티리얼, 셰이더 연결하기
- 머티리얼의 인스펙터를 통해 머티리얼이 셰이더를 사용하도록 설정하거나, 셰이더 에셋을 프로젝트 뷰의 머티리얼 에셋 위로 드래그합니다.
- 그런 다음 머티리얼을 메시 오브젝트에 드래그하거나, 인스펙터에서 메시 렌더러 컴포넌트의 머티리얼 슬롯에 연결합니다.
3. 셰이더 코드 설명
셰이더 코드는 여러 섹션으로 나뉘며, 각 섹션은 중요한 역할을 합니다. 아래는 기본 언릿 셰이더의 구조입니다.
Shader "Unlit/NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o, o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
3.1 주요 파트 설명
| 파트 | 설명 |
|---|---|
| Shader | 셰이더의 이름을 정의합니다. |
| Properties | 머티리얼의 일부로 저장될 변수를 정의합니다. |
| SubShader | GPU 성능에 맞게 여러 서브셰이더를 포함할 수 있습니다. |
| Pass | 렌더링 시 사용하는 패스를 정의합니다. |
4. 셰이더 활용 예제
4.1 단순 컬러 셰이더
셰이더를 단순화하여 하나의 컬러로 오브젝트를 그리는 방법입니다.
Shader "Unlit/SingleColor"
{
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert (float4 vertex : POSITION) : SV_POSITION
{
return mul(UNITY_MATRIX_MVP, vertex);
}
fixed4 _Color;
fixed4 frag () : SV_Target
{
return _Color;
}
ENDCG
}
}
}
4.2 월드 스페이스 노멀 표시
월드 스페이스에서 메시 노멀을 시각화하는 셰이더를 구현합니다.
Shader "Unlit/WorldSpaceNormals"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
half3 worldNormal : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
{
v2f o;
o.pos = UnityObjectToClipPos(vertex);
o.worldNormal = UnityObjectToWorldNormal(normal);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = 0;
c.rgb = i.worldNormal * 0.5 + 0.5;
return c;
}
ENDCG
}
}
}
5. 조명 처리
밝기를 계산하는 기본적인 조명 셰이더 예제입니다.
Shader "Lit/Simple Diffuse"
{
Properties
{
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
Tags {"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct v2f
{
float2 uv : TEXCOORD0;
fixed4 diff : COLOR0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
half3 worldNormal = UnityObjectToWorldNormal(v.normal);
half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
o.diff = nl * _LightColor0;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
col *= i.diff;
return col;
}
ENDCG
}
}
}
6. 결론
셀프튜토리얼에서 다룬 각 단계는 Unity에서의 셰이더 작성 및 적용에 대한 기초를 제공합니다. 이 문서를 참고하여 다양한 셰이더를 실험해보고, 자신의 프로젝트에 적합한 셰이더를 만들어 보시기 바랍니다!