graphics.hatenablog.com

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

Forward+: Bringing Deferred Lighting to the Next Level

shader.jp にも載ってるけど、
出張から帰ったらスライド公開されてたからさっそく読んでみた。

Forward+: Bringing Deferred Lighting to the Next Level

AMD
Takahiro Harada, Jay McKee, Jason C.Yang

Eurographics 2012 Short Paper 発表スライド
http://developer.amd.com/gpu_assets/AMD_Demos_LeoDemoGDC2012.ppsx


前提

  • PC 用のグラボで動作させるための処理
    • ゲームコンソール向けの処理ではない

たぶん(個人的に)一番厄介なのはここで、これ、間違いなくいまどきのゲーム機で実装できない。
スライドにもあるけど、ライトカリングの ALU 負荷がとんでもないことになってるし、if 文も普通につかってる。そもそも 360 も PS3 もコンピュートシェーダ積んでないしな。。#ifdef で場合分けしてシェーダ爆発とかしてるのが普通なのに、こんなんやりたくもないわw
いや、PS3 なら SPU でがんばればいいのか、、そんなめんどくさいのやだよ。そもそも SPU でこれできんのかな、メモリの都合的な意味で。


Forward+ == Forward + Light Culling

スライドの 8 枚目に書いてあるけど、Forward+ 自体はものすごくシンプル。ライトカリング付きのフォワードレンダリング


一般的な Forward/Deferred との比較

f:id:hal1932:20120516201647j:plain
Le はライト強度、f は BRDF/BSDF とかの関数、V がビジビリティ。m と n がライトの数。
ポイントは2点。

  • Forward+ と Deferred のライト数が同じ値になってる
    • Forward+ だとライトいっぱい置ける
  • Forward+ は、Deferred みたいに LV の前計算をしない
    • LV を保存しておくための大量の G-Buffer が必要ない
    • VRAM 容量をあまり気にせずマテリアルを使える


レンダリングの流れ

f:id:hal1932:20120516201651j:plain
全体的に Intel のこれとすごく似てる。違いは、Intel のはライトカリングと同じタイミング(同じシェーダ)でライティングしてたけど、Forward+ ではカリング済みのライトのインデクスを RWBuffer に保存しとくだけ。
ライティングは後段のフラグメントシェーダで別に計算する。


速度比較

f:id:hal1932:20120516201655j:plain

  1. Light Processing Pass のメモリ/TEX 負荷が低い
    1. G-Buffer/ライトバッファ が必要ない
    2. ライトバッファが必要ない
  2. Shading Pass の ALU 負荷が高い
    1. インデクス経由でライトを参照
    2. ライティングの計算

G-Buffer とライトバッファがないのはかなり大きいらしい。
あとこのグラフだとわかりにくいけど、ライティングの計算自体が Deferred よりもかなり少なくなってるはず。Deferred 側は普通の LightPrepass だから Light Processing Pass にライティング計算が載ってて、Forward+ 側は Shading Pass に載ってるんだよね。てことは、Deferred のライティング計算回数が ピクセル数 と同じで、Forward+ のはタイルベースのと同じ回数のはず。
えっと、、てことは、タイルベースと比べた Forward+ のメリットは、ライティング計算を従来のフラグメントシェーダの枠組みに戻した、ってことになるのかな。たしかにそのほうが何かと使いやすいけど、速度面でのメリットも何かあるのかしら。なんか見逃したかな。。



雑感

個人的におもしろかったのは、このスライドにはちょっとしか書いてないんだけど、VPL がよかった。こんな大量のライトなんてどこに使うんだよ?って、こういう使い方もアリなのね。Leo Demo みるまで全然気付かなかった。。
メインのタイルベースなライトカリングについては、Intel のやつもあって、あぁあれか、という程度。