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

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

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

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

レンダリングパス

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

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

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

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

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

Deferred Shading パス

遅延( Deferred ) パスは、ライティングに必要なすべての情報(ビルトイン・シェーダーの場合、diffuse color、specular color、smoothness、world space normal、emission )をレンダリングします。 また、emission チャンネルに、ライトマップ、反射プローブ( reflection probes )、アンビエントライティング( ambient lighting )が追加されます。詳細は Deferred Shadingを参照してください。

旧 Deferred Lighting パス

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

旧 Vertex Lit Rendering パス

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

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

参照

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