TGC2009でのプレゼンで用いられたCryEngine 3に関する資料が公開されてました。
読んでて疑問符が浮かんだ某所のは間違いだらけじゃないか。今に始まった事じゃないけど。ついでに、このblogも正確性なんてものはあてにしないで下さい。
Deferred LightingはForward Shadingと、Deferred Shadingの合いの子みたいな感じで以下のようなパス。
- Deferred Shadingと同じようにライティングはしないでG-Bufferをレンダリングする。ただし基本的には、Z値と法線とスペキュラパワーのみ。
- 1で描き出したバッファを元にライティングのみを行う。一般的なのはDiffuseとSpecularのみで、各成分を分けて描き出すかはその後の用途次第か。今回の資料ではIBLと同じだとは言ってるが、確かに似たような感じだがDeferred Shadingにも同じことが言えるので言いすぎな様な気もする。ともかくDeferred Shadingと同じような恩恵は受けれる。
- Forward Shadingと2のバッファを使って描き出す。深度テストもシェーダでやるなら1も必要か。Deferred Shadingとはここが違う箇所。Deferred Shadingでは使うが1で描き出してないバッファは不要になるし、Deferredであんまりやりたくないようなこと(多分専用のシェーディングとか?)はここで出来るし、半透明も完全別扱いのような扱いはうけなさそう。
加えて、ポストエフェクトは2の後でも3の後でもできるのでさらに柔軟になってると思う。
つまり、Deferred Lightingは2回のジオメトリ処理が必要になってしまうというデメリットはあるが、Deferred Shadingでのボトルネックになりがちなメモリ帯域不足を、分けて描き出すことでその辺の負担を減らせているというのが特徴になるのか。そりゃ帯域とメモリが無尽蔵にあるのならDeferred Shading様々なんだろうけど、そうではない今の時代(特にPS3とXBOX360)に即したシェーディング方法と言えそうだ。
と、ここで気になるのは影の扱いだ。別の資料にはステンシル使うとか書いてたりもしたが、今時そりゃねえだろと言いたいが(FEAR2のキャラクタの影はステンシルシャドウだったが)、いつも通りにシャドウマップ作ってるとジオメトリ処理が3回になってしまい結構大変なことになるので、なんとかしたいところだ。
Resistance 2の資料見た感じでは詳細はよく分からなかったし、CryEngine 3も同じやり方かどうかも分からないが、描き出してきたバッファを利用してなんとか処理できないのかなあ。Interleaved Shadowmap lookupsというのが何を意味してるのかはよく分からんのだが、追加のメモリがいらずに帯域も少なめでOKで、マスク数制限も無いということはシャドウマップの描き出しをして無さそうだが、Shadowmapって言ってるしなあ。想像に過ぎないが、スクリーンスペースで諸々のバッファと光源位置を元に読み取り先のUV値を決定して、それらのZ値との比較から影かどうか判断するみたいなこととかできないのかな。
その他、細かいCryEngine 3の特徴メモ。
- スペキュラの格納をRGBか単色か選べる。
- 法線圧縮。定番だが、座標系による精度も気にしてるっぽい?
- キューブマップ作ってIBLもできるっぽい。Deferred Lighting時に適用するんだろう。
- SSAO。海外では定番になりつつある気が。
- 動的GI。相性の良さそうなSSDOな気はするのだが、SIG09で発表するらしいので別の手法なのかもしれない。
コメントする