大きな波~ジオメトリレベルの波

海や湖の沖の水面には、さざ波よりも規模の大きい波が見られる。海上を舞台にした3Dゲームなどではこうした水面を取り扱う局面が多くなる。

こうした大海の波については昔からアカデミックな分野では様々な角度から研究が行われていたが、NVIDIAがGeForce 6800シリーズ用のデモ「Clear Sailing」(NVIDIA,2004)でゲルストナー波(Gerstner Wave)モデルを実装して以来、この手法がしばしば用いられるようになった。

大きな波は、法線マップによるバンプマッピングで実現するには無理があるので、実際に頂点レベルで動く(ジオメトリレベルの)波で実装する必要がある。

実装の方針は様々な方法があるが、あらかじめ適当な解像度で分割しておいたポリゴングリッドの頂点を、ゲルストナー波動関数で得た波の頂点情報で変位させるやり方がシンプルで実装しやすいとされる。NVIDIAの「Clrear Sailing」デモでは150×150に分割したポリゴングリッドに対して45個のゲルストナー波を発生させた実装になっていた。なお、ゲルストナー波の発生にはCPUを活用していた。

前述したように、こうしたジオメトリレベルの波を加えると、法線マップを使ったバンプマッピングによるさざ波表現の周期性の露呈を分かりづらくする効果がある。水面の表現にそれほど重きをおいていないグラフィックス設計とする場合は、さざ波表現は、固定の複数の法線マップによるさざ波を適当にスクロールさせたものだけにして、ジオメトリレベルの波を水面に適用するという手抜きも時々見受けられる。「3DMark06」(Futuremark,2006)の水面の表現は、まさにこのパターンであった。3DMark06のさざ波表現は2枚の法線マップをスクロールさせながら重ね合わせただけのもので、これに4つのガルストナー波をジオメトリレベルで発生させたものとなっていた。

「3DMark05」(Futuremark,2004)の水面表現は、2つの法線マップをスクロールさせただけのさざ波表現のみであった。起伏や変化に乏しかったといえる

「3DMark06」(Futuremark,2006)のほぼ同一シーンより。こちらはガルストナー波によるジオメトリレベルの波が加わったことで見た目の複雑性が増した

視点位置が水面に対してダイナミックに近くなったり遠くなったりするような3Dゲームのグラフィックスでは、ピクセル単位のさざ波表現と頂点単位の大きな波を視線からの位置関係に合わせて臨機応変に使い分ける実装が面白いかもしれない。

例えば、テクスチャ上で適当な波動シミュレーションを行い、波の高低を濃淡情報で表すハイトマップを生成し、視点位置から見てこの高低が微細と見なせる高低情報についてはここから法線マップを生成してバンプマッピングのさざ波として表現してやる……というような実装だ。

逆に、視点から近く高低が大きく見える高低情報については、VTF(Vertex Texture Fecth)機能を活用し、頂点シェーダからハイトマップにアクセスしてこの情報を元に水面の頂点を変位させてジオメトリレベルの波とする。

こうすることで波表現の画質とリアリティ、処理の負荷のバランスが平均化できることだろう。

なお、この実装を行うにはGPUにVTF機能が必須となる。DirectX 9世代/SM3.0対応GPUではGeForce 6000シリーズ以上、DirectX 10世代/SM4.0対応GPUでは全てのGPUがVTFに対応している。

この手法を実装した3Dゲームタイトルに「バーチャファイター5」(セガ,2006)がある。バーチャファイター5では、FP32-128ビットの浮動小数点テクスチャに対して波動シミュレーションを行ってハイトマップを生成。このハイトマップからジオメトリレベルの波を生成し、さらに法線マップまでを生成して、これを用いてのさざ波表現までを行っていた。

「バーチャファイター5」(セガ,2006)より。この作品ではVTFを活用した波生成を実装していた。右画面は波動シミュレーションを行ったあとのハイトマップ。左がこのハイトマップから生成した法線マップだ

ハイトマップを元に頂点レベルの波を生成

さらに法線マップによるピクセル単位のさざ波陰影処理までを行って最終画面を生成

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