プロシージャル技術による雲の生成

次のテーマとして取り上げるのはプロシージャル技術による「雲」の生成法についてだ。

最も基本的なプロシージャルな雲生成は、パーリンノイズを初めとした算術ノイズやフラクタルノイズを種として雲の厚みを生成して、これをそのまま濃淡としてテクスチャ化する手法だった。これは前出の山岳の凹凸生成でいうところの山の高低をそのまま雲の厚みに置き換える発想といえる。

フラクタルノイズで濃淡を作り出してこれを雲テクスチャとする手法

このままだと雲は濃淡のテクスチャ(画像)でしかないわけだが、続いて出てきたのが、そうしたスカイボックスに張り付いているだけだった雲テクスチャを3Dグラフィックス化して浮かべようとするアプローチで、適当なプリミティブに雲テクスチャを貼り付けて浮かべる…というアイディアだった。

その代表事例としては、航空機メーカーのグラマン社のG.Y.Gardner氏らが実装した手法がある。これはSIGGRAPH1990にて発表された手法で、二次曲面からなる3Dオブジェクトを浮かべ、これに対して雲テクスチャを適用するという方法だった。

適当な球体オブジェクトを浮かべてここに雲テクスチャを適用する手法

雲は実体のない粒子の集合なので、これをボリュームレンダリング的な手法で再現しようというアプローチも存在する。

ボリュームレンダリングは一般的には"領域"(ボリューム)を表現するCTスキャン映像のような複数枚からなる断面テクスチャに、表現しようとしている粒子の密度などの情報を記録しておき(ボリュームテクスチャ)、レンダリング時には視線方向にこのボリュームテクスチャを参照してその密度情報を取り出し、この値を元に陰影処理を行う。いわば簡易的なレイトレーシング(レイキャスティング)を行うことになる。

すなわちボリューム(領域)としての雲をプロシージャル生成するためには、立体的な密度分布情報を算術的に生成しなければならない。

これを簡易的に実装したのがDavid S.Ebertらが考案したフラクタルノイズ関数に陰関数を組み合わせた実装だ。

この方法は、簡単に言えば「あるパラメータを与えたときに一意的な値が帰ってくるノイズ関数でボリュームレンダリングをやってしまおう」というものになる。

プロシージャル生成した雲をボリュームレンダリングするという仕組み

なお、雲の表現に関しては1997年までは静的な雲であったが、1997年以降は動的な雲を生成するのがトレンドとなっていった経緯がある。動的な雲の生成に関しては乱流方程式を解くようなシミュレーションの方向性に進化し始めておりプロシージャル技術とはまた違ったものになりつつあるようだ。

ちなみに、最近の3Dゲームでの実装はというと、雲のレンダリングは、パーティクルベースのものが多い。

マイクロソフトの「フライトシミュレータ」シリーズの最近作では、複数の雲テクスチャを適用したパーティクル(スプライト)を組み合わせてダイナミックな雲を形成するというものであった。これだけだとリアリティに乏しいので、空からのライティング、太陽からのライティングをその雲パーティクルに対し擬似的に行なうことで、平面のパーティクル・ベースとは思えない陰影感とボリューム感、立体感のある表現を実現していた。

複数の雲スプライトを組み合わせて表現するのが現状のよく見られる実装。マイクロソフトのフライトシミュレータシリーズで採用されている

「CRYSIS」で有名な独CRYTEKのCRY ENGINE2.0では、これをさらに発展させ、雲パーティクルにテクセル単位の雲の厚み情報を待たせ、疑似ライティング時により複雑な陰影が出せ、さらに逆光になったときに雲からの光の漏れの濃淡も表現している。さらにこの厚み情報のシルエットをシャドウマップに投射することで雲の動的な影生成も行っている。

パーティクルベースの雲生成についてはMicrosoft ResearchのNiniane Wang氏のサイトが詳しいので興味のある人はそちらも参照してもらいたい。(続く)

CRY ENGINE2.0の雲表現

パーティクルベースの雲でもここまでが表現できる。動的な影生成にも対応していた

(トライゼット西川善司)