海洋シェーダ(波の形)

海洋シェーダ(波の形)

 以前、ゲルストナー波(Gerstner Wave)についての記事を掲載しました。このゲルストナー波を用いて海の波をシェーダで作成しました。

ゲルストナー波(8個)

shader

 単純にゲルストナー波を単純に8個組み合わせるシェーダです。法線は近接する頂点を利用して計算しています。また、ランバート反射によって波の凹凸が分かるように処理をしています。

Ocean.cginc

実行結果

 実行結果は以下の通りです。同じような模様が繰り返し現れており、あまり海らしくありません。

直行するゲルストナー波を加える

全てのゲルストナー波に直行する波を加える

shader

 ゲルストナー波を単純に組み合わせるだけでなく、直行するゲルストナー波を発生させ、組み合わせてみました。

Ocean.cginc

実行結果

 実行結果は以下の通りです。先ほどより良くなりましたが、波を16個も合成するのは多すぎるので、以下のように、直行するゲルストナー波を半分に減らしてみました。

直行するゲルストナー波を減らす

shader

 先ほどのシェーダでは全てのゲルストナー波に対して直行する波を発生させていましたが、振幅の大きい4個のゲールトナー波はそのまま、残りのゲルストナー波に直行するゲルストナー波を発生させ組み合わせました。つまり、合計で12個のゲルストナー波を発生させています。

実行結果

 実行結果は以下の通りです。 波の数は16個から12個へ減りましたが、見た目はほとんど変わっていません。

ノイズによる歪みの追加

shader

 ノイズによってゲルストナー波を計算する座標を移動させることで、細かい凹凸を追加しました。

Ocean.cginc

Noise.cginc

実行結果

 実行結果は以下の通りです。 ノイズによって細かい凹凸が追加され、より海らしくなりました。

参考サイト

GPU Gems:Chapter 1. Effective Water Simulation from Physical Models