2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Deferred Renderingの強み

Last updated at Posted at 2021-09-11

概要

Deferred Renderingを詳しくしりたい
ついでにUnityでサンプルを作って負荷比較しました

サンプル

とりあえず効果がわかりやすいケースでForwardとDeferredで比較します

Forward Rendering Deferred Rendering
WorldProject_Daily5_ForwardRendering.png WorldProject_Daily5_DefferedRendering.png

効果がない

それはそう。なぜならDeferred Renderingの強みを活かせてないから。
本命はこっち

Forward Rendering Deferred Rendering
WorldProject_Nightly6_ForwardRendering.png WorldProject_Nightly6_DeferredRendering.png

SetPassがForwardだと10倍以上増えてるのに、Deferredだと2倍ぐらいしか増えてない!
FPSには露骨な差がでてます

違いはDirectional Lightに追加して街灯に2個ずつ計4個のPoint Lightを設置しただけ

Deferred Renderingは複数の光源がある場合に負荷を大きく減らすことができます
(限定的な影響範囲の光源が多く、かつ近くに複雑なメッシュがあるとより効果が大きい)

技術解説

一般的なレンダリングでは
スクリーン座標変換 → ラスタライズ → ライティング → レンダリング結果
が行われる

Deferred Renderingで高速になるのは「ライティング」の処理

Forward Renderingのライティング

  1. オブジェクトのバウンティングボックスを元に影響のあるライトを探索
  2. オブジェクトの全ピクセルにライティング処理
  3. スクリーンスペースに変換してレンダリング

これには計算の無駄が多い
・ライト範囲外のピクセルにも計算してる
・スクリーンスペースに変換すると描写されないピクセルも計算してる

Deferred Renderingのライティング

ラスタライズ後にジオメトリ情報をG-Bufferにキャッシュ
G-Bufferを元にライティングする考えがDeferred(遅延) Rendering

  1. スクリーンスペース変換されたG-Bufferに位置・法線・色を書き込み
  2. ライト範囲内のピクセルのみライティング計算
  3. レンダリング

Forward Renderingと比べて効率的なのがわかる
しかもライトが多くライト範囲外のピクセルが多いほどキャッシュ利用頻度が高くなり効果が大きくなる

解説.png

Deferred Renderingの苦手なこと

  • 半透明のオブジェクトを処理できない
    • G-BufferにAlpha情報を保持できない。保持しようと思うとメモリが必要になる
    • 代わりにForward Renderringを使うのが一般的
  • ライトの数には強いけど距離が長いのは苦手?
    • 苦手というか強みが薄れる。Directional LightのみならForward Renderingと大差ない
  • Unityでは平行投影でのDeferred Renderingはサポートされてない
    • 理由不明
    • でも平行投影カメラで複数ライトが必要なケースが思いつかないしいいか

利用ケースの考察

・PBRでライティングが変わる想定でモデリング
・広めのマップ
・光源を複数おく
などのリッチな絵作りが必要なら試す価値がありそうです

夜の街を歩くマップなら効果が大きそう

サポート端末

Deferred RenderingにはMRT(Multi-Render-Target)が必須となる
MRT(Multi-Render-Target)とは一度のレンダリングパスで複数バッファに異なる値を同時出力する機能。
これがないとG-Bufferで位置・法線・色をバッファに書き込めず、ライティングを効率化できない。

ほとんどの PC グラフィックスカードはディファードシェーディングをサポート
モバイル:最低 OpenGL ES 3.0 を実行するすべてのデバイスでサポート

参考文献

↑レンダリング基礎をわかりやすく教えてもらえる。おすすめ度◎

↑Unity公式ドキュメント。Deferred Rendering自体はあまり説明してくれない。
あくまでUnityの実装について簡単に書いてるだけ

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?