海洋シェーダ(海の色)

海洋シェーダ(海の色)

 前回の記事(海洋シェーダ(波の形))では、ゲルストナー波をノイズで変形させることで 海洋における波の形を作成しました。この波に、フレネル反射等を追加することによって海の色を表現します。

基本の色

 海の基本となる色(_SeaBaseColor)にランバート反射で凹凸を付けています。また、波の高さ(wave_height)によって色を変えるために、_SeaShallowColor * wave_height * 0.5 + 0.2) * _ColorHightOffsetを加算しています。

これを実行すると以下のような結果が得られます。各プロパティの値は次の通りです。

_SeaBaseColor(27, 57, 77)、 _SeaShallowColor (75, 89, 35)、_BaseColorStrength(1.5)、_ColorHightOffset(0.15)

フレネル反射

 フレネル反射を追加しました。これには海が反射する空の色が必要となるので、以下のコードで反射ベクトルから空の色を計算しています。

_SkyColor(0, 104, 255)としたとき、空の色は以下のようになります。

この結果をフレネル反射に利用します。

以下の結果が得られます。_BaseColorStrengthを1.5から1.2へ変更しています。

基本色の変更

_SeaBaseColorを変更しても、あまり良い結果が得られませんでした。そこで、基本色の計算式に_SeaShallowColorを加えた以下の計算方法に変更してみました。

実行すると以下のようになります。 _BaseColorStrengthを0.9、_ShallowColorStrengthを0.35としています。

反射光

 海には反射光(スペキュラー)が生じます。そこで、フォン鏡面反射を追加してみました。

結果は以下のようになります。

他の方法を探したところRendering Water as a Post-process Effectに別の方法が掲載されていたので試してみました。

結果は以下のようになります。

shader

 作成したシェーダは以下の通りです。

Ocean.cginc

Noise.cginc

参考サイト

Rendering Water as a Post-process Effect