サーフェイスシェーダーの例
サーフェイスシェーダーライティングの例

サーフェイスシェーダーでのカスタムライティングモデル

Surface Shader を記述する際、表面のプロパティー (アルベド、色、法線など) を記述します。ライティングの相互作用は、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 ライトマップテクスチャデータ (colortotalColorindirectOnlyColorscale での引数で渡される) をデコードするには、ビルトインの DecodeLightmap 関数を使用してください。

カスタムのライトマップデコード関数は Forward および Deferred Lighting パスを自動的にハンドリングします。しかし Deferred の場合 Lighting&lt;Name&gt;_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); これはビュー方向依存であるライトモデルで使用されます

サーフェイスシェーダーライティングの例

サーフェイスシェーダーの例
サーフェイスシェーダーライティングの例