よりリアルに見せるために
このままではいくつかの問題点が残る。
1つ目は煙の中に第三者の遮蔽物があった場合。
そのピクセルから視線方向に突き進ませて密度3Dテクスチャをサンプルしていくこの方法では遮蔽物が考慮されない。
分厚い煙の真ん中に人がいた場合、実際にはその人が見えるはずだが、この方法では人がいようがいまいが煙をまるまる描画してしまうので煙で人が見えなくなってしまう。
しかし、これには簡単な解決策がある。
シーンの深度バッファ(Zバッファ)を参照し、遮蔽を考慮すればよいのだ。
前出の中間情報テクスチャを生成する際に、シミュレーション対象領域に、シーンの深度バッファを参照して、遮蔽物の情報を反映させればいいのだ。
2つ目は、シミュレーション対象領域を単位立方体で処理しているために、密度3Dテクスチャを可視化した場合に、遮蔽物と煙の合成色にマッハバンドが出てしまう問題。
NVIDIAの実装ではこれをごまかすために視線を突き抜かせていく単位ステップと、シーンの深度バッファをみて遮蔽物までの距離の対比で線形補正する処理を行ってこのマッハバンドを低減させている。
3つ目の問題は、始点がシミュレーション対象領域に突入してしまった場合の例外処理だ。
この場合、中間情報テクスチャを生成する際にシミュレーション対象領域の前面のレンダリングが行えない。これは前面レンダリングが行えない位置をマーキングしてレイキャスティングのフェーズで例外処理を行う。
4つ目は精度の問題。
中間情報テクスチャの精度が足りないと視点がシミュレーション対象領域に近づいたときに描画された流体が不自然なバタ付きを起こしてしまう。これは中間情報テクスチャに32ビット浮動小数点以上の精度を採用することで低減、回避できるという。