Deferred Shading

| コメント(0)

光源足したりポストエフェクト色々やってみたりしようとするとDeferred Shadingの方が絶対楽だよなあと魅力を感じているわけですが(他にもメリットはあるけど)、Deferred Shadingの問題として、

  1. MSAAと相性が悪い
  2. 半透明が使えない

というのがあるわけです。

1の問題はDX9の場合、MSAAバッファはMRTにすることができないという制約があるためで、DX10以降ではこれをサポートしてくれているとか聞いたような聞いてないような。ともかく、将来的にはなんとかなりそうな問題なわけです。(DX10はあまり興味ないので調べてない。GLは多分併用できそう?)

この問題の現在の回避策はハードウェア機能が使えませんが、シェーダでエッジ検出をしてアンチエイリアスを自前でやることで実現しているか、FSAAで妥協しているケースが多いようです。今後出る予定のバイオニックコマンドーはMSAAをDeferred Shadingで実現した!とかいう記事を見かけたのですが、どうやったのか気になるところですね。

さて、2の問題はカラーを描き出すバッファが1つしかないためで、DX9ではMRTの数に余裕無いし、DX10でもMRTの数が増えたとはいえ半透明の数だけ分けて描き出すには明らかに非現実的なのです。既にDeferred Shadingを採用したゲームでは当たり前のように半透明も使われていて、まさか半透明は普通にシェーディングして合成とか、結局問題点を抱えた従来のシェーディングも併用することになって色々と手間のかかりそうなことをやってるわけないですよねと疑問に思っていたのです。

この問題はDeferred Shadingを語る際に結構言及はされているものの、回避策についてまでつっこんだものは見たことがありませんでした。(私のアンテナが疎いだけなのかもしれませんが)

で、なにやらATIがGDC2009で行ったSTALKER CSの技術解説プレゼンの資料を公開したようなので見てところ、

----quote beg----

Transparent objects
Basic forward rendering

----quote end----

な、なーんだ。

分けて描き出すのは無理だからアルファブレンドを普通にしておいて、むしろマテリアルIDをビット演算で組み合わせて描き出すことでうまいこと解決できそう?でも普通に考えればマテリアルの数はかなり多いだろうからビット数が足りないぞ?だがビット演算以外でやるなら組み合わせの管理が死にそうだ。とか色々考えてたものの、普通にごり押しでなんてことはなかったわけですね。

しかし半透明と不透明の描画結果を違和感ないように同等の機能を用意しようとしてたらやっぱり大変だろうなあ。まあSTALKERの半透明のシェーディングは割と簡易なもので周りから浮いてたし、Dead Spaceの半透明なんてそもそ2Dと一部のガラスとパーティクルくらいしか無かった気がするので、最初にデザインさえしっかりしておけば問題にならないのかも。

余談ですが、STALKER CSのSun ShaftsってCrysisでやってたやり方じゃなくてシャドウマップを使ったやり方っぽいのね。

コメントする

Twitter

アーカイブ

SteamCard