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

Deferred shading rendering path

This page details the deferred shading rendering path. See Wikipedia: deferred shading for an introductory technical overview.

Overview

When using deferred shading, there is no limit on the number of lights that can affect a GameObject. All lights are evaluated per-pixel, which means that they all interact correctly with normal maps, etc. Additionally, all lights can have cookies and shadows.

Deferred shading has the advantage that the processing overhead of lighting is proportional to the number of pixels the light shines on. This is determined by the size of the light volume in the Scene regardless of how many GameObjects it illuminates. Therefore, performance can be improved by keeping lights small. Deferred shading also has highly consistent and predictable behaviour. The effect of each light is computed per-pixel, so there are no lighting computations that break down on large triangles.

On the downside, deferred shading has no real support for anti-aliasing and can’t handle semi-transparent GameObjects (these are rendered using forward rendering). There is also no support for the Mesh Renderer’s Receive Shadows flag and culling masks are only supported in a limited way. You can only use up to four culling masks. That is, your culling layer mask must at least contain all layers minus four arbitrary layers, so 28 of the 32 layers must be set. Otherwise you get graphical artefacts.

要件

It requires a graphics card with Multiple Render Targets (MRT), Shader Model 3.0 (or later) and support for Depth render textures. Most PC graphics cards made after 2006 support deferred shading, starting with GeForce 8xxx, Radeon X2400, Intel G45.

On mobile, deferred shading is not supported, mostly due to MRT formats used (some GPUs which do support multiple render targets, still only support very limited bit counts).

Note: Deferred rendering is not supported when using Orthographic projection. If the Camera’s projection mode is set to Orthographic, the Camera falls back to Forward rendering.

Performance considerations

The rendering overhead of realtime lights in deferred shading is proportional to the number of pixels illuminated by the light and not dependent on Scene complexity. So small point or spot lights are very cheap to render and if they are fully or partially occluded by Scene GameObjects then they are even cheaper.

Of course, lights with shadows are much more expensive than lights without shadows. In deferred shading, shadow-casting GameObjects still need to be rendered once or more for each shadow-casting light. Furthermore, the lighting shader that applies shadows has a higher rendering overhead than the one used when shadows are disabled.

Implementation details

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

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

  • 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)があります。

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

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

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

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

カメラが HDRレンダリングを使用するとき、エミッション + ライティングバッファ(RT3)のために別のレンダーターゲットは作成されません。代わりに、カメラがレンダリングするレンダーターゲットが 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” を選択します。表示されたフィールドに使用するシェーダーを格納することで変更作業は完了になります。


  • 2017–06–08 Page published with no editorial review

  • Light Modes (ShadowmaskDistance Shadowmask) 5.6 に追加

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