Technology Begind AMD's "Leo Demo"
shader.jp をみてたらおもしろいネタがあったから、
自分でも読んでみた。
ここで書くのもなんだけど、僕、masafumi さんのファンです。
いつもおもしろい情報をありがとうございますm(_ _)m
と、いうわけで、、
Technology Begind AMD's "Leo Demo" Jay McKee MTS Engineeer, AMD GDC 2012 発表スライド http://developer.amd.com/gpu_assets/AMD_Demos_LeoDemoGDC2012.ppsx
手法自体はそれほど複雑ではなくて、
- 前もってライトのカリングを行なっておいて
- Pixel Shader でタイルベースの Forward Rendering を行う
詳細はおそらく 5 月の Eurographics で発表されるはずだけど、基本的にはこれだけ。
# 実際の "Leo Demo" は Ptex/PRT の技術デモにもなってるし、
# 今回の技術はあくまでこのデモの一部、ってことで。
実装に必要なのは DirectX 11 の Compute Shader と UAV。
UAV(Unordered Access View)ってのはGPUからランダムR/W可能なバッファ領域(にアクセスするためのインターフェイス)。これを使うと、シェーダ間で任意データのやりとりが簡単にできる。ここに、ライト情報、カリング後のライトのインデクス、マテリアル情報を保存する。
"Leo Demo" は 2 つの Compute Shader をつかっていて、ひとつはライトのカリング用、もうひとつは間接照明用の仮想ライト生成。ライトのカリングにかかった時間は、AMD Radeon HD 7970 で、ライト 3072 個に対して 1.7 ms とのこと。
レンダリングパスは3つ。
- Depth Pre-Pass
- デプスバッファだけ書き込む。
- Light Culling(Compute Shader)
- 前段のデプスバッファと、タイルごとに計算したフラスタムをつかって、ライトをカリング
- light accumulation + Material Shader(Pixel Shader)
- ライトと各マテリアルをまとめてレンダリング
デプスバッファはその後のポストエフェクトとかでも使うはずだし、何より、最後のパスでZカリングができるというのが大きい。
Forward 系だからバンド幅をそれほど食わないのは利点だけど、ALU 負荷は結局高いから、そこは注意。あと、動的分岐を使ってるけど、それほどには遅くならなかったらしい。それに、そこはカリング後にライトをソートしたりして最適化可能。何より、ライトのカリングを GPU だけでできるのが強み。
まとめると、
ALU 負荷が跳ね上がるのがネックといえばネックだけど、まぁ、バンド幅よりはハード的に改善の余地があるだろう、とのこと。スライドの最後のほうにパフォーマンス計測の結果が載ってるけど、普通の Light Pre-Pass よりだいぶ早くなっててすごい。