Inferred LightingとはSIGGRAPH2009で出たやつ。念のため下記の内容は個人的要約に基づくものであって正当性は保証しません。あしからず。
名前の通りDeferred Shadingの亜種というか、Light Pre-Pass Rendering(Deferred Lightingとも)の発展系にあたるのかな。基本的になパスはLight Pre-Passと同じ。
Light Pre-PassではDeferred Shadingでのメモリ帯域へのコストを減らせる代わりに1パス追加されました。この追加パス分のコストを取り戻したいのでInferred LightingではDSFバッファなるものをGバッファ描き出し時に追加で描き出しておいて仕込んでおく。DSFバッファの内約は線形深度とオブジェクトIDとグループID。このあたりの発想はSTALKERのGバッファ構成が元ですね。
で、Lightingパスで縮小レンダリングを行ってパフォーマンスを稼ぐわけですが、普通に縮小レンダリングしたものをアップスケーリングして、Albedoやらの要素を等倍でレンダリングしたテクスチャと合成すると、当然エッジ付近でピクセルの不一致が発生してチラチラとアーティファクトが出てしまう。特にMSAAを使うとこのエラーは酷くなる。これをDSFバッファとCentroid(これは遅延レンダリング系特有の手法ではないが)で解決していくのがミソらしい。
さらにアルファのポリゴンもこのレンダリングラインに乗せれるらしいのだが、どうやるかというとアルファポリゴンはライティング時に2x2ピクセルをインターバルに点を打つらしい。で、アップスケーリング時のバイリニアフィルタでうまく混ざるらしい。2x2ピクセルだと4レイヤーまで、4x4ピクセルだと16レイヤーまでアルファを解決できるが、当然解像度は低下していく。
さて個人的にはちょっと使えないかなとは思う。
まず、ライティング部分だけとはいえ縮小してるので当然精度は荒くなる。特に法線マッピングでのディティールは著しく潰れるだろう。まあ、コンシューマ機だと性能が足りなくて、レンダリング解像度は大抵縮小されてるゲームが多いので他と比較しても遜色は無さそうだし、むしろマテリアルパスでのAlbedoなんかの解像度は等倍なので見栄えは良いかもしれない。この辺はクオリティとトレードオフなのでLight Pre-Passのパフォーマンス向上を狙って取り入れる分にはありか。
アルファは確かに使えるとは言っても、透明度25%の倍数で4レイヤーまでなので、実際にはどうしようもなく使えないだろう。ムービー見ると透明度が変化してるようにも見える気がするけど、自力でサンプリングしてブレンド係数変えると実現できるのかな?一応Albedoでの透明度はそのままなのでちょっと妙だと感じる程度にまで抑えれる気がするけど、これだったら別ラインにはなるが普通にForward Renderingでやった方がフレキシブルで良さそう。16レイヤーになっても、ライティングの解像度が余計に酷くなるし透明度が倍数固定な以上、半透明が出てくる頻度にもよるが実用的ではないと思う。
余談。SIGGRAPH2009とLight Pre-Passつながりしかないけど、CryEngine 3のリアルタイムGIの手法も発表されて当然見てみました。アホの私には詳細な実装の仕方が頭に描けず、概要を把握するだけで一杯一杯でしたが、重そうなのによく3~5msまでに抑えれてるなあと。Volume Textureの解像度は相当低くて十分っぽいので(32^3)、これで計算回数が激減されてるのかな。
最近のコメント