graphics.hatenablog.com

技術系テクニカルアーティストのあれこれ

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


手法自体はそれほど複雑ではなくて、

  1. 前もってライトのカリングを行なっておいて
  2. 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つ。

  1. Depth Pre-Pass
    • デプスバッファだけ書き込む。
  2. Light Culling(Compute Shader)
    • 前段のデプスバッファと、タイルごとに計算したフラスタムをつかって、ライトをカリング
  3. light accumulation + Material Shader(Pixel Shader)

デプスバッファはその後のポストエフェクトとかでも使うはずだし、何より、最後のパスでZカリングができるというのが大きい。

Forward 系だからバンド幅をそれほど食わないのは利点だけど、ALU 負荷は結局高いから、そこは注意。あと、動的分岐を使ってるけど、それほどには遅くならなかったらしい。それに、そこはカリング後にライトをソートしたりして最適化可能。何より、ライトのカリングを GPU だけでできるのが強み。


まとめると、

  • フォワードレンダリングだから
    • ハードウェアMSAAが使える
    • バンド幅をそんなに食わない
    • マテリアル使いたい放題
  • フォワードレンダリングなのに
    • 4 桁個のライトが使える

ALU 負荷が跳ね上がるのがネックといえばネックだけど、まぁ、バンド幅よりはハード的に改善の余地があるだろう、とのこと。スライドの最後のほうにパフォーマンス計測の結果が載ってるけど、普通の Light Pre-Pass よりだいぶ早くなっててすごい。