GPUが弱くても400FPS超え、Block Gameのソフトウェアオクルージョンカリング
Software occlusion culling in Block Game

開発中のBlock Gameで、筆者は統合GPUでも快適に動くようCPUベースのオクルージョンカリングを実装した。256x128の低解像度深度バッファにキューブを描画し、チャンクを階層化してオクルーダーを管理。地下では95%以上のチャンクをカリングし、弱いマシンでも400FPS以上を達成。複雑な可視性アルゴリズムを避けつつ、スレッドセーフで効率的な処理を実現した。
地下や洞窟内ではチャンクの95%以上をカリングでき、私の弱いシステムでも400FPS以上が出る。
- Pannoniae
いい記事だね :) ええ、これは基本的にCPUとGPUのパワーのトレードオフだ。カリングには色々な種類がある。基本的なものだと、バックフェースカリング(ハードウェアでサポートされていて、自分から遠ざかる向きの三角形をレンダリングしない)やフラスタムカリング(カメラから見えないオブジェクトをレンダリングしない)がある。これらはほぼすべてのゲームで使われている。
オクルージョンカリングはもう少し厄介で、CPUでやるにしても大きく分けて2つの方法がある。記事のようにCPUで低解像度のレイキャスティング/ソフトウェアレンダリングを行い、それに基づいてカリングする方法だ。これは適応的なワークロードで、より多くのスレッドやCPUパワーを与えればスケールしてカリングが良くなり、結果としてGPUでレンダリングされるピクセルが減る。
GPUカリングを使うこともできるが、それはもっと複雑で、GPUを使うことになる。これはジレンマを生む——GPU負荷を減らすためにGPUカリングを使いたいのに、統合GPUはコンピュートシェーダーやメモリ帯域全般の扱いが苦手なので、カリングパスを行うとカリングで得られるはずの利益がすべて吹き飛んでしまうかもしれない。
そして専用GPUには、フラスタム内のすべてをそのまま投入して大半を深度で棄却させるだけの生のパワーとメモリ帯域がある。
CPU上で連結グラフを作ったらもっと速くなるだろうか、たとえば各チャンクが隣接が可視かどうかを知っていて、その逆も然り、というふうに。レンダリング時にチャンクグラフをたどって可視チャンクを投入する、一種の原始的なガベージコレクタで生存性を判定するようなものだ。カリングは悪くなるだろうが、おそらく[…]
- keyle
わあ、HNに技術記事だ。何が起きてるんだ。2022年に戻ったのか? /s