Surface Shaders を記述する際,表面のプロパティ (アルベド,色,法線など) を記述します。ライティングの相互作用は,Lighting Model によって計算されます。 組み込みライティング モデルは,Lambert (デフューズ ライティング) と BlinnPhong (スペキュラ ライティング) です。
カスタムのライティング モデルを使用したい場合があると思いますが,これは,サーフェイスシェーダで行うことができます。 ライティング モデルは,慣例に一致する幾つかの Cg/HLSL 関数にすぎません。 組み込み Lambert
and BlinnPhong
モデルは,Unity 内の Lighting.cginc
ファイルで定義されます (Windows の場合, ,Mac の場合, )。
ライティング モデルは,Lighting
で始まる名前のある通常の関数です。 これらは,シェーダ ファイルまたは含まれているファイルのいずれかの任意の場所で宣言できます。 以下の関数があります。
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten);
これは,ビュー方向に依存して_いない_ライト モデルのフォワード レンダリング パスで使用されます (例: デフューズ)。
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
これは,ビュー方向に依存しているライト モデルのフォワード レンダリング パスで使用されます (例: デフューズ)。
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
これは,遅延ライティング パスに使用されます。
すべての関数を宣言する必要はありません。 ライティング モデルは,ビュー方向を使用するか,しないかのいずれかです。 同様に,ライティング モデルが遅延ライティングで機能しない場合,_PrePass
関数を宣言せず,それを使用するすべてのシェーダは,フォワード レンダリングに対してのみコンパイルを行います。
ライトマップのデコードは Forward および Deferred Lighting のライティング関数と同様にしてカスタマイズが出来ます。自身のライティングモデルがビュー方向依存であるかどうかによって以下のいずれかの関数を使用して下さい。標準的な Unity ライトマップ テクスチャ データ (color
, totalColor
, indirectOnlyColor
, および scale
での引数で渡される) をデコードするには,ビルトインの DecodeLightmap 関数を使用して下さい。
カスタムのライトマップ デコード関数は Forward および Deferred Lighting パスを自動的にハンドリングします。しかし Deferred の場合 Lighting<Name>_PrePass
関数がライトマップデコードの__後に__ コールされ,そして light
引数 はリアルタイム ライティング と ライトマップ の合計を保有します。もし必要であれば Forward および Deferred Lighting パスを区別するためにビルトインの UNITY_PASS_PREPASSFINAL マクロを使用できます。
単一の ライトマップのデコードをカスタマイズする関数は:
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color);
これはビュー方向依存でないライトモデルで使用されます(例えば 拡散)
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir);
これはビュー方向依存であるライトモデルで使用されます
デュアルの ライトマップのデコードをカスタマイズする関数は:
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);
これはビュー方向依存であるライトモデルで使用されます
方向性の ライトマップのデコードをカスタマイズする関数は:
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);
これはビュー方向依存でないライトモデルで使用されます(例えば 拡散)
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);
これはビュー方向依存であるライトモデルで使用されます