표면 셰이더 예제
표면 셰이더 조명 예제

표면 셰이더(Surface Shaders)에서의 커스텀 조명(Lighting) 모델

표면 셰이더를 작성할 때 표면의 프로퍼티(알베도 컬러, 노멀 등)을 기술하게 되며 광원 상호작용이 Lighting Model__에 의해 계산됩니다. 빌트인 조명 모델로는 Lambert(디퓨즈 조명)과 BlinnPhong__(스페큘러 조명)이 있습니다.

커스텀 조명 모델을 사용하고자 할 때에는 표면 셰이더에서 사용할 수 있습니다. 조명 모델은 단지 몇 가지 규약에 맞는 Cg/HLSL 함수 몇 개에 지나지 않습니다. 빌트인 LambertBlinnPhong 모델은 Unity의 Lighting.cginc 파일에 정의되어 있습니다(Windows에서는 {unity install path}/Data/CGIncludes/Lighting.cginc, Mac에서는 /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).

조명 모델(Lighting Model) 선언

조명 모델은 Lighting으로 시작하는 이름을 가지는 몇몇 일반 함수입니다. 이 모델들은 셰이더 파일 또는 포함된 파일에서 어디에나 선언할 수 있습니다. 해당 함수는 다음과 같습니다.

  1. half4 Lighting<Name> (SurfaceOutput s, UnityGI gi); 뷰 방향에 의존하지 않는 광원 모델(예: 디퓨즈)용의 포워드 렌더링에 사용합니다.

  2. half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); 함수는 뷰 방향에 의존하는 광원 모델용의 포워드 렌더링에 사용합니다.

  3. half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); 함수는 디퍼드 라이팅 경로에 사용합니다.

  4. half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light); 함수는 프리패스(레거시 디퍼드) 조명 경로에 사용합니다.

모든 함수를 선언할 필요는 없다는 점을 기억해야 합니다. 광원 모델은 뷰 방향을 이용할 수도 있고 안 할 수도 있습니다. 이와 유사하게 조명 모델이 포워드 라이팅에서만 작동한다면 _Deferred 또는 _Prepass 함수를 선언하지 말아야 합니다. 이렇게 하면 모든 셰이더가 포워드 렌더링 전용으로 컴파일됩니다.

커스텀 GI

이와 유사하게 아래 함수를 선언해 디코딩 라이트맵 데이터와 프로브를 커스터마이즈해야 합니다.

  1. 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 함수를 사용할 수 있습니다.

예제

표면 셰이더 조명 예제

표면 셰이더 예제
표면 셰이더 조명 예제