シミュレーション結果を映像としてレンダリングするために

そして、問題となるのは、このテクスチャ配列……3Dテクスチャを映像としてレンダリングするフェーズだ。

描画フェーズの概要

3Dグラフィックスの標準的なレンダリングプロセス(ポリゴンをピクセルに分解して、ピクセル単位の陰影処理をして描く)では3Dテクスチャをそのまま可視化することはできないので、シェーダを駆使して特別な描画方法を実装しなければならない。

3Dテクスチャの可視化として、最も一般的なのがボリュームレンダリングと呼ばれる手法だ。

用語自体は聞いたことがあるかもしれない。

ボリュームとは空間のこと。

3Dテクスチャは空間を輪切りにした断面図に相当する。この断面図を可視化するにはどうしたらよいかを考える。

画面上のピクセルは、ある角度を持って三次元空間を突き抜けていく1本の視線だと考えられる。この視線の先に流体物理シミュレーションで処理した空間領域がある……すなわち断面図となる3Dテクスチャを突き抜ける際に、どう突き抜けていくのかを3Dテクスチャを一枚一枚見ていく。

そういえば、ここでなにを可視化するのかも考えなければならない。3Dテクスチャとしてシミュレーションの結果が出力されてはいるが、速度や圧力は目に見える物ではない。そう、密度は可視化するテーマに相応しい。3Dテクスチャの1テクセル……すなわち1個1個の単位立方体の密度情報は、煙ならばその単位立方体における煙の「薄い/濃い」を表している。

この密度の3Dテクスチャに対し、レンダリングするピクセルの視線方向に突き抜けるように読み出していき、それを加算していけばそのピクセルの煙の色が決定できる。密度が薄いところを突き抜けていった場合は透明に近い薄い色となり背景の色が透けるようになるし、逆に密度が高ければ煙の色が支配的になる。

シミュレーション結果の3Dテクスチャに格納されている単位立方体(ボクセル)ごとの密度情報をレイキャスティング法を活用して可視化していく

こうした3Dテクスチャの可視化/描画方式を「レイキャスティング」(Raycasting)という。余談になるが、レイキャスティングは次世代バンプマッピングともいわれる「視差遮蔽マッピング」(Parallax Occlusion Mapping)などでも局所的に使われたりするもので、近年のGPUのシェーダ性能の向上により、だんだんと実用化されてきている。

さて、視線を突き抜かせるのはいいとして、無限に突き進めても計算が無駄なので、NVIDIAの実装ではこの進む距離を先に求めてしまう。

これは、適当な解像度のテクスチャを用意し、これに対し、シミュレーション領域の背面側までの距離をレンダリングし、これとシミュレーション領域の前面までの距離をレンダリングして2つの差により求まる。

この時、ついでに、テクスチャ配列(3Dテクスチャ)のどのテクスチャから視線が突き抜けていくかの情報も一緒にそのテクスチャに書き込んでしまう。

実際の可視化レンダリングの際には、この中間情報テクスチャを参照しながら行っていくことになるわけだ。

各ピクセルを描画する際には、そのピクセル位置に対応する、この中間情報テクスチャのテクセルを読み出し、シミュレーション結果を格納している密度3Dテクスチャの「どのテクスチャから」「どのくらい視線を突き進ませればいいのか」を求めつつ行う