표면 셰이더를 작성할 때 사용자가 표면의 프로퍼티(알베도 컬러 및 노멀 등)를 기술하면 Lighting Model 이 조명의 상호작용을 연산합니다.
내장 조명 모델에는 디퓨즈 조명에 사용하는 Lambert
와 스페큘러 조명에 사용하는 BlinnPhong
등 두 가지가 있습니다. 모델은 Unity 에디터 안에 있는 Lighting.cginc 파일(Windows: <unity install path>/Data/CGIncludes/Lighting.cginc; macOS: /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc)에서 정의됩니다.
때로는 커스텀 조명 모델을 사용하는 것이 좋을 수 있습니다. 표면 셰이더를 사용하여 이렇게 할 수 있습니다. 조명 모델은 간단히 말해 몇몇 규칙과 일치하는 두어 개의 Cg/HLSL 함수입니다.
조명 모델은 이름이 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, macOS: /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc_)에 있는 UnityGI_Base
에서 확인할 수 있는 내장 DecodeLightmap
및 ShadeSHPerPixel
함수를 사용할 수 있습니다.
자세한 내용은 표면 셰이더 조명 예제 문서를 참조하십시오.