イベント
[GDC2008#27]パーティクルによる,リアルな挙動の液体表現を目指して
一般的に,水面を表現する方法自体は,だいたい次の3種類に分けられる。
- Grid(グリッド)
- Particle(パーティクル)
- Heightfield(ハイトフィールド)
さて,本稿で取り上げるパーティクルによる液体表現とは,簡単にいえば「水の代わりに粒子を使って水面を表現する」ことを指す。水の分子レベルで考えれば,たいへん理にかなっており,水面だけでなく,水の跳ねた状態などといった多彩な表現が可能ということもあって,多くのシステム(≒ゲームタイトル)で用いられている。
ただ,粒子が大きいと非常に不自然になりやすく,見栄えがよろしくない。そのため,たくさんのパーティクルを使うことでより自然にしたいところだが,今度はNの二乗で描画負荷が上がってしまい,非常に“重い”処理になってしまう。一般的に「パーティクルで自然な水面を作るのは相当難しい」という論調が支配的な所以(ゆえん)だ。
しかし難しいとはいうものの,要するに,ある程度の大きさの粒子によるパーティクル動作を処理しつつ,それをできるだけ“液体ぽく”描画してやればよい。Green氏のセッションでは,その方法として
- Marching Cubes(マーチングキューブ)
- Density-based Shading(デンシティベースドシェーディング)
- Motion Blur(モーションブラー)
という3手法が紹介された次第である。
マーチングキューブ法は3次元のバッファを使ってデータを処理するためメモリ消費が激しいようだが,かなり綺麗な出力を出しているのが分かる。ボリュームデータから等高面を出す標準的な手法だそうだ。
デンシティベースドシェーディングという手法では,密度や法線情報を利用する。基本的に密度をベースにレンダリングを行い,近接するパーティクルでは法線を補間して面をつないでいくようだ。パーティクルのスプライトを拡大し,α情報をつけて重ね書きすることで滑らかな面を形成するらしい。
モーションブラーを使う手法では,パーティクルの速い動きに対応し,長方形をジオメトリシェーダで生成することで,動いている液体が不自然に見えないように工夫している。
GeForce FX時代には,液体の流れを示すデモが作られた。2次元の「Navier-Stokes」(ナビエ−ストークス)方程式を解くものだ。Navier-Stokes方程式は,流体の状態を表す方程式で,この手の処理では必ず登場する定番の数式である。普通に解くのは難しいので,どうやって簡略化するかなどが決め手となる。
そしてその後,GPUベースのパーティクルシステムや,「CEDEC 2007」時に紹介した,3次元のNavier-Stokes方程式を解く煙のデモへと続いていったわけだ。
GPUの高速化とCUDAの展開によって,パーティクルベースの演算処理もかなり現実的なものとなってきた。今後さらにGPUの演算能力が上がり,レンダリングアルゴリズムが改良されていけば,かなりリアルな挙動を見せる液体を扱った作品も増えてくるだろう。3Dゲームで水面から飛沫が上がっているのを見たら,パーティクルが使われているのだと思い出してみてほしい。
- この記事のURL: