Surface Shader を記述する際、表面のプロパティー (アルベド、色、法線など) を記述します。ライティングの相互作用は、Lighting Model によって計算されます。組み込みライティングモデルは、Lambert (デフューズライティング) と BlinnPhong (スペキュラライティング) です。
カスタムのライティングモデルを使用したい場合があると思いますが、これは、サーフェイスシェーダーで行うことができます。ライティングモデルは、慣例に一致するいくつかの Cg/HLSL 関数にすぎません。組み込み Lambert
と BlinnPhong
モデルは、Unity 内の Lighting.cginc
ファイルで定義されます (Windows の場合、 {unity install path}/Data/CGIncludes/Lighting.cginc、 Mac の場合、 /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc)。
ライティングモデルは、Lighting
で始まる名前のある通常の関数です。これらは、シェーダーファイルや含まれているファイルのいずれかの任意の場所で宣言できます。以下の関数があります。
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi);
これは、ビュー方向に依存して いない ライトモデルのフォワードレンダリングパスで使用されます (例: デフューズ)。
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);
これは、ビュー方向に依存しているライトモデルのフォワードレンダリングパスで使用されます (例: デフューズ)。
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);
これは、遅延ライティングパスに使用されます。
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
これは、遅延ライティングパスに使用されます。
すべての関数を宣言する必要はありません。ライティングモデルは、ビュー方向を使用するか、しないかのいずれかです。同様に、ライティングモデルがフォワードでしか機能しない場合は、_Deferred
または _Prepass
関数を宣言しないでください。こうすることによって、それを使用するすべてのシェーダーは、フォワードレンダリングにコンパイルされます。
同様に、以下の関数を宣言することによって、デコードするライトマップデータとプローブをカスタマイズします。
標準の Unity ライトマップと SH プローブをデコードするには、Unity 内の UnityGlobalIllumination.cginc
ファイルの UnityGI_Base にあるビルトインの DecodeLightmap と ShadeSHPerPixel 関数を使用できます (Windows の場合 {unity install path}/Data/CGIncludes/UnityGlobalIllumination.cginc 、 Mac の場合 /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc )。