より高速に動かすために

シミュレーションの単位立方体の解像度はシミュレーション精度に直結するが、それとは別の問題として描画精度と描画負荷のバランスの問題点がある。

シミュレーション精度をある解像度に固定したとき、描画解像度をむやみに上げたとしても、多くのピクセルで密度3Dテクスチャの同じ場所をサンプルしてしまうので、見た目の精度はあまり向上しない。よく考えると当たり前のことだ。

高解像度でレイキャスティング描画しても、シミュレーション解像度以上の品質の流体物の描画結果は得られない

そこで描画負荷を低減させるには、低解像度のバッファにシミュレーション結果を描画して、これを表示解像度に拡大して合成するという最適化手法がある。その場合、中間情報テクスチャの解像度も粗い解像度にすることができるので処理負荷はかなり低減できる。

シーンのレンダリング解像度とシミュレーション解像度を同じにして、流体物理シミュレーションの結果の描画も高解像度にした例(左)と、描画は低解像度に生成して拡大合成した例との比較。見た目にそれほど大きな違いはないがフレームレートは3倍に向上

コストパフォーマンスは劇的に向上したものの、これによって別の問題点もでてくる。

シミュレーション結果の煙と通常のシーンの合成を行った際に、煙と遮蔽物との境界付近にエリアシング(ジャギー)が出てしまうのだ。

流体を低解像度描画しこれを拡大してシーンに合成する技を使うと、流体と遮蔽物の交差付近に強いジャギーが出現してしまう

遮蔽物との境界の判定単位は深度バッファ(中間情報バッファ)の解像度に依存する。つまり、煙を低解像度で描画した場合は当然煙側の深度バッファ(デプスバッファ)は低解像度であり、これが描画結果に露呈してしまうわけだ。

遮蔽物との境界の判定単位は深度バッファ(中間情報バッファ)の解像度に依存する

これを回避するためにNVIDIAの実装では大胆な方法を用いている。

ジャギーが出るのが煙と遮蔽物とのエッジに限定されるので、エッジ付近についてだけ高解像度でレイキャスティングを行うというのだ。

エッジ付近のみ高解像度レイキャスティングして改善する

エッジの検出は高解像度のシーンの深度バッファで行わず、中間情報テクスチャをレンダリングする際の低解像度の深度バッファで行う。

これは低解像度バッファで処理できるという付加的なメリットを生む以外に、ジャギーが出ることが分かりきっているシミュレーション対象領域と遮蔽物が交差している部分のエッジだけを検出できるからだ。