Version: 5.6
レンダリングパイプラインについての詳細
フォワードレンダリングパスの詳細

デファードシェーディングレンダリングパス

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

概要

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

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

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

要件

Multiple Render Targets (MRT)、Shader Model 3.0 (以降)、デプスレンダーテクスチャへのサポートを伴うグラフィックカードが必要です。2006年以降に作られた GeForce 8xxx、Radeon X2400、Intel G45 などをはじめとする、ほとんどの PC グラフィックスカードはデファードシェーディングをサポートします。

モバイルでは、たいてい MRT 形式が使用されているため、デファードシェーディングはサポートされません (複数のレンダリングターゲットをサポートする GPU のいくつかは、かなり制限されたビット数だけしかサポートしません)。

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

パフォーマンス考慮点

デファードシェーディングでは、リアルタイムライトのレンダリングのオーバーヘッドは、光が照らすピクセル数に比例し、シーンの複雑さには依存 しません 。そのため、小さな点やスポットライトをレンダリングするのは非常に安価であり、それらが全部、または、部分的にシーンのオブジェクトによっておおわれる場合、さらに安価になります。

もちろん、影のない光よりも影のある光がはるかに高価です。デファードシェーディングでは、影を投影するオブジェクトは、影を投影するライトごとに一回以上レンダリングされる必要があります。さらには、影を適用するラライティングシェーダーは、影を無効化した場合と比べレンダリングオーバーヘッドが大きくなります。

実装に関する詳細

デファードシェーディングをサポートしないシェーダーを持つオブジェクトは、デファードシェーディングが終了した後に フォワードレンダリング パスを使ってレンダリングされます。

ジオメトリバッファ(g-buffer) のレンダーターゲット (RT0 - RT4) のデフォルトレイアウトは、以下のとおりです。データタイプは各レンダーターゲットのさまざまなチャンネルに配置されます。括弧内に使用されるチャンネルを表示します。

  • RT0、ARGB32 フォーマット: ディフューズ色 (RGB)、オクルージョン (A)
  • RT1、ARGB32 フォーマット: スペキュラー色 (RGB)、粗さ (A)
  • RT2、ARGB2101010 フォーマット: ワールド空間法線 (RGB)、不使用 (A)
  • RT3、ARGB2101010 (非 HDR) または ARGBHalf (HDR) フォーマット: エミッション + ライティング + ライトマップ + リフレクションプローブバッファ
  • 深度 + ステンシルバッファ

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

混合ライティングに シャドウマスク または ディスタンスシャドウマスク モードを使用するとき、5 番目のターゲットを使用します。

  • RT4, ARGB32 形式: ライトオクルージョン値 (RGBA)

したがって、g-buffer レイアウトは、192ビット/ピクセル (非 HDR) または、224ビット/ピクセル(HDR)です。

ハードウェアが 5 つのレンダーターゲットを同時にサポートしない場合は、シャドウマスクを使用するオブジェクトはフォワードレンダリングパスにフォールバックします。 カメラが HDR を使っていないとき、エミッションとライティングバッファ (RT3) は対数的にコード化され、ARGB32 テクスチャで通常可能であるよりも大きなダイナミックレンジを提供します。

カメラが HDRレンダリングを使用するとき、エミッション + ライティングバッファ(RT3)のために別のレンダーターゲットは作成されません。代わりに、カメラがレンダリングするレンダーターゲットが RT3 として使用されます。

G バッファパス

G バッファパスは、それぞれのオブジェクトを 1 度レンダリングします。ディフューズ色、スペキュラー色、サーフェスのスムースネス 、ワールド空間法線と、エミッション + アンビエント + リフレクション + ライトマップは、G バッファテクスチャにレンダリングされています。G バッファテクスチャはシェーダーにより、後のアクセスのためにグローバルシェーダーのプロパティーとして設定されています( CameraGBufferTexture0 から CameraGBufferTexture3 )。

ライティングパス

ライティングパスは、G バッファや深度に基づいてライティングを計算します。ライティングは、スクリーンスペースで計算するので、それを処理するために要する時間は、シーンの複雑さとは無関係です。ライティングはエミッションバッファに加えられます。

カメラのニアクリッププレーンと交差しないポイントライトやスポットライトは、シーンに対する Z バッファのテストを有効にして、3D 形状としてレンダリングされます。これにより一部あるいは全体が塞がれたポイントライトやスポットライトのレンダリングの負荷は、非常に少なくなります。ニアクリッププレーンと交差するディレクショナルライト、ポイントライト、スポットライトはフルスクリーンの四角形としてレンダリングされます。

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

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


レンダリングパイプラインについての詳細
フォワードレンダリングパスの詳細