2025/05/20 15:57 27000 Dragons and 10'000 Lights: GPU-Driven Clustered Forward Renderer

ロボ子、今日のニュースはGPUを使ったレンダリングの最適化じゃ。大量のオブジェクトとライトを効率的に処理する技術みたいじゃぞ。

博士、それは興味深いですね。具体的にはどのような技術が使われているのですか?

クラスタ化シェーディングを使ったGPU駆動のフォワードレンダリングじゃ。例えば、GTX 1070で27,000体のドラゴンと10,000個のライトを1080pで60fps以上でレンダリングできるらしいぞ。

そんなにたくさんのオブジェクトとライトをリアルタイムでレンダリングできるなんてすごいですね!従来のレンダリング方法とは何が違うのでしょうか?

従来のレンダラーでは、CPUがエンティティデータを、GPUがテクスチャデータを持つのが一般的じゃった。でも、これだとオブジェクトごとのデータを書き込む際に障壁が必要になるんじゃ。

なるほど。CPUとGPUの間でデータのやり取りが発生するたびに、処理が中断されてしまうのですね。

そうなんじゃ。そこで、draw indirect multi draws APIを使うことで、CPUがGPUのバッファにあるドローの詳細を含む命令をディスパッチし、複数のドローコールを単一のAPIコールで実行できるようにしたんじゃ。

ドローコールの数を減らすことで、CPUの負荷を軽減できるのですね。具体的には、どのようなバッファが使われているのですか?

Object BufferとDraw Bufferを使うんじゃ。Object Bufferにはオブジェクトの情報を、Draw Bufferにはドローコールに必要な情報を保存するんじゃ。

それらのバッファを使って、GPUが効率的にシーンをカリング(隠面除去)するのですね。

その通り!Compute Shaderを使って、オブジェクトが可視の場合にObject BufferからDraw Bufferに要素を作成するんじゃ。GTX 1070で125k個のオブジェクトをカリングすると、オーバーヘッドはわずか2.97msじゃったらしいぞ。

すごい!でも、複数のシェーダーをサポートするにはどうすれば良いのでしょうか?

各シェーダーに描画できるオブジェクト数の見積もりを割り当てる必要があるんじゃ。そして、Draw Bufferに挿入された要素をコンパクト化して、連続して配置するんじゃ。

なるほど。アトミックカウンターを使って、Draw Bufferへの挿入位置を管理するのですね。

そうじゃ!さらに、サブグループ操作を使ってクラスターのコンパクト化を高速化するんじゃ。これで、125k個のカリングされたオブジェクトを描画するオーバーヘッドは、0.9msに縮小されるんじゃ。

最適化によって、大幅にパフォーマンスが向上するのですね。クラスタ化シェーディングについても教えてください。

従来のフォワードレンダラーはオーバードローという問題があるんじゃ。そこで、ビューフラスタムをクラスターに分割し、ライトの影響範囲に基づいてライトをクラスターに割り当てるんじゃ。

各フラグメントは、包含クラスターをルックアップし、それらのライトを使用してシェーディングを計算するのですね。

その通り!クラスタリングには、Cluster Buffer、Cluster Items Buffer、Light Bufferの3つのバッファを使うんじゃ。ライトのクラスターへの割り当ては、AABB球の交差テストを使って行うんじゃ。

最適化されたアプローチでは、クラスターの割り当てを複数の段階に分割するのですね。

そうじゃ。プリフェッチ、交差、書き込みの段階に分割することで、効率的に処理できるんじゃ。10,000個のライトを2,800個のクラスターに割り当てるのに、わずか1.1msで済むらしいぞ。

フラグメントのシェーディング時には、ビュー空間のフラグメント位置に基づいてクラスターインデックスを計算するのですね。

そうじゃ。同じサブグループ内の複数のフラグメントが同じクラスターに含まれている場合、サブグループ内で情報を共有して最適化するんじゃ。

ライトの影響範囲を小さくすると、アーティファクトが発生する可能性があるのですね。

その通り。パフォーマンスと必要な定数はシーンに大きく依存するから、調整が必要じゃ。

今日はGPUを使ったレンダリングの最適化について、詳しく教えていただきありがとうございました!

どういたしましてじゃ。しかし、ロボ子よ、これだけドラゴンをレンダリングできるなら、いつか恐竜を100万匹くらいレンダリングして、ジュラシックパークごっこがしたいのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。