UnityでのDeferredRendering性能比較と解説

概要

3DCGの資料で「Forward Rendering」「Deferred Rendering」って見かけますよね

なにやらDeferred Renderingだと処理が軽くなるらしい

本当に軽くなるのか、軽くなるケースはどういう場合なのか

気になったのでUnityで性能比較を行いつつ処理の違いをまとめました

著者

  • Qiita: tsune2ne
  • 5年ほどサーバエンジニア + 2年ほどUnity+サーバをしてました
  • ここ数年はパイプライン見たり環境構築したりしてます

サンプル1

用意したマップ マップ全体像_昼

Blenderの勉強も兼ねて自分で作りました

  • Terrainの機能で木と草を設定
  • 木と草はLOD設定してるので離れるほど低ポリゴンになる
  • ビルディングはこちらの動画を元に作成させていただきました
  • ライトはDirectional Light1つ

カメラ視点

カメラ視点_昼

では早速カメラをForward/Deferredに切り替えてStatisticsの値を比べてみましょう

HowToChangeRendering

これで爆速になるに違いない

勝ったなガハハ

Statistics結果

Forward Rendering Deferred Rendering
昼のビル_ForwardRendering 昼のビル_DeferredRendering

変化がない!!!!

それはそう

なぜならDeferred Renderingの強みを活かせてないから

本命は次!

サンプル2

マップ全景 マップ全体像_夜

  • 基本的にはサンプル1と同じ
  • Directional Lightを暗くして夜シーンに変更
  • 街灯にPoint Lightを計4つ追加

カメラ視点 カメラ画像_夜

この状態でForward/Deferredの違いを見てみましょう

Forward Rendering結果 Deferred Rendering結果
夜のビル_ForwardRendering 夜のビル_DeferredRendering

ぜんぜん違う!!!!

SetPass callsの変化

Forward Deferred
サンプル1 281 284
サンプル2(Point Light 4つ追加) 3253 712

SetPass callsがForwardだと10倍以上増えてるのに、Deferredだと2倍程度で抑えています

FPSは本来60%Downのところを30%Downで止めてます (これはマシンスペックによって変わると思います

なぜこれほど差分がでるのか、これから解説していきます

技術解説

Forward Renderingのライティング

以下はForward Renderingを簡易的にフロー化しました ForwardRenderingフロー図

ライティングでは以下の計算を行います

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

この処理をライトの数だけ行うので効率が悪くなっています

Deferred Renderingのライティング

以下はDeferred Renderingを簡易的にフロー化しました DeferredRenderingフロー図

ラスタライズ後にジオメトリ情報をG-Bufferにキャッシュ

G-Bufferを元にライティングする考えがDeferred(遅延) Rendering

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

ライトが増えてもG-Bufferを元にライティングするだけで済むので効率がいいのがわかります

Deferred Renderingの苦手なこと

  • 半透明のオブジェクトを処理できない
    • G-BufferにAlpha情報を保持できない。保持しようと思うとメモリが必要になる
    • 代わりに部分的にForward Renderingを使うのがよい
  • Directional Light1つだけならForward Renderingより性能が落ちる?
    • G-Bufferに各種情報を書き込んでからライティングしてるため、若干性能が落ちます。
  • Unityでは平行投影でのDeferred Renderingはサポートされてない
    • 理由不明
    • UIで複数光源使うことを想定してないから?
  • G-Bufferを確保するため一定のメモリを必要とする
    • 携帯端末では不利
    • Tiled-Base Deferred Renderなど省メモリな手法が考案されています

Deferred Renderingの得意なこと

  • ライティングが変化するマップ・被写体
  • 範囲が限定された光源を複数おく場合

夜の街を歩く場合はとくに効果が大きそうです

まとめ

ライトが複数あり、複雑なオブジェクトがライト範囲にある場合、

Deferred Renderingがかなり優位に働くことがわかりました

計測値を比較・検証したことで具体的に描画負荷を抑えれるケースを知れたので実践でも使えそうです

参考文献

ビルディングはこちらの動画を元に作成させていただきました

このブログについて

KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。

関連記事

このブログについて

KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。