Skip to content
Go back

GPU-Driven Rendering Pipelines

· Updated:

url

拙訳

GPU駆動レンダリングとは?(GPU-Driven Rendering?)

  • GPUが実際にレンダリングするものを制御する
  • “シーンを描画する”GPUコマンド
    • N個のビューポート/錐台
    • GPUが(サブ)オブジェクトの可視性を決定する
    • CPU/GPUを往復roundtripしなくて良い
  • 先行研究[Shopf et al. 2008Shopf, J., Barczak, J., Oat, C. and Tatarchuk, N. 2008. March of the Froblins: simulation and rendering massive crowds of intelligent and detailed creatures on GPU. ACM SIGGRAPH 2008 games 52–101. 10.1145/1404435.1404439. https://www.chrisoat.com/papers/Oat-Tatarchuk-Froblins-Siggraph2008.pdf.]

動機(RedLynx)(Motivation (RedLynx))

  • インゲームレベルエディタを用いたモジュラー構造
  • 大きな描画距離。小さなオブジェクトから作られる背景
  • 焼き込みライティングなし。シャドウマップからの大量のドローコール
  • CPUは物理シミュレーションやビジュアルスクリプティングで使われる

動機 Assassin’s Creed Unity(Motivation Assassin’s Creed Unity)

  • 大規模なジオメトリ量: 建築物
  • 大規模なジオメトリ量: シームレスな内装
  • 大規模なジオメトリ量: 群衆
  • モジュラー構造(部分的に自動化されている)
  • 前のAssassin’s Creedと比べて約10倍のインスタンス
  • コンソールでは、CPUは最も乏しいscarcestリソースである

メッシュクラスタレンダリング(Mesh Cluster Rendering)

  • 固定トポロジー(64頂点ストリップ)
  • 固定トポロジーに合わせるためにすべてのメッシュを分割して組み替える(縮退したdegenerateトライアングルを挿入する)
  • 頂点シェーダでは共有バッファから頂点を手動でフェッチする[Riccio and Lilley 2013Riccio, C. and Lilley, S. 2013. Introducing the Programmable Vertex Pulling Rendering Pipeline. GPU Pro 4 21--37.]
  • DrawInstancedIndirect
  • GPUカリングはクラスタリストとドローコール引数を出力する

メッシュクラスタレンダリング(ACU)(Mesh Cluster Rendering (ACU))

  • トライアングルストリップでの問題
    • 縮退したトライアングルによりメモリが増加する
    • 非決定的なクラスタ順序
  • MultiDrawIndexedInstancedIndirect
    • インスタンスあたりひとつの(サブ)ドローコール
    • クラスタあたり64トライアングル
    • 実行中on the flyにインデックスバッファを追加する必要がある

レンダリングパイプラインの概要(Rendering Pipeline Overview)

  • 粗い錐台カリング
  • バッチハッシュを構築。インスタンスのGPUデータを更新
  • ドローコールをバッチ処理
  • インスタンスカリング(錐台/オクルージョン)
  • クラスタチャンク拡張expansion
  • クラスタカリング(錐台/オクルージョン/トライアングル背面)
  • インデックスバッファのコンパクション
  • マルチドロー
  • CPU四分木カリング
  • インスタンス毎データ
    • 例: 変換、LODファクタ、など
    • GPUのリングバッファで更新される
    • 静的なインスタンスに対しては永続的persistent
  • ドローコールハッシュはインスタンス化しないデータで構築する
    • 例: マテリアル、レンダステート、など
  • ドローコールはハッシュに基づいてマージされる

静的トライアングル背面カリング(Static Triangle Backface Culling)

  • クラスタ中心にあるキューブマップのピクセル錐台に対してトライアングルの可視性を焼き込む
  • キューブマップのルックアップはカメラに基づく
  • クラスタ内のすべてのトライアングルの可視性に対する64ビットをフェッチする
  • キューブマップ面あたり1ピクセルのみ(トライアングルあたり6ビット)
  • ピクセル錐台はカリングの効率を上げるために一定の距離で打ち切る(直角でない角度oblique angleで偽陽性になり得る)
  • 10-30%のトライアングルがカリングされる

オクルージョン深度生成(Occlusion Depth Generation)

  • 最適な遮蔽物occluderでの深度プリパス
  • High-ZやEarly-Zのためにフル解像度でレンダリングする
  • 512x256へダウンサンプリングする
  • 最後のフレームの深度を再投影して組み合わせる
  • GPUカリングのための深度階層
  • 300個の最適な遮蔽物(約600us)
  • High-ZやEarly-Zのためにフル解像度でレンダリングする
  • 512x256へダウンサンプリングする(100us)
  • 最後のフレームの深度を再投影して組み合わせる(50us)
  • GPUカリングのための深度階層(50us)

(*PS4のパフォーマンス)

シャドウオクルージョン深度生成(Shadow Occlusion Depth Generation)

  • カスケードごと
  • カメラ深度の再投影(約70us)
  • 最後のフレームの深度の再投影で組み合わせる(10us)
  • GPUカリングのための深度階層(30us)

カメラ深度生成(Camera Depth Generation)

  • [Silvennoinen 2012Silvennoinen, A. 2012. Chasing Shadows. Game Developer Magazine 19, 2, 49--53. https://media.gdcvault.com/GD_Mag_Archives/GDM_February_2012.pdf.]と似たようなもの
  • ただし、フォグのせいでマスクが効率的でない
    • 最小深度を使えない
    • far面を除外できない
  • 64x64のピクセル再投影
  • 冗長なオーバードローを取り除くために深度をプリプロセスすることができるかも

結果(Results)

  • CPU
    • 1-2桁少ないドローコール
    • 10倍のオブジェクトで、前のACの最大75%
  • GPU
    • 20-40%のトライアングルがカリングされる(背面+クラスタ境界)
    • 全体として見れば効果gainはほんの僅か: ジオメトリレンダリングの10%以下
    • 30-80%のシャドウトライアングルがカリングされる
  • 作業中
    • 静的なオブジェクトに対する更なるGPU駆動
    • 更なるバッチフレンドリーなデータ

将来(Future)

  • バインドレステクスチャ
  • GPU駆動 vs. DX12/Vulkan

RedLynxの話題(RedLynx Topics)

仮想テクスチャリング(Virtual Texturing)

  • キーアイデア: メモリ内に可視テクスチャデータのみを維持する[Hall 1999Hall, C. 1999. Virtual Textures Texture Management in Silicon. SIGGRAPH Eurographics 1999 Hardware Workshop in Computer Graphics. https://www.graphicshardware.org/previous/www_1999/presentations/v-textures/index.htm.]
  • 仮想的な256Kx256Kのテクスチャアトラス
  • 128x128テクセルページ
  • 8Kx8Kのテクスチャページキャッシュ
    • スライス5つのテクスチャ配列: アルベド、スペキュラ、ラフネス、法線、など
    • DXT圧縮(BC5/BC3)

VT付きGPU駆動レンダリング(GPU-Driven Rendering with VT)

  • 仮想テクスチャリングは我々のレンダラとAC: Unityのレンダラとで最も大きく違うところ
  • 重要な機能: すべてのテクスチャデータは、単一のテクスチャバインディングを用いることで、同時に使うことができる
  • テクスチャでバッチする必要はない!

単一ドローコールレンダリング(Single Draw Call Rendering)

  • ビューポート=単一のドローコール(x2)
  • それぞれの頂点アニメーションタイプに対する動的バッチ処理
    • 近年のGPUでは高速(+2%のコスト)
  • クラスタ深度ソートは深度プリパスに似たゲインをもたらす
  • 逆順ソート付きの安価なOIT

追加のVTの長所(Additional VT Advantages)

  • 複合マテリアルブレンドやデカールレンダリング結果はVTページキャッシュへ格納される
  • データを再利用することで数百フレームかけてコストを償却する
  • テクスチャ解像度やアセット数に関係なく、一定のメモリフットプリント

仮想ディファードテクスチャリング(Virtual Deferred Textureing)

  • 古いアイデア: テクセルの代わりにUVをGバッファに格納する[Aufderheide 2007Aufderheide, M. 2007. Deferred Texture mapping?. gamedev.net. https://www.gamedev.net/forums/topic/471781-deferred-texture-mapping/.]
  • 重要な機能: VTページキャッシュアトラスは現時点で可視であるすべてのテクスチャデータを含む
  • 8Kx8Kのテクスチャアトラスへの16+16ビットUVは8x8のサブピクセルフィルタリング精度をもたらす

勾配と接線フレーム(Gradients and Tangent Frame)

  • スクリーン空間でピクセル勾配を計算する。UV距離は近傍を特定するために使われる
  • 近傍が見つからない→バイリニア
  • 接線フレームは32ビットクォータニオンとして格納される[Frykholm 2009Frykholm, N. 2009. The BitSquid low level animation system. BitSquid blog. https://bitsquid.blogspot.com/2009/11/bitsquid-low-level-animation-system.html.]
  • VT.Page = UV.xy / 128から暗黙的なMIPとマテリアルID

要約&長所(Recap & Advantages)

  • 64ビット。フルフィルレート。MRTなし
  • オーバードローは格別に安価dirty cheap
    • テクスチャリングはライティングのコンピュートシェーダまで遅らされる
  • クアッド効率はそれほど重要ではない
  • 仮想テクスチャリングのページIDパスはもう必要ない

勾配再構築の品質(Gradient reconstruction quality)

MSAAトリック(MSAA Trick)

  • 重要な所見: UVと接線は補間できる
  • アイデア: ordered grid方式の4xMSAAパターンを使って1/2解像度(540p)でシーンをレンダリングする
  • ライティングのコンピュートシェーダで各サンプルを別々に読むためにTexture2DMS.Load(...)を使う
P1=A+14AB+14ACP2=B+14BA+14BDP3=C+14CA+14CDP4=D+14DC+14DB\begin{gather} P_1 = A + \frac{1}{4} \vec{AB} + \frac{1}{4} \vec{AC} \\ P_2 = B + \frac{1}{4} \vec{BA} + \frac{1}{4} \vec{BD} \\ P_3 = C + \frac{1}{4} \vec{CA} + \frac{1}{4} \vec{CD} \\ P_4 = D + \frac{1}{4} \vec{DC} + \frac{1}{4} \vec{DB} \end{gather}

1080p再構築(1080p Reconstruction)

  • 1080pをLDSに再構築する
  • エッジピクセルは完璧に再構築される。MSAAは両側both sidesに対してピクセルシェーダを実行する
  • 内側のピクセルのUVと接線を補間する
  • クオリティは素晴らしいexcellent。差異は見つけにくいhard to spot

8xMSAAトリックのベンチマーク(8xMSAA Trick Benchmark)

  • 128bppのGバッファ
  • ひとつのピクセルが”2xMSAAピクセル”の2x2タイルである
  • Xbox One: 1080p + MSAA + 60fps :)
2xMSAAMSAAトリック削減率
Gバッファレンダリング時間3.03ms2.06ms-32%
ピクセルシェーダのwave8301636969-55%
DRAMメモリトラフィック76.3MB60.9MB-20%
ESRAM(18MB partial)15.0MB29.1MB

二段階オクルージョンカリング(Two-Phase Occlusion Culling)

  • ローポリのプロキシジオメトリを使う追加のオクルージョンパスはない
  • 正確なWYSIWYG1オクルージョン
  • 深度バッファデータに基づく
  • 深度ピラミッドはHTILE最大/最小バッファから生成される
  • O(1)O(1)のオクルージョンテスト(gather4)
  • 第1段階
    • 最後のフレームの深度ピラミッドを用いてオブジェクトとクラスタをカリングする
    • 可視オブジェクトをレンダリングする
  • 第2段階
    • 深度ピラミッドをリフレッシュする
    • カリングされたオブジェクトとクラスタをテストする
    • 誤ってカリングされたものfalse negativesをレンダリングする

ベンチマーク(Benchmark)

  • “Torture”の単体テストシーン
    • 250,000個の個別に動くオブジェクト
    • 1GBのメッシュデータ(10K超のメッシュ)
    • 8Kx8Kのテクスチャキャッシュアトラス
  • DirectX11コードパス
    • 64頂点クラスタ(ストリップ)
    • ExecuteIndirect/MultiDrawIndirectなし
  • DrawInstancedIndirectの呼び出しが2つだけ

ベンチマーク結果(Benchmark Results)

GPU時間第1段階第2段階合計
オブジェクトカリング0.28ms0.26ms0.54ms
クラスタカリング0.09ms0.04ms0.13ms
描画(Gバッファ)1.60ms0.01ms以下1.60ms
ピラミッド生成0.06ms
合計2.3ms

: Xbox One、1080p

CPU時間: 0.2ms (JaguarのシングルCPUコア)

仮想シャドウマッピング(Virtual Shadow Mapping)

  • 128Kx128Kの仮想テクスチャマップ
  • 256x256のテクセルページ
  • Zバッファから必要なシャドウページを特定する[Fernando et al. 2001Fernando, R., Fernandez, S., Bala, K. and Greenberg, D. P. 2001. Adaptive shadow maps. Proceedings of the 28th annual conference on computer graphics and interactive techniques 387–390. 10.1145/383259.383302. https://www.cs.cornell.edu/~kb/publications/ASM.pdf.]
  • GPU駆動パイプラインでシャドウページをカリングする
  • 一度にすべてのページをレンダリングする

VTSMのクオリティとパフォーマンス(VTSM Quality and Performance)

  • すべてのエリアでshadow-to-screen解像度が1対1に近い
  • 計測結果: 複合的な”まばらなsparse”シーンでは、SDSM[Lauritzen 2010Lauritzen, A. 2010. Sample Distribution Shadow Maps. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://advances.realtimerendering.com/s2010/index.html.]より最大3.5倍速い
  • 単純なシーンでは、仮想SMはSDSMやCSMより若干遅い

GPU駆動レンダリング+DX12(GPU-Driven Rendering + DX12)

  • 新しいDX12(PC)の機能
    • ExecuteIndirect
    • 非同期コンピュート
    • 頂点シェーダのレンダターゲット・インデックス(ジオメトリシェーダのバイパス)
    • リソース管理
    • 明示的なマルチアダプタ
    • タイルリソース+バインドレス
    • 保守的ラスタライザ+ROV
  • 他のAPIの機能
    • カスタムMSAAパターン
    • GPU側でのディスパッチ
    • SIMDレーンswizzle
    • 順序付きアトミック
    • ピクセルシェーダへのSV_Barycentric
    • 開示されたCSAA/EQAAサンプル
    • テンプレート付きシェーディング言語

Footnotes

  1. 訳注:WYSIWYG = What You See Is What You Get; 見たままが得られる。