よりリアルに見せるために

このままではいくつかの問題点が残る。

1つ目は煙の中に第三者の遮蔽物があった場合。

そのピクセルから視線方向に突き進ませて密度3Dテクスチャをサンプルしていくこの方法では遮蔽物が考慮されない。

分厚い煙の真ん中に人がいた場合、実際にはその人が見えるはずだが、この方法では人がいようがいまいが煙をまるまる描画してしまうので煙で人が見えなくなってしまう。

煙と遮蔽物の関係を吟味しないと不自然になる

しかし、これには簡単な解決策がある。

シーンの深度バッファ(Zバッファ)を参照し、遮蔽を考慮すればよいのだ。

前出の中間情報テクスチャを生成する際に、シミュレーション対象領域に、シーンの深度バッファを参照して、遮蔽物の情報を反映させればいいのだ。

遮蔽物への配慮は、その遮蔽物やそのシーンの深度バッファを吟味して中間情報テクスチャを生成してやればよい

2つ目は、シミュレーション対象領域を単位立方体で処理しているために、密度3Dテクスチャを可視化した場合に、遮蔽物と煙の合成色にマッハバンドが出てしまう問題。

描画結果に強いマッハバンドが出てしまう。これはシミュレーション対象領域の単位立方体の段差が可視化されてしまうようなイメージ

NVIDIAの実装ではこれをごまかすために視線を突き抜かせていく単位ステップと、シーンの深度バッファをみて遮蔽物までの距離の対比で線形補正する処理を行ってこのマッハバンドを低減させている。

視線が遮蔽物に到達したとき、密度3Dテクスチャをサンプルしてそのまま煙の密度として返すのではなく、遮蔽物の深度値を吟味して密度を低減させる

3つ目の問題は、始点がシミュレーション対象領域に突入してしまった場合の例外処理だ。

視界が流体物理シミュレーション対象領域の中に突入してしまった場合

この場合、中間情報テクスチャを生成する際にシミュレーション対象領域の前面のレンダリングが行えない。これは前面レンダリングが行えない位置をマーキングしてレイキャスティングのフェーズで例外処理を行う。

煙の中に視界が突入してしまった場合の例外処理

4つ目は精度の問題。

中間情報テクスチャの精度が足りないと視点がシミュレーション対象領域に近づいたときに描画された流体が不自然なバタ付きを起こしてしまう。これは中間情報テクスチャに32ビット浮動小数点以上の精度を採用することで低減、回避できるという。

中間情報テクスチャには32ビット浮動小数点以上の精度を採用する