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 との比較
Le はライト強度、f は BRDF/BSDF とかの関数、V がビジビリティ。m と n がライトの数。
ポイントは2点。
- Forward+ と Deferred のライト数が同じ値になってる
- Forward+ だとライトいっぱい置ける
- Forward+ は、Deferred みたいに LV の前計算をしない
- LV を保存しておくための大量の G-Buffer が必要ない
- VRAM 容量をあまり気にせずマテリアルを使える
レンダリングの流れ
全体的に Intel のこれとすごく似てる。違いは、Intel のはライトカリングと同じタイミング(同じシェーダ)でライティングしてたけど、Forward+ ではカリング済みのライトのインデクスを RWBuffer に保存しとくだけ。
ライティングは後段のフラグメントシェーダで別に計算する。
速度比較
- Light Processing Pass のメモリ/TEX 負荷が低い
- G-Buffer/ライトバッファ が必要ない
- ライトバッファが必要ない
- Shading Pass の ALU 負荷が高い
- インデクス経由でライトを参照
- ライティングの計算
G-Buffer とライトバッファがないのはかなり大きいらしい。
あとこのグラフだとわかりにくいけど、ライティングの計算自体が Deferred よりもかなり少なくなってるはず。Deferred 側は普通の LightPrepass だから Light Processing Pass にライティング計算が載ってて、Forward+ 側は Shading Pass に載ってるんだよね。てことは、Deferred のライティング計算回数が ピクセル数 と同じで、Forward+ のはタイルベースのと同じ回数のはず。
えっと、、てことは、タイルベースと比べた Forward+ のメリットは、ライティング計算を従来のフラグメントシェーダの枠組みに戻した、ってことになるのかな。たしかにそのほうが何かと使いやすいけど、速度面でのメリットも何かあるのかしら。なんか見逃したかな。。
雑感
個人的におもしろかったのは、このスライドにはちょっとしか書いてないんだけど、VPL がよかった。こんな大量のライトなんてどこに使うんだよ?って、こういう使い方もアリなのね。Leo Demo みるまで全然気付かなかった。。
メインのタイルベースなライトカリングについては、Intel のやつもあって、あぁあれか、という程度。