Custom Lighting models in Surface Shaders
Surface Shaders를 쓸 때, 사용자는 표면(albedo color, normal, …)의 속성을 설명하고 있고 조명 상호 작용이 조명 모델(Lighting Model)
. 내장된 조명 모델이 Lambert
(diffuse 조명)이고 BlinnPhong
(반사적인 조명) 입니다.
때때로 사용자는 사용자 정의 조명 모델을 사용하기를 원할지도 모르고 표면 쉐이더에서 저것을 하는 것이 가능합니다. 조명 모델이 어떤 규칙을 매치하는Cg/HLSL 함수 두 개보다 더 많지 않습니다. 내장된 Lambert
와 BlinnPhong
모델은 Unity 안의 Lighting.cginc
파일에서 정의됩니다(Windows에서 {unity install path}/Data/CGIncludes/Lighting.cginc, Mac에서 /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).
Lighting Model declaration
조명 모델은 Lighting
으로 시작하는 이름을 가지는 일반 함수 2개 입니다. 그들은 사용자의 쉐이더 파일 또는included 파일 중 하나에서 어디서나 선언될 수 있습니다. 함수는 이것과 같습니다:
half4 Lighting_Name_ (SurfaceOutput s, half3 lightDir, half atten);
이것은 뷰 디렉션에 의존하지 않는 포워드 렌더링 경로에서 사용됩니다 (예. diffuse).
half4 Lighting_Name_ (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
이것은 뷰 디렉션에 의존하는 조명 모델을 위한 포워드 렌더링 경로에서 사용됩니다.
half4 Lighting_NamePrePass (SurfaceOutput s, half4 light);
이것은 deferred 조명 경로에서 사용됩니다. 사용자가 모든 함수를 선언할 필요가 없다는 것을 참고하세요. 조명 모델은 뷰 디렉션을 사용하거나 또는 하지 않는다는 것입니다. 유사하게 조명 모델이 deferred 조명에서 작동하지 않는다면 사용자는
_PrePass함수를 선언하지 않고 그것을 사용하는 모든 쉐이더가 포워드 렌더링만으로 컴파일할 것입니다. 디렉셔널 라이트맵 디코딩은 어떤 상황들에서는 조명이 포워드와 지연 조명에서처럼 비슷한 방식으로 사용자화(customizing) 될 필요가 있습니다. 당신의 라이트 모델이 보는 방향에 의존적인지 아닌지에 따라 아래의 함수 중 하나를 사용하세요. 두개의 함수 다 포워드라이팅과 지연라이팅 렌더링 경로를 자동으로 처리합니다. -
half4 Lighting_NameDirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);
이것은 보는 방향 의존적이지 않은 라이트 모델들에 사용됩니다 (e.g. diffuse). This is used for light models that are not view direction dependent (e.g. diffuse).
half4 Lighting_Name__DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);
이것은 보는 방향 의존적인 라이트 모델들에 사용됩니다.
예제 Examples
_Surface Shader Lighting Examples_
- 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)