流体表現をやる前のことはじめとしてボクセルを実装してみました。
手前の白いワイヤーの形状がボクセルで表現しています。とりあえず形だけは
できましたが、まだ法線計算もできていないし、UVも計算できていないです。。
ボクセルが出来たところで、ちょっとリアルタイム流体表現の話でもしてみます。
昨今のリアルタイム流体表現は、自分が知る限り大きく2つの表現に分かれるかと
思います。ボクセル表現とスクリーンスペース表現です。
・ボクセル
等間隔グリッドごとの情報を元にサーフェイスを生成。
利点:分割数次第でスクリーンスペースと比べて滑らかになる。
欠点:分割数が多いほど頂点計算やロック処理が重い。
・スクリーンスペース
ハイト情報のパーティクルを一時バッファに描画し、バッファをブラーした後、
バッファのハイトを元に法線を計算してレンダーバッファを描画。
利点:サーフェイス生成を行わないので効率が良い。
欠点:複数回描画なのでピクセルシェーダ負荷が大きい。
こんなところでしょうか。自分が思う限り、ボクセルはサーフェイス生成が面倒な上に
半透明の形状は不得意な印象なのでスクリーンスペースの方が実装が楽かな
という気がします。はい、「なぜボクセルにした!」という話になりますね笑。
リアルタイムのサーフェイス生成は近年のGPUでようやくそれなりにできるように
なったかなという感じですが、今後よりこの動きが加速するんじゃないかというのを
見越しての実装です。何より、動的にオブジェクトを生成できるっていうのは楽しい
ことだと思うんですよね。昔のゲームでも、例えばアイテムを合成したり町づくりが
できたりといった要素が入っているものは楽しかった印象があります。
実は3Dになってから逆にサーフェイスやオブジェクトが少し静的になった部分が
あるなと以前から思っていましたが、嬉しいことにようやくそれを乗り越えられるような
いい時代がやって来たのかもしれません。…て、一体何をいっているのやら笑。
たけなか 2011.03.16-22:52 Edit
ボクセルの欠点であるサーフェイス生成時のコストについてですが。
この問題はVolume Renderingという技術で解決できるかもしれない。
・Volume Rendering
ボクセルを数枚のレイヤーに分割して描画することでサーフェイス生成無しに描画。
他にはボクセルの描画コストを抑えるSparse Voxel Octreeという技術もあります。
・Sparse Voxel Octree
要するにVoxel + Octree。これによって、ミップマップと同じ要領でサーフェイス
レベルを動的に変更できる。分かりやすいのがAtomontage Engineという
エンジンのサンプル動画。
www.atomontage.com/?id=gallery#aug15_2010
トラックが移動した部分の地面がボクセルレベルで凹んだり、背景に対して
動的にペイントづけしたり。
また、動的にサーフェイスを動かさないけどサーフェイスにペイントしたい場合は
メガテクスチャという技術もあるそうですが。特に詳しい紹介が公開されて
いなかったので、以下自分の推測上の実装です。
・Mega Texture
背景のテクスチャをタイル状に構成するのではなく、それぞれの区間の
サーフェイスにユニークなテクスチャを割り当て、カメラが移動するごとに
ストレージ読み込みで次々と隣接区間のテクスチャを読み込み・開放する技術。
読み込む際は遠景からはじまるので、おそらく低ミップレベルから順に読み
込まれると思われる。ちなみに下のURLが少し参考になりました。
doope.jp/2009/08607.html
インディーズゲームだとDe Blob当たりがこれに近い技術(ただしストレージ読み
込みではなく初期化時に全読み込み)をやってるのかなと思いました。
こんなところですが。これらは唯の自分にとってのメモ書きなので、実際にどういう
実装がされているかについてをここから鵜呑みにしてはいけません!ということを
最後に付け足しておきます。