Unity 표면 셰이더 작성 가이드
이 가이드는 Unity의 표면 셰이더 작성법에 대한 설명과 다양한 활용 예제를 제공합니다. 표면 셰이더는 Unity의 렌더링에서 물체의 표면을 어떻게 표현할지를 결정하는 중요한 요소입니다.
표면 셰이더의 기본 개념
표면 셰이더는 객체의 외관을 정의하는 것으로, 사용되는 조명 타입과 렌더링 경로에 따라 다르게 동작합니다. 기본적으로 셰이더는 각 패스에 필요한 조명 정보를 포함하고 있으며, 이는 다양한 렌더링 경로에서 어떻게 적용되는지에 따라 달라집니다.
렌더링 경로
렌더링 경로는 주로 두 가지 방식으로 나뉩니다:
- 포워드 렌더링 (Forward Rendering): 이 방식에서는
ForwardBase와ForwardAdd패스가 사용되어 조명을 처리합니다. - 디퍼드 셰이딩 (Deferred Shading): 이 방식은
Deferred패스를 통해 모든 조명 정보를 렌더링합니다.
| 렌더링 경로 | 사용되는 패스 |
|---|---|
| 포워드 렌더링 | ForwardBase, ForwardAdd |
| 디퍼드 셰이딩 | Deferred |
| 레거시 버텍스 릿 | Vertex, VertexLMRGBM, VertexLM |
포워드 렌더링
포워드 렌더링에서 ForwardBase 패스는 앰비언트, 라이트맵, 주광원 및 기타 광원을 함께 렌더링합니다. ForwardAdd 패스는 추가 조명을 처리하며 물체당 한 번 호출됩니다.
포워드 렌더링 예제
Shader "Custom/MySurfaceShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
}
위 코드는 기본적인 표면 셰이더의 구조를 보여줍니다. vert 함수는 정점 데이터를 변환하고, frag 함수는 텍스처를 샘플링하여 프래그먼트 색상을 반환합니다.
디퍼드 셰이딩
디퍼드 셰이딩 경로에서 셰이더는 모든 조명 정보를 렌더링하며, 라이트맵과 반사 프로브, 주변 광을 처리합니다.
디퍼드 셰이딩 예제
Shader "Custom/MyDeferredShader"
{
SubShader
{
Tags { "RenderType"="Opaque" }
Pass {
Name "DEFERRED"
// 디퍼드 셰이딩을 위한 코드 작성
}
}
}
디퍼드 셰이딩을 위한 이 코드 스니펫은 기본적인 구조를 보여줍니다. 여기에 추가 조명 처리를 위한 로직이 포함될 수 있습니다.
레거시 버텍스 릿
레거시 버텍스 릿 렌더링 경로는 프로그래머블 셰이더를 지원하지 않는 플랫폼에서 가장 많이 사용됩니다. 이 경로는 여러 셰이더 변형을 내부적으로 생성하여 다양한 조명 소스를 처리합니다.
| 패스 유형 | 설명 |
|---|---|
| Vertex | 라이트맵이 적용되지 않은 경우 사용하는 패스 |
| VertexLMRGBM | RGBM으로 인코딩된 라이트맵의 경우 사용하는 패스 |
| VertexLM | double-LDR로 인코딩된 라이트맵의 경우 사용하는 패스 |
활용 예제
- 기본 표면 셰이더 생성: Unity에서 새로운 표면 셰이더를 생성하여 기본 색상 및 텍스처를 감지하고 조명 효과를 추가할 수 있습니다.
- 프로젝트에 특수 효과 추가: 표면 셰이더를 수정하여 반사, 굴절 및 다양한 시각 효과를 추가할 수 있습니다.
- 란더링 최적화: 셰이더 코드를 최적화하여 렌더링 성능을 향상시킬 수 있습니다.
이 가이드를 통해 Unity에서 표면 셰이더를 생성하고 사용하는 방법에 대한 기본적인 이해를 돕고, 다양한 활용 가능성을 탐색할 수 있기를 바랍니다.