シェーダーは、オブジェクト自体の見た目 (マテリアルプロパティー) およびライトにどのように反応するかを定義します。ライティングの計算をシェーダーに設定する必要があるため、また多くのライトや影の種類があるため、丁度良く機能する質の高いシェーダーを作成することは、複雑な作業です。これを簡単にするため、Unity では、サーフェスシェーダー を導入しています。サーフェスシェーダーは、すべてのライト、影、ライトマップ、フォワード/デファードレンダリングを自動で処理します。
ここでは、Unity のライティングおよびレンダリングパイプラインの特徴および サーフェスシェーダー のシーン裏で起きていることについて説明します。
ライティングがどのように適用されるか、およびシェーダーのどの パス が使用されるかは、どの レンダリングパス を使用するかで決まります。シェーダー内の各パスは、Pass 内の Tags を介して、そのライティングタイプと通信します。
ForwardBase
と ForwardAdd
パスが使用されます。Deferred
パスが使用されます。PrepassBase
と PrepassFinal
パスが使用されます。Vertex
、VertexLMRGBM
、VertexLM
パスが使用されます。ShadowCaster
パスが使われます。ForwardBase
パスは、アンビエント、ライトマップ、メインのディレクショナルライト、重要でない (頂点/球面調和) ライトを一度にレンダリングします。ForwardAdd
パスは、追加のピクセルごとのライトに使用されます。このようなライトによって照らされるオブジェクトごとに 1 回の呼び出しが行われます。詳細については、フォワードレンダリング を参照してください。
フォワードレンダリングが使用され、シェーダーにフォワードレンダリングに適切なパスがない (つまりForwardBase
も ForwardAdd
も存在しない) 場合には 、そのオブジェクトは、まるで頂点ライティングパスでレンダリングされたようにレンダリングされます。詳しくは後述を参照してください。
ディファード
パスは、ライティングに必要なすべての情報 (ビルトインシェーダーの場合、ディフューズ色、スペキュラー色、スムースネス、
ワールド空間法線、エミッション) をレンダリングします。また、エミッションチャンネルに、ライトマップ、リフレクションプローブ、アンビエントライティングの情報も追加されます。詳細は ディファードシェーディング を参照してください。
PrepassBase
パスは、法線およびスペキュラー指数をレンダリングします。PrepassFinal
パスは、テクスチャと、ライティングマテリアル/放出マテリアルのプロパティーを混合することで最終的な色をレンダリングします。通常のシーン内のライティングはすべて、シーン空間で個別に行われます。詳細については、古いデファードライティング を参照してください。
頂点ライティングは、プログラム可能なシェーダーをサポートしないプラットフォームで使用されることが多いため、Unity が内部的に複数のシェーダーバリアントを作成して、ライトマップされた/ライトマップされていない場合を処理することができません。そのため、ライトマップされた/ライトマップされていないオブジェクトを処理するためには、複数のパスを明示的に作成する必要があります。
Vertex
パスは、ライトマップされていないオブジェクトに使用されます。すべてのライトは、OpenGL/Direct3D ライティングモデルのデフォルト機能である (Blinn-Phong) を使用して、一度にレンダリングされます。VertexLMRGBM
パスは、ライトマップが RGBM エンコードされる場合 (PC とコンソール) に、ライトマップ使用オブジェクトに使用されます。リアルタイムライティングは適用されません。パスはテクスチャとライトマップの混合に使用されます。VertexLMM
パスは、ライトマップが 2 重に LDR エンコードされる場合 (モバイルプラットフォーム) に、ライトマップ使用オブジェクトに使用されます。リアルタイムライティングは適用されません。パスはテクスチャとライトマップの混合に使用されます。