표면 쉐이더의 예
표면 쉐이더 라이팅의 예

표면 쉐이더에서 사용자 정의 라이팅 모델

Surface Shaders를 작성할 때 표면의 프로퍼티(albedo color, normal, …)를 설명합니다. 라이팅의 상호 작용은 、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으로 시작하는 이름이 있는 일반 함수입니다. 이들은 쉐이더 파일 또는 포함된 파일 중 하나의 임의의 장소에서 선언할 수 있습니다. 다음 함수가 있습니다.

  1. half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten); 이것은 뷰 방향에 의존하고 있지 않은 라이트 모델의 포워드 렌더링 패스에서 사용됩니다(예 : 디퓨즈).

  2. half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten); 이것은 뷰 방향에 의존하고 있는 라이팅 모델의 포워드 렌더링 패스에서 사용됩니다(예 : 디퓨즈).

  3. half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light); 이것은 지연 라이팅 패스에 사용됩니다.

모든 함수를 선언할 필요는 없습니다. 라이팅 모델은 뷰 방향을 사용하거나, 하지 않거나 중 하나입니다. 마찬가지로, 라이팅 모델이 지연 라이팅에서 작동하지 않는 경우, _PrePass 함수를 선언하지 않고, 그것을 사용하는 모든 쉐이더는 포워드 렌더링에 대해서만 컴파일합니다.

라이트맵 디코딩

라이트맵 디코딩은 Forward 및 Deferred Lighting 라이팅 함수와 같은 방법으로 정의할 수 있습니다. 자신의 라이팅 모델이 뷰 방향 의존 여부에 따라 다음 중 하나의 함수를 사용하십시오. 표준 Unity 라이트맵 텍스처 데이터(color, totalColor, indirectOnlyColorscale의 인수로 전달)를 디코딩하려면, 내장 DecodeLightmap 함수를 사용하십시오.

사용자 정의 라이트맵 디코딩 함수는 Forward 및 Deferred Lighting 패스를 자동으로 처리합니다. 그러나 Deferred의 경우, Lighting<Name>_PrePass 함수가 라이트맵 디코딩 후에 호출되고, light 인수는 실시간 라이팅과 라이트 맵의 합계를 보유합니다. 만약 필요하다면 Forward 및 Deferred Lighting 패스를 구분하기 위해 내장 UNITY_PASS_PREPASSFINAL 매크로를 사용할 수 있습니다.

단일 라이트맵 디코딩을 사용자 정의 기능은 :

  1. half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color); 이것은 뷰 방향에 의존하지 않는 라이트 모델에서 사용됩니다(예를 들면 디퓨즈).

  2. half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir); 이것은 뷰 방향에 의존하는 라이트 모델에서 사용됩니다,

듀얼 라이트맵 디코딩을 사용자 정의하는 함수는 :

  1. half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade); 이것은 뷰 방향에 의존하지 않는 라이트 모델에서 사용됩니다(예를 들면 디퓨즈).

  2. half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade, half3 viewDir); 이것은 뷰 방향에 의존하는 라이트 모델에서 사용됩니다,

방향성 라이트맵 디코딩을 사용자 정의하는 함수는 :

  1. half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal); 이것은 뷰 방향에 의존하지 않는 라이트 모델에서 사용됩니다(예를 들면 디퓨즈).

  2. half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor); 이것은 뷰 방향에 의존하는 라이트 모델에서 사용됩니다,

표면 쉐이더의 예

표면 쉐이더의 예
표면 쉐이더 라이팅의 예