Unity Shader——Writing Surface Shaders(2)——Custom Lighting models in Surface Shaders

Surface Shader中的自定義光照模型

  當你在編寫 Surface Shaders 時,是在描述一個表面的屬性(反射顏色、法線……),並且光的交互過程是由一個光照模型來計算的。內建的光照模型有Lambert(漫反射光照)和BlinnPhong(鏡面光照)。html

  有時候,你可能想要使用一個自定義的光照模型,這在Surface Shader中是可能的。光照模型其實就是一些知足某些約定的Cg/HLSL函數。Unity內建的光照模型Lambert和BlinnPhong定義在Lighting.cginc文件中。這個文件在:app

  • Windows:{Unity安裝目錄}/Data/CGIncludes/Lighting.cginc
  • Mac:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc

光照模型聲明

  光照模型是一系列名字以Lighting開頭的約定函數。它們可以聲明在shader文件或者包含的文件中的任何地方。這些函數是:函數

  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函數,並且全部使用它的shader只會編譯到正向渲染中。spa

解碼光照貼圖

  用於正向渲染和延遲光照的光照貼圖數據的解碼能夠被自定義在相似光照函數的方式中。根據光照模型是否依賴視線方向,選擇下面其中一種函數。要解碼標準的Unity光照貼圖紋理數據(傳入到colortotalColor,indirectOnlyColor 和scale 參數中),請使用內建的DecodeLightmap函數。3d

  自定義解碼單張光照貼圖的函數是:code

  1. half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color);用於不依賴視線方向的光照模型(如漫反射)。
  2. half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir); 用於依賴視線方向的光照模型。

  自定義解碼兩張光照貼圖的函數是:orm

  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); 用於依賴視線方向的光照模型。

  自定義解碼方向光照貼圖的函數是:htm

  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); 用於依賴視線方向的光照模型。

例子

Surface Shader Lighting Examplesget

相關文章
相關標籤/搜索