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

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

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Surface Shaders を記述する際,表面のプロパティ (アルベド,色,法線など) を記述します。ライティングの相互作用は,Lighting Model によって計算されます。 組み込みライティング モデルは,Lambert (デフューズ ライティング) と BlinnPhong (スペキュラ ライティング) です。

カスタムのライティング モデルを使用したい場合があると思いますが,これは,サーフェイスシェーダで行うことができます。 ライティング モデルは,慣例に一致する幾つかの Cg/HLSL 関数にすぎません。 組み込み Lambert and BlinnPhong モデルは,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 ライトマップ テクスチャ データ (color, totalColor, indirectOnlyColor, および scale での引数で渡される) をデコードするには,ビルトインの DecodeLightmap 関数を使用して下さい。

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

サーフェイスシェーダの例

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