反射と屈折

水面に映し込ませる周囲の情景の環境マップは、動的に生成したい場合は、視点位置を水面に対して反転させた仮想視点から情景をテクスチャに描けばよい。

そして水底の様子は普通に始点から水面下の情景を描けばよい。

水面に映り込む情景のレンダリングは視線を水面に対して反転させた位置から上下逆転させた仮想視点から描く

水面のレンダリング時は、さざ波の微細凹凸を表現した法線マップから取りだした法線ベクトルに配慮して、ピクセル単位の反射ベクトルを求めて、これに従って環境マップをサンプルする。

前述したフレネル反射の方程式を計算してその結果に応じて、環境マップからサンプルしたテクセルと、レンダリングした水底の様子のブレンド具合を調整する。

水底の様子を水面で視線が屈折する(=水底の様子が屈折して目に届く)様をシミュレーションするとさらにリアリティ度が増す。

下図は反射ベクトルと屈折ベクトルを図式化したものだ。屈折変数rは0~1の範囲で適当に与えればいい。

水面に反射する情景だけでなく、この屈折ベクトルも法線マップから取り出した法線ベクトルでピクセル単位で計算してやることで、屈折した水底の様子もさざ波で歪むことになる。

反射ベクトルと屈折ベクトル

水の色

水面のライティングに必要な要素に、もう一つ、「水の色」がある。

そう、水そのものの色だ。

水が泥で薄汚れている場合や、ジュースのような特定の彩色を伴っている"水"もある。そうした要素への配慮だ。

具体的には反射や屈折で得たテクセルに一定の色変調を行う簡易的な方法もあるが、フレネル反射の要領で、視線角度が水面に対して垂直なほど透明度が高く、視線角度が水面に対して掠めるほど水の色が支配的になるというバランス制御を行うという手法もある。

また、水は水深が深いほど不透明度が増して水の色が濃く見えるので、水面付近が最も水の色が薄く透明度が高くなるようにして、水深が深い箇所であればあるほど水の色が濃くなるように制御する方法もしばしば用いられる。

水の不透明度の演出に際し、「3DMark06」(Futuremark,2006)では、水面下に下方向に行けば行くほど濃くなるフォグ(高さフォグ、Yフォグなどと呼ばれる)を発生させ、水深がとても深い感じを表現していた。(続く)

「3DMark06」(Futuremark,2006)より。水面から水底方向にフォグを発生させることで、水深が深い情景が霞んで見えるようになり水深が深い感じが表現できる。湖や大海のような水面の表現には効果的かもしれない

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