レンダリングパイプラインについての詳細
Forward Rendering パスの詳細

Deferred Shading レンダリングパス

このページでは、Deferred Shading レンダリングパス を詳しく説明します。技術的な概要の紹介については the wikipedia page を参照してください。

概要

Deferred Shading を使用する場合、オブジェクトに影響を与えることができる光の数に制限はありません。すべての光は、それらがすべて等法マップ等と正しく相互作用することを意味し、ピクセルごとにに評価されます。さらに、すべての光は、クッキーとシャドウを持つことができます。

Deferred shading は、ライティングの処理のオーバーヘッドは光が照らすピクセルの数に比例するという利点があります。これはどれくらいのオブジェクトを照らすかに関係なく、シーンの中で光のボリュームのサイズによって決定されます。したがって、パフォーマンスは、明りを小さくしておくことによって向上することができます。Deferred shading も非常に一貫性のある予測可能な動作をします。おのおのの光のエフェクトは、ピクセルごとに計算されるので、大きな三角形で失敗するライティングの計算はありません。

不利な面は、deferred shading は、アンチエイリアシングのための実際のサポートがなく、半透明のオブジェクトを処理することはできないことです(これらは、Forward レンダリングを使用してレンダリングされます)。Mesh Renderer の Receive Shadows フラグはサポートがありません。カリングマスクは限られた方法でサポートされているだけです。カリングマスクを4つまで使用できます。つまり、カリングレイヤーマスクは、少なくとも、すべてのレイヤー数から4を引いた数を含まなければなりません。よって、32レイヤーなら28を設定しなければなりません。そうしないと、グラフィカルなアーティファクトを得ることになります。

要件

デプス レンダーテクスチャのサポートに複数のレンダーターゲット(MRT)、Shader Model 3.0 (もしくはそれ以降)によるグラフィックカードと 2面ステンシルバッファが必要です。2006年以降に作られたほとんどの PC グラフィックカードは、GeForce 8xx 以降、Radeon X2400 以降、 そして Intel G45+ 以降のものなども含め deferred lighting をサポートしています。 (マルチレンダリングターゲットをサポートするいくつかの GPU は、まだ非常に限られたビット数のみサポートしています)

注意: Deferred レンダリングは、Orthographic プロジェクションを使用している場合はサポートされません。カメラのプロジェクション モードが Orthographic に設定されている場合は、その値は上書きされカメラは常に Forward rendering を使用します。

パフォーマンス考慮点

deferred shading でリアルタイムライトのレンダリングのオーバーヘッドは、光により照射される画素数に比例し、シーンの複雑さには依存 しません 。だから、小さな点やスポットライトをレンダリングするのは非常に安価であり、それらが完全か部分的にシーンオブジェクトによって閉ざされている場合、さらに安価になっています。

もちろん、シャドウのない光よりもシャドウのある光がはるかに高価です。deferred shading では、shadow-casting オブジェクトは、まだ 各 shadow-casting light に一度以上、レンダリングする必要があります。また、シャドウを適用する lighting シェーダーは、シャドウが無効になっているときに使用したものよりもレンダリングのオーバーヘッドが高くなっています。

実装に関する詳細

Deferred Shading を使用する場合、Unity でのレンダリングプロセスは2つのパスで行われます。

  1. G-buffer Pass: オブジェクトは、diffuse color、specular color、smoothness、 world space normal、emission および depth とスクリーンスペースバッファを生成するためにレンダリングされます。
  2. Lighting pass: 以前に生成されたバッファは、エミッションバッファにライティングを追加するために使用されます。

このプロセスが完了した後、deferred shading を扱うことができないシェーダーを持つオブジェクトは、Forward Rendering パスを使用してレンダリングされます。

デフォルトの g-buffer レイアウトは次のとおりです。

  • RT0, ARGB32 フォーマット: Diffuse color (RGB), occlusion (A)
  • RT1, ARGB32 フォーマット: Specular color (RGB), roughness (A).
  • RT2, ARGB2101010 フォーマット: World space normal (RGB), unused (A).
  • RT3, ARGB2101010 (non-HDR) または ARGBHalf (HDR) フォーマット: Emission + lighting + lightmaps + reflection probes buffer.
  • Depth+Stencil バッファ.

だから、デフォルト g-buffer レイアウトは、160ビット/ピクセル (non-HDR) または、192ビット/ピクセル(HDR)があります。

カメラが HDR を使っていないとき、Emission とライティングバッファ(RT3)は、ARGB32 テクスチャで通常可能であるよりも大きなダイナミックレンジを提供するために対数的にコード化されます。

カメラが HDR レンダリングを使用しているとき、Emission + lighting バッファ (RT3) 向けに作成している別の Render Target がないことにご注意ください。代わって、カメラがレンダリングする(例:画像効果にパスされるもの)Render Target は、RT3 として利用されます。

G-Buffer パス

G-buffer パスは、それぞれのオブジェクトを一度レンダリングします。Diffuse colors、specular colors、surface smoothness、world space normal と emission+ambient+reflections+lightmaps は、G-buffer テクスチャにレンダリングされています。G-buffer テクスチャはシェーダーにより、後のアクセスのためにグローバルシェーダーのプロパティーとして設定されています(CameraGBufferTexture0 .. CameraGBufferTexture3 names)。

Lighting パス

Lighting パスは、G-buffer やデプスに基づいて照明を計算します。Lighting は、スクリーンスペースで計算するので、それを処理すために要する時間は、シーンの複雑さとは無関係です。Lighting は emission バッファに加えられます。

カメラのニアクリップに交差しないポイントライトやスポットライトは3D 図形としてレンダリングされ、シーンに対する Z バッファテストが有効化されます。これにより一部あるいは全体がオクルージョンされたポイントライトやスポットライトはレンダリングが非常に安価です。ニアクリッププレーンを交差しない Directional Light(指向性ライト)およびポイントライト・スポットライトはフルスクリーンの四角形としてレンダリングされます。

ライトの影が有効化されている場合、それらもレンダリングされパスに適用されます。影は“タダ”でないことに注意してください、shadow caster(影の投影)もレンダリングする必要があり、より複雑なライトシェーダーも適用する必要があります。

Lighting モデルだけが利用可能なのが標準です。異なるモデルを望む場合、“Assets” フォルダー内の “Resources” という名前のフォルダーの中の Built-in shaders から、Internal-DeferredShading.shader ファイルの修正バージョンを配置することにより、照明パスシェーダーを変更することができます。そして、Edit->Project Settings->Graphics のメニューから Graphics ウィンドウを開き、“Deferred” のドロップダウン リストから “Custom Shader” を選択します。表示されたフィールドに使用するシェーダーを格納することで変更作業は完了になります。

レンダリングパイプラインについての詳細
Forward Rendering パスの詳細