표면 셰이더를 작성할 때 표면의 프로퍼티(알베도 컬러, 노멀 등)을 기술하게 되며 광원 상호작용이 Lighting Model 에 의해 계산됩니다. 빌트인 조명 모델로는 Lambert(디퓨즈 조명)과 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
으로 시작하는 이름을 가지는 몇몇 일반 함수입니다. 이 모델들은 셰이더 파일 또는 포함된 파일에서 어디에나 선언할 수 있습니다. 해당 함수는 다음과 같습니다.
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi);
뷰 방향에 의존하지 않는 광원 모델(예: 디퓨즈)용의 포워드 렌더링에 사용합니다.
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);
함수는 뷰 방향에 의존하는 광원 모델용의 포워드 렌더링에 사용합니다.
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);
함수는 디퍼드 라이팅 경로에 사용합니다.
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
함수는 프리패스(레거시 디퍼드) 조명 경로에 사용합니다.
모든 함수를 선언할 필요는 없다는 점을 기억해야 합니다. 광원 모델은 뷰 방향을 이용할 수도 있고 안 할 수도 있습니다. 이와 유사하게 조명 모델이 포워드 라이팅에서만 작동한다면 _Deferred
또는 _Prepass
함수를 선언하지 말아야 합니다. 이렇게 하면 모든 셰이더가 포워드 렌더링 전용으로 컴파일됩니다.
이와 유사하게 아래 함수를 선언해 디코딩 라이트맵 데이터와 프로브를 커스터마이즈해야 합니다.
half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);
표준 Unity 라이트맵과 SH 프로브 디코드에는 Unity UnityGlobalIllumination.cginc
파일(Windows에서는 {unity install path}/Data/CGIncludes/UnityGlobalIllumination.cginc, Mac에서는 /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc) 내부의 UnityGI_Base 에서 보이듯이 빌트인 DecodeLightmap 및 ShadeSHPerPixel 함수를 사용할 수 있습니다.