「遅延レンダリング」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「'''遅延レンダリング'''(英語:Deferred Rendering)とは、3DCGにおいて、物体の描画とライティングを別々に行う技法である…」)
 
 
(同じ利用者による、間の16版が非表示)
1行目: 1行目:
 
'''遅延レンダリング'''([[英語]]:Deferred Rendering)とは、[[3DCG]]において、物体の描画とライティングを別々に行う技法である。こいつの登場により従来型のレンダリングは「[[フォワードレンダリング]]」と呼ばれるようになった。
 
'''遅延レンダリング'''([[英語]]:Deferred Rendering)とは、[[3DCG]]において、物体の描画とライティングを別々に行う技法である。こいつの登場により従来型のレンダリングは「[[フォワードレンダリング]]」と呼ばれるようになった。
  
== 概要 ==
+
== 利点 ==
遅延レンダリングではシーンの中に[[ポイントライト]]などを多数配置しても[[ドローコール]]が増えないという特徴がある。
+
=== ドローコールの削減 ===
 +
遅延レンダリングではシーンの中に[[ポイントライト]]などを多数配置しても[[ドローコール]]があまり増えないという特徴がある。
  
 
[[フォワードレンダリング]]での[[ドローコール]]数は以下のようなモデルとライトの掛け算である。
 
[[フォワードレンダリング]]での[[ドローコール]]数は以下のようなモデルとライトの掛け算である。
 
  ドローコール数 = モデル数 x ライト数
 
  ドローコール数 = モデル数 x ライト数
  
一方、遅延レンダリングでは以下のような感じになる。
+
一方、シンプルな遅延レンダリングでは以下のような感じになる。
  ドローコール数 = 初期化x3 + モデル数x3 + ライト数
+
  ドローコール数 = 初期化x3 + モデル数x3 + ライト数 + 結合処理
  
太陽光など[[平行光源]]が1個しかない状況では[[フォワードレンダリング]]の方が有利だが、
+
ちなみに「x3」の部分は[[マルチプルレンダーターゲット]]を利用すれば「x1」にすることができる。
街頭などの[[ポイントライト]]が何個もある状況では遅延レンダリングの方が有利である。
+
ドローコール数 = 初期化 + モデル数 + ライト数 + 結合処理
  
  
2000年代中頃あたりに夜中に作戦行動する[[右下から銃の生えたゲーム]]で大流行した。
+
太陽光など[[平行光源]]が1個しかない状況では[[フォワードレンダリング]]の方が圧倒的に有利だが、街灯などの[[ポイントライト]]が何個もある状況では遅延レンダリングの方が有利である。
 +
{| class="wikitable"
 +
|+
 +
! rowspan="2" |モデル数
 +
! rowspan="2" |ライト数
 +
! colspan="3" |ドローコール数
 +
! rowspan="2" |備考
 +
|-
 +
!フォワード
 +
!デファード
 +
!デファード+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
 +
|
 +
|}
  
== 手順 ==
 
  
=== 1. Clear GBuffer ===
+
この遅延レンダリングの特性から2000年代中頃あたりに「夜中に作戦行動する[[右下から銃の生えたゲーム]]」で大流行した。遅延レンダリングといえばだいたい「夜」である。採用例のほとんどが非常に暗いゲームばかりなので日本では人気がないものばかりです。
 +
 
 +
== 欠点 ==
 +
 
 +
=== MSAAが使えない ===
 +
遅延レンダリングでのライティング処理は「2D画像処理」であり、その時点で「[[ポリゴン]]のエッジの情報」は喪失している。このため「[[ポリゴン]]のエッジの情報」を用いて[[アンチエイリアシング]]を行う[[MSAA]]は使えない。
 +
 
 +
[[フォトショップ]]なんかにある「エッジ抽出」をリアルタイムに行い、強引に[[アンチエイリアシング]]するという手法もあるが絶望的に効率が悪い。そのような状況下で少しでも性能を向上させようと、[[MLAA]]、[[FXAA]]、[[TXAA]]、[[SRAA]]、[[DSAA]]、[[ポストMSAA]]など様々な手法が考案されている。
 +
 
 +
=== メモリ使用量が多い ===
 +
シンプルな遅延レンダリングの実装でもざっくり[[フォワードレンダリング]]の4倍の[[メモリ]]が必要になる。
 +
 
 +
実装によっても異なるが、だいたい以下のような構成のスクリーンサイズの[[レンダーターゲット]]が必要になる。
 +
* Gバッファ
 +
** Color
 +
** Normal
 +
** Depth
 +
* Lighting処理用バッファ
 +
 
 +
遅延レンダリングが流行りだしたころの[[パソコン]]や[[ゲーム機]]は「[[メインメモリ]]256MBの[[VRAM]]32MB」などであったため結構悩ましい問題であった。最近では[[パソコン]]どころか[[スマホ]]でさえもアホみたいに[[メモリ]]を積んでいるので問題になることはまずない。
 +
 
 +
=== メモリ帯域が必要 ===
 +
前述の遅延レンダリングではメモリ使用量が多い問題に関連して、遅延レンダリングではメモリに頻繁に読み書きするためメモリの速度が遅いとかなり残念な結果になります。
 +
 
 +
とくに[[スマートフォン]]では非常に低速な[[メインメモリ]]の一部を[[VRAM]]として利用するため問題になることが多いです。むしろまともに使える機種は無いと考えた方がいいです。
 +
 
 +
[[ローエンド]]や[[ミドルレンジ]]の[[スマートフォン]]や[[タブレット]]の[[コストカット]]はだいたい「カタログスペックに現れにくいメモリ帯域周り」と相場が決まっています。素人は「メモリ容量」しかみないからね。
 +
 
 +
==手順==
 +
 
 +
===1. Clear GBuffer===
 
Color, Normal, Depthなどからなる「GBuffer」を初期化する。
 
Color, Normal, Depthなどからなる「GBuffer」を初期化する。
  
=== 2. Draw GBuffer ===
+
===2. Draw GBuffer===
 
GBufferに描画する。この時点ではまだライティングは行わない。描画時にライティングを行わないから「遅延レンダリング」という。
 
GBufferに描画する。この時点ではまだライティングは行わない。描画時にライティングを行わないから「遅延レンダリング」という。
  
=== 3. Lighting ===
+
===3. Lighting===
 
GBufferと各種ライトを掛け合わせて「ライティング結果」を生成する。
 
GBufferと各種ライトを掛け合わせて「ライティング結果」を生成する。
  
=== 4. Combine ===
+
===4. Combine===
 
GBufferとライティング結果を合成して最終的な絵が完成する。
 
GBufferとライティング結果を合成して最終的な絵が完成する。
 +
 +
==関連項目==
 +
 +
*[[フォワードレンダリン]]
 +
*[[遅延レンダリング]]
 +
*[[ライトプレパス]]
 +
*[[MonoGameで遅延レンダリングをする]]
 +
 +
[[category: 3DCG]]

2023年9月12日 (火) 02:05時点における最新版

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

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

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

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

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

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

一方、シンプルな遅延レンダリングでは以下のような感じになる。

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

ちなみに「x3」の部分はマルチプルレンダーターゲットを利用すれば「x1」にすることができる。

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


太陽光など平行光源が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」などであったため結構悩ましい問題であった。最近ではパソコンどころかスマホでさえもアホみたいにメモリを積んでいるので問題になることはまずない。

メモリ帯域が必要[編集 | ソースを編集]

前述の遅延レンダリングではメモリ使用量が多い問題に関連して、遅延レンダリングではメモリに頻繁に読み書きするためメモリの速度が遅いとかなり残念な結果になります。

とくにスマートフォンでは非常に低速なメインメモリの一部をVRAMとして利用するため問題になることが多いです。むしろまともに使える機種は無いと考えた方がいいです。

ローエンドミドルレンジスマートフォンタブレットコストカットはだいたい「カタログスペックに現れにくいメモリ帯域周り」と相場が決まっています。素人は「メモリ容量」しかみないからね。

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

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

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

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

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

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

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

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

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

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