Version: 2021.1
フォワードレンダリングパス
古いディファードレンダリングパス

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

このページでは、Unity のビルトインレンダーパイプラインのディファードシェーディングレンダリングパスについて説明します。ディファードシェーディングの基本的な技術概要については、ウィキペディア: 遅延シェーディング (ディファードシェーディング)を参照してください。

概要

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

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

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

要件

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

モバイルでは、ディファードシェーディングは、最低 OpenGL ES 3.0 を実行するすべてのデバイスでサポートされます。

注意: ディファードレンダリングは、平行投影ではサポートされないため、設定されている場合は、カメラは常にフォワードレンダリングを使用します。

パフォーマンス考慮点

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

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

実装に関する詳細

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

The default layout of the render targets (RT0 - RT4) in the G-buffer is listed below. Data types are placed in the various channels of each render target. The channels used are shown in parentheses.

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

So the default G-buffer layout is 160 bits/pixel (non-HDR) or 192 bits/pixel (HDR).

混合ライティングに Shadowmask (シャドウマスク) または Distance Shadowmask (距離シャドウマスク) モードを使用する場合は、5 番目のターゲットを使用します。

  • RT4、ARGB32 フォーマット: ライトオクルージョン値 (RGBA)

And thus the G-buffer layout is 192 bits/pixel (non-HDR) or 224 bits/pixel (HDR).

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

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

G バッファパス

The G-buffer pass renders each GameObject once. Diffuse and specular colors, surface smoothness, world space normal, and emission+ambient+reflections+lightmaps are rendered into G-buffer textures. The G-buffer textures are setup as global shader properties for later access by shaders (CameraGBufferTexture0 .. CameraGBufferTexture3 names).

ライティングパス

The lighting pass computes lighting based on G-buffer and depth. Lighting is computed in screen space, so the time it takes to process is independent of Scene complexity. Lighting is added to the emission buffer.

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

ライトの影が有効化されている場合、それらもこのパスでレンダリングされ適用されます。影をレンダリングするのにも負荷がかかります。シャドウキャスター (影の投影元) もレンダリングされる必要があり、より複雑なライトシェーダーも適用される必要があります。

使用できる唯一のライティングモデルは Standard (標準) です。別のモデルを使用したい場合は、ビルトインシェーダー変数 の Internal-DeferredShading.shader ファイルの修正バージョンを、Assets フォルダーの Resources という名前のフォルダーに配置して、ライティングパスシェーダーを変更できます。次に Graphics (グラフィックス) 設定を開きます (Edit > Project Settings を選択し、Graphics カテゴリをクリック) “Deferred” (ディファード) ドロップダウンを “Custom Shader” (カスタムシェーダー) に変更します)。次に、使用しているシェーダーに表示されるシェーダーオプションを変更します。


  • 2017–06–08 Page published

  • Light Modes (ShadowmaskDistance Shadowmask) 5.6 に追加

フォワードレンダリングパス
古いディファードレンダリングパス