當你在編寫 Surface Shaders 時,是在描述一個表面的屬性(反射顏色、法線……),並且光的交互過程是由一個光照模型來計算的。內建的光照模型有Lambert(漫反射光照)和BlinnPhong(鏡面光照)。html
有時候,你可能想要使用一個自定義的光照模型,這在Surface Shader中是可能的。光照模型其實就是一些知足某些約定的Cg/HLSL函數。Unity內建的光照模型Lambert和BlinnPhong定義在Lighting.cginc文件中。這個文件在:app
光照模型是一系列名字以Lighting開頭的約定函數。它們可以聲明在shader文件或者包含的文件中的任何地方。這些函數是:函數
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
用於延遲光照路徑中。 注意:你不須要聲明全部的函數。光照模型要麼使用視線方向,要麼不使用。一樣的,若是光照模型不工做在延遲光照中,就不要聲明 _PrePass函數,並且全部使用它的shader只會編譯到正向渲染中。
spa
用於正向渲染和延遲光照的光照貼圖數據的解碼能夠被自定義在相似光照函數的方式中。根據光照模型是否依賴視線方向,選擇下面其中一種函數。要解碼標準的Unity光照貼圖紋理數據(傳入到color
, totalColor
,indirectOnlyColor
和scale
參數中),請使用內建的DecodeLightmap函數。3d
自定義解碼單張光照貼圖的函數是:code
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir);
用於依賴視線方向的光照模型。自定義解碼兩張光照貼圖的函數是:orm
half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade);
用於不依賴視線方向的光照模型(如漫反射)。half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade, half3 viewDir);
用於依賴視線方向的光照模型。自定義解碼方向光照貼圖的函數是:htm
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);
用於依賴視線方向的光照模型。