シェーダは,オブジェクト自体の見た目 (そのマテリアル プロパティ) およびライトにどのように反応するかを定義します。 ライティングの計算をシェーダに作成する必要があるため,また多くのライトやシャドウのタイプがあるため,_機能するだけの_質の高いシェーダを記述することは,複雑な作業です。 これを簡単にするため,Unity 3 では,Surface Shaders を導入しています。ここでは,すべてのライティング,シャドーイング,ライトマッピング,フォワード対遅延ライティングが自動で配慮されます。
本書では,Unity のライティングおよびレンダリング パイプラインの特徴および Surface Shaders のシーン裏で起きていることについて説明します。
ライティングがどのように適用されるか,およびシェーダのどの Passes が使用されるかは,どの Rendering Path が使用されるかで決まります。 シェーダ内の各パスは,Pass Tags を介して,そのライティング タイプと通信します。
PrepassBase
and PrepassFinal
パスが使用されます。ForwardBase
and ForwardAdd
パスが使用されます。Vertex
, VertexLMRGBM
and VertexLM
パスが使用されます。ShadowCaster
と ShadowCollector
パスが使われます。
PrepassBase
パスは,法線およびスペキュラ指数をレンダリングします。PrepassFinal
パスは,テクスチャ,ライティングおよび放出マテリアル プロパティを結合することで最終的な色をレンダリングします。 通常のシーン内のライティングはすべて,シーン空間で個別に行われます。 詳細については,Deferred Lighting を参照してください。
ForwardBase
パスは,周囲,ライトマップ,メインのディレクショナル ライトおよび重要でない (頂点/SH) ライトを一度にレンダリングします。 ForwardAdd
パスは,追加の頂点ごとのライトに使用されます。このようなライトによって照らされるオブジェクトごとに 1 回の呼び出しが行われます。 詳細については,Forward Rendering を参照してください。
もしフォワードレンダリングが使われるならば,シェーダーはforward-suitableパス( ForwardBase
や ForwardAdd
のどちらも)を持ちませんが,そのオブジェクトは頂点リットパスでレンダリングされます。詳しくは下の項目を見て下さい。
頂点ライティングは,プログラム可能なシェーダをサポートしていないプラットフォームで頻繁に使用されるため,Unity は,ライトマップ使用時対未使用時の場合を処理するために内部で複数のシェーダ順列を作成できます。 そのため,ライトマップ使用時対未使用オブジェクトを処理するため,複数のパスを明示的に記述する必要があります。
Vertex
パスは,ライトマップが使用されていないオブジェクトに使用されます。 すべてのライトは,固定関数 OpenGL/Direct3D ライティング モデル (Blinn-Phong) を使用して,一度にレンダリングされます。VertexLMRGBM
パスは,ライトマップが RGBM 符号化される場合に,ライトマップ使用オブジェクトに使用されます (これは,ほとんどのデスクトップおよびコンソールで行われます)。 リアルタイム ライティングは適用されません。パスはテクスチャとライトマップの結合に使用されます。VertexLMM
パスは,ライトマップが 2 重 LDR 符号化される場合に,ライトマップ使用オブジェクトに使用されます (これは,携帯機器および古いデスクトップで行われます)。 リアルタイム ライティングは適用されません。パスはテクスチャとライトマップの結合に使用されます。