遅延レンダリング

提供: MonoBook
Deferred Renderingから転送)
ナビゲーションに移動 検索に移動

遅延レンダリング英語:Deferred Rendering)とは、3DCGにおいて、物体の描画とライティングを別々に行う技法である。こいつの登場により従来型のレンダリングは「フォワードレンダリング」と呼ばれるようになった。

利点[編集 | ソースを編集]

ドローコールの削減[編集 | ソースを編集]

遅延レンダリングではシーンの中にポイントライトなどを多数配置してもドローコールがあまり増えないという特徴がある。

フォワードレンダリングでのドローコール数は以下のようなモデルとライトの掛け算である。

ドローコール数 = モデル数 x ライト数

一方、遅延レンダリングでは以下のような感じになる。ちなみに「x3」の部分はマルチプルレンダーターゲットを利用すれば「x1」にすることができる。

ドローコール数 = 初期化x3 + モデル数x3 + ライト数 + 結合処理

太陽光など平行光源が1個しかない状況ではフォワードレンダリングの方が有利だが、街灯などのポイントライトが何個もある状況では遅延レンダリングの方が有利である。

モデル数 ライト数 ドローコール数 備考
フォワード デファード デファード+MRT
1 1 1 8 4
10 1 10 35 13 ライトが少ないときはフォワードレンダリングが有利
10 2 20 36 14 MRTありが逆転
10 4 40 38 16 MRTなしも逆転
10 8 80 42 20
10 16 160 50 28
10 32 320 66 44
10 64 640 98 76


2000年代中頃あたりに夜中に作戦行動する右下から銃の生えたゲームで大流行した。遅延レンダリングといえばだいたい「夜」である。

欠点[編集 | ソースを編集]

MSAAが使えない[編集 | ソースを編集]

遅延レンダリングでのライティング処理は「2D画像処理」であり、その時点で「ポリゴンのエッジの情報」は喪失している。このため「ポリゴンのエッジの情報」を用いてアンチエイリアシングを行うMSAAは使えない。

フォトショップなんかにある「エッジ抽出」をリアルタイムに行い、強引にアンチエイリアシングするという手法もあるが絶望的に効率が悪い。そのような状況下で少しでも性能を向上させようと、MLAAFXAATXAASRAADSAAポストMSAAなど様々な手法が考案されている。

メモリ使用量が多い[編集 | ソースを編集]

遅延レンダリングではざっくりフォワードレンダリングの4倍のメモリが必要になる。

実装によっても異なるが、だいたい以下のような構成のスクリーンサイズのレンダーターゲットが必要になる。

  • Gバッファ
    • Color
    • Normal
    • Depth
  • Lighting処理用バッファ

遅延レンダリングが流行りだしたころのパソコンゲーム機は「メインメモリ256MBのVRAM32MB」などであったため結構悩ましい問題であった。最近ではパソコンどころかスマホでさえもアホみたいにメモリを積んでいるので問題になることはまずない。

手順[編集 | ソースを編集]

1. Clear GBuffer[編集 | ソースを編集]

Color, Normal, Depthなどからなる「GBuffer」を初期化する。

2. Draw GBuffer[編集 | ソースを編集]

GBufferに描画する。この時点ではまだライティングは行わない。描画時にライティングを行わないから「遅延レンダリング」という。

3. Lighting[編集 | ソースを編集]

GBufferと各種ライトを掛け合わせて「ライティング結果」を生成する。

4. Combine[編集 | ソースを編集]

GBufferとライティング結果を合成して最終的な絵が完成する。

関連項目[編集 | ソースを編集]