水面を使ったシーンは3Dゲームグラフィックス等で出現頻度が高い。リアルに描くには非常に難しいテーマだが、とはいってもプログラマブルシェーダ時代に突入してから、著しく進化した部分でもある。
今回からは、この「水面」のトレンドを紹介していくことにしたい。
さざ波表現に見る水面表現の歴史
水面の表現は、今も昔も、3Dゲームグラフィックスでは欠かせない要素になっている。
プログラマブルシェーダ登場以前では、適当なさざ波の模様を描いた"さざ波"半透明テクスチャを貼り付けたポリゴンで表現した水面が主流だった。この半透明さざ波テクスチャをスクロールさせることで、水が流れている感じを出す表現もよく用いられた。よりリアルにするために、複数の半透明のさざ波テクスチャをマルチテクスチャリングで異なる方向にスクロールさせて水面が複雑に蠢いている感じを出すものもあった。
「GIANTS:CITIZEN KABUTO」(PLANET MOON STUIOS,2000)より。半透明の"さざ波"テクスチャのスクロールによる水面の表現は非プログラマブルシェーダ時代の3Dゲームグラフィックスでは定番であった |
プログラマブルシェーダが登場してからは、さざ波の微細凹凸を表現するのに法線マップを活用したバンプマッピングが利用されるようになる。
法線マップ自体にはアニメーションはなく、動かないが、その水面のポリゴン自体にゆっくりと凹凸させるアニメーションをさせることで、見た目にはかなりリアルな水面が表現できるようになった。
半透明のさざ波テクスチャをスクロールさせて"流れ"を表現していたテクニックと全く同じ発想で、この法線マップをスクロールさせて、水面の蠢く感じを表現する応用例も見かけるようになる。
「3DMark2001SE」(Futuremark,2001)より。水面のさざ波は法線マップによるもの。1つ1つのさざ波は形状を変化させることはないが、ただし、スクロールはしていた。これでもそれなりにリアルに見える |
GPUの性能も上がり、GPUに搭載されるビデオメモリの容量が増えてくると、このさざ波に動きを与えようとするアプローチが台頭してくる。
まず最初に実装されたのは、ループする法線マップのアニメーションをオフラインで生成しておき、これをレンダリング時に再生していくというものであった。DirectX 9世代では、この手法を採用した3Dゲームタイトルが多かったように思う。
この方法は、ユーザーが狭い近い範囲しか見えないような水面であれば、目立った粗もなかったのだが、パノラマ的に広範囲の水面が見渡せるようなケースでは法線マップのアニメーションの反復パターンが見えてきてしまうこともあった。
「HALFLIFE2」(VALVE,2004)より。遠方までが見渡せない場合ならばオフライン生成の法線マップアニメーションでもそれほど不自然ではないが…… |
「HALFLIFE2」(VALVE,2004)より。逆に遠くまで見渡せるシーンではそのアニメーションの規則性が露呈してしまうことがあった |
この方法は、水面の動きだけはそれなりにリアリティが出せるのだが、他のキャラクタが水面に対して与えたインタラクティビティを反映できないという弱点もあった。例えば、水面を船が横切っても、水面は与えられたさざ波アニメーションを繰り返すだけ。このオフライン生成した法線マップアニメーションでは、船が水を押しのけて作り出すさざ波の変化を表現できなかった。
こういったケースでは、水面のところに水しぶきのパーティクルや、同心円状の波紋を描いたりする簡易的な表現で対応する手法が多く見られた。ただし、この方法は法線マップによるさざ波表現との一体感がなく、いかにもウソっぽく見えてしまうのが難だった。
そこで、よりリアルなキャラクタと水面の相互干渉を再現するために、このさざ波表現用の法線マップをリアルタイムに生成するアプローチが考案される。(続く)
(トライゼット西川善司)