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