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

표면 셰이더의 커스텀 조명 모델(Custom lighting models in Surface Shaders)

표면 셰이더를 작성할 때 사용자가 표면의 프로퍼티(알베도 컬러 및 노멀 등)를 기술하면 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으로 시작하는 일반 함수로 구성됩니다. 셰이더 파일의 어디에서든 모델을 선언할 수도 있고, 포함된 파일 중 하나에서 모델을 선언할 수도 있습니다. 해당 함수는 다음과 같습니다.

  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, macOS: /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc_)에 있는 UnityGI_Base에서 확인할 수 있는 내장 DecodeLightmapShadeSHPerPixel 함수를 사용할 수 있습니다.

예제

자세한 내용은 표면 셰이더 조명 예제 문서를 참조하십시오.

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