원문 : http://docs.unity3d.com/kr/current/Manual/SL-SurfaceShaderLighting.html
표면 쉐이더에서 사용자 정의 라이팅 모델
Surface Shaders를 작성할 때 표면의 프로퍼티(albedo color, normal, …)를 설명하는 구문. 상단에 설계된 Lighting Model에 의해 계산되고 설명된다(첨부한 스샷은 Unlit lighting 모델. 즉 라이팅 계산을 받지 않고 Albedo값을 그대로 그린다. 다른거 쓰려면 이름도 바꾸고 noambient 빼줘야 된다~) 내장 라이팅 모델은 Lambert(디퓨즈 라이팅)과 BlinnPhong(반사 라이팅) 두가지이다.(이거 두개는 별도의 라이팅 모델을 넣지 않아도 된다.(얘네 두개는 Unity 내의 Lighting.cginc 파일에서 정의된다고 함)
Windows의 경우, {unity install path}/Data/CGIncludes/Lighting.cginc, Mac의 경우, /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).
라이팅 모델의 선언
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten);
이것은 뷰 방향에 의존하고 있지 않은 라이트 모델의 포워드 렌더링 패스에서 사용
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
이것은 뷰 방향에 의존하고 있는 라이팅 모델의 포워드 렌더링 패스에서 사용
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
이것은 지연 라이팅 패스에 사용
모든 함수를 선언할 필요는 없다고 함. 라이팅 모델은 뷰 방향을 사용하거나(viewDir), 하지 않거나 중 하나. 마찬가지로, 라이팅 모델이 지연 라이팅에서 작동하지 않는 경우, _PrePass 함수를 선언하지 않고, 그것을 사용하는 모든 쉐이더는 포워드 렌더링에 대해서만 컴파일함.
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"
}
Lambert의 경우 이와같이 조명설계 공식이 없어도 된다.
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 * 2);
c.a = s.Alpha;
return c;
}
SimpleLambert 조명이라 이름 붙인 공식의 예(Unity 5부터 atten * 2 안해줘도 된다는 것 같은데 일단 예문에 붙어있으니 그냥 붙은채로 썻다)
BlinnPhong과 유사한 simpleSpecular 라이팅의 정의
#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 * 2);
c.a = s.Alpha;
return c;
}
'Technical Report > Unity Shader' 카테고리의 다른 글
Unity 5 Standard Shader 구조 해석 (0) | 2015.10.19 |
---|---|
Unity 셰이더 Variants 최적화 (0) | 2015.09.08 |
external lightmap shader 2nd UV (0) | 2015.08.04 |
Unity PostProcessing (0) | 2015.07.14 |
Unity5 compressed option (0) | 2015.07.05 |