Unity-表面著色器中的自定義光照模型
編寫表面著色器時,您將描述表面的屬性(比如反照率顏色和法線),而由__光照模型__計(jì)算光照交互。
有兩個內(nèi)置光照模型,分別是?Lambert
?和?BlinnPhong
,前者用于漫射光照,后者用于鏡面反射光照。Unity 中的?Lighting.cginc?文件用于定義這些模型(Windows:<unity 安裝路徑>/Data/CGIncludes/Lighting.cginc_;macOS:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc_)。
有些時候,您可能希望使用自定義光照模型。為此,可使用表面著色器。光照模型實(shí)際上就是若干符合某些慣例的 Cg/HLSL 函數(shù)。
聲明光照模型
一個光照模型中包含多個名稱以?Lighting
?開頭的常規(guī)函數(shù)。您可以在著色器文件中的任何位置聲明這些函數(shù),也可以在其中一個包含的文件中聲明。這些函數(shù)是:
1.half4 Lighting<Name> (SurfaceOutput s, UnityGI gi);
?在_不依賴于_視圖方向的光照模型的前向渲染路徑中使用此函數(shù)。
1.half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);
?在_依賴于_視圖方向的光照模型的前向渲染路徑中使用此函數(shù)。
1.half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);
?在延遲光照路徑中使用此函數(shù)。
1.half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
?在光照預(yù)通道(舊版延遲)光照路徑中使用此函數(shù)。
請注意,您無需聲明所有函數(shù)。光照模型不一定會使用視圖方向。同樣,如果僅在前向渲染中使用光照模型,請勿聲明?_Deferred
?和?_Prepass
?函數(shù)。這確保了使用視圖方向的著色器僅編譯到前向渲染。
自定義 GI
聲明以下函數(shù)可自定義光照貼圖數(shù)據(jù)和探針的解碼:
1.half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);
請注意,要對 Unity 標(biāo)準(zhǔn)光照貼圖和 SH 探針進(jìn)行解碼,您可以使用內(nèi)置函數(shù)?DecodeLightmap
?和?ShadeSHPerPixel
;這些函數(shù)位于 Unity 內(nèi)部?UnityGlobalIllumination.cginc?文件中的?UnityGI_Base
?內(nèi)(Windows:<unity 安裝路徑>/Data/CGIncludes/UnityGlobalIllumination.cginc_;macOS:/Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc__)。
示例
請參閱有關(guān)表面著色器光照示例的文檔以了解更多信息。