詳細な ShaderLab トピック
シェーダを書く場合のパフォーマンスのヒント

Unity のレンダリング パイプライン

シェーダは,オブジェクト自体の見た目 (そのマテリアル プロパティ) およびライトにどのように反応するかを定義します。 ライティングの計算をシェーダに作成する必要があるため,また多くのライトやシャドウのタイプがあるため,_機能するだけの_質の高いシェーダを記述することは,複雑な作業です。 これを簡単にするため,Unity 3 では,Surface Shaders を導入しています。ここでは,すべてのライティング,シャドーイング,ライトマッピング,フォワード対遅延ライティングが自動で配慮されます。

本書では,Unity のライティングおよびレンダリング パイプラインの特徴および Surface Shaders のシーン裏で起きていることについて説明します。

レンダリング パス

ライティングがどのように適用されるか,およびシェーダのどの Passes が使用されるかは,どの Rendering Path が使用されるかで決まります。 シェーダ内の各パスは,Pass Tags を介して,そのライティング タイプと通信します。

  • Deferred Lighting では,PrepassBase and PrepassFinal パスが使用されます。
  • Forward Rendering では,ForwardBase and ForwardAdd パスが使用されます。
  • Vertex Lit では,Vertex, VertexLMRGBM and VertexLM パスが使用されます。
  • 上のどの場合でも, Shadows をレンダリングするために, ShadowCasterShadowCollector パスが使われます。

遅延ライティング パス

PrepassBase パスは,法線およびスペキュラ指数をレンダリングします。PrepassFinal パスは,テクスチャ,ライティングおよび放出マテリアル プロパティを結合することで最終的な色をレンダリングします。 通常のシーン内のライティングはすべて,シーン空間で個別に行われます。 詳細については,Deferred Lighting を参照してください。

フォワード レンダリング パス

ForwardBase パスは,周囲,ライトマップ,メインのディレクショナル ライトおよび重要でない (頂点/SH) ライトを一度にレンダリングします。 ForwardAdd パスは,追加の頂点ごとのライトに使用されます。このようなライトによって照らされるオブジェクトごとに 1 回の呼び出しが行われます。 詳細については,Forward Rendering を参照してください。

もしフォワードレンダリングが使われるならば,シェーダーはforward-suitableパス( ForwardBaseForwardAdd のどちらも)を持ちませんが,そのオブジェクトは頂点リットパスでレンダリングされます。詳しくは下の項目を見て下さい。

頂点リット レンダリング パス細部

頂点ライティングは,プログラム可能なシェーダをサポートしていないプラットフォームで頻繁に使用されるため,Unity は,ライトマップ使用時対未使用時の場合を処理するために内部で複数のシェーダ順列を作成できます。 そのため,ライトマップ使用時対未使用オブジェクトを処理するため,複数のパスを明示的に記述する必要があります。

  • Vertex パスは,ライトマップが使用されていないオブジェクトに使用されます。 すべてのライトは,固定関数 OpenGL/Direct3D ライティング モデル (Blinn-Phong) を使用して,一度にレンダリングされます。
  • VertexLMRGBM パスは,ライトマップが RGBM 符号化される場合に,ライトマップ使用オブジェクトに使用されます (これは,ほとんどのデスクトップおよびコンソールで行われます)。 リアルタイム ライティングは適用されません。パスはテクスチャとライトマップの結合に使用されます。
  • VertexLMM パスは,ライトマップが 2 重 LDR 符号化される場合に,ライトマップ使用オブジェクトに使用されます (これは,携帯機器および古いデスクトップで行われます)。 リアルタイム ライティングは適用されません。パスはテクスチャとライトマップの結合に使用されます。
詳細な ShaderLab トピック
シェーダを書く場合のパフォーマンスのヒント