Unity 표면 셰이더 가이드
이 문서는 Unity에서 표면 셰이더를 작성하는 방법과 커스텀 조명 모델을 구현하는 예제들을 다룹니다. 아래에서는 표면 셰이더의 기본 사용법과 몇 가지 응용 예제를 소개하겠습니다.
표면 셰이더 개요
표면 셰이더는 객체의 표면 특성을 정의하는 데 사용됩니다. 기본적인 조명 모델과 텍스처 적용을 통해 다양한 시각 효과를 생성할 수 있습니다.
기본 디퓨즈 셰이더 예제
다음은 기본 디퓨즈 셰이더의 예입니다. 이 셰이더는 텍스처를 적용하여 알베도를 계산합니다.
Shader "Example/Diffuse Texture" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
커스텀 조명 모델
디퓨즈 셰이더를 수정하여 커스텀 조명 모델을 추가할 수 있습니다. 예를 들어, SimpleLambert 함수를 사용한 커스텀 셰이더는 다음과 같습니다.
Shader "Example/Diffuse Texture" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf SimpleLambert
half4 LightingSimpleLambert (SurfaceOutput s, half3 lightDir, half atten) {
half NdotL = dot (s.Normal, lightDir);
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten);
c.a = s.Alpha;
return c;
}
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
다양한 조명 효과
여기서는 몇 가지 다른 조명 효과를 사용하는 셰이더를 예로 들어 설명합니다.
Wrapped Diffuse
이 조명 모델은 조명이 객체의 경계를 "감싸는" 효과를 나타냅니다.
CGPROGRAM
#pragma surface surf WrapLambert
half4 LightingWrapLambert (SurfaceOutput s, half3 lightDir, half atten) {
half NdotL = dot (s.Normal, lightDir);
half diff = NdotL * 0.5 + 0.5;
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);
c.a = s.Alpha;
return c;
}
ENDCG
Toon Ramp
Toon 램프는 표면이 광원과 노멀 사이의 각도에 따라 색상을 정의합니다. 주로 카툰 스타일의 효과를 위해 사용됩니다.
CGPROGRAM
#pragma surface surf Ramp
sampler2D _Ramp;
half4 LightingRamp (SurfaceOutput s, half3 lightDir, half atten) {
half NdotL = dot (s.Normal, lightDir);
half diff = NdotL * 0.5 + 0.5;
half3 ramp = tex2D (_Ramp, float2(diff)).rgb;
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * ramp * atten;
c.a = s.Alpha;
return c;
}
ENDCG
Simple Specular
간단한 스페큘러 조명 모델을 정의하여 반사광의 효과를 추가합니다.
CGPROGRAM
#pragma surface surf SimpleSpecular
half4 LightingSimpleSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {
half3 h = normalize (lightDir + viewDir);
half diff = max (0, dot (s.Normal, lightDir));
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, 48.0);
half4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * atten;
c.a = s.Alpha;
return c;
}
ENDCG
결론
Unity의 셰이더 시스템은 강력하고 유연한 그래픽스를 구현할 수 있는 기초를 제공합니다. 위의 예제들은 표면 셰이더의 기본적인 작동 방식을 보여주며, 여러분이 다양한 조명 모델을 커스터마이즈하여 원하는 효과를 달성하는 데 도움이 될 것입니다.
더 많은 셰이더 예제와 기술적인 내용을 원하시면 Unity 공식 문서를 참고하시기 바랍니다.