コードは波の形と色を決める部分に大きく分けられる。
- 形
- noise
- octave(重ね合わせ)
- choppy(鋭さ)
- 色
- fresnel的な屈折光と反射光の合成(拡散光で良い)
- 白いギラギラした照り返しを表現するspecular
- 深度とカメラ距離の加味(浅さと深さで明るさ調整)
色についての別の角度からの切り分け。
- 空 (=getSkyColor)
- 球面環境マップのように、シーン全体で共有される球面状の関数があるイメージ
- 海面 (=getSeaColor)
- fresnelモデルを参考にした式で、屈折と反射光を混ぜる(表面での反射を考慮しているイメージ)
- reflectedは単純に空の光を取ってきているだけ
- refractedは海面を突き抜けてきたことで生まれた表面状の色が一様に拡散していることを意図しているように思える。SEA_BASEも加えてアンビエントのようにしている。コメントにあるように、この部分は表面と光源方向を加味した色付けになっている
- attenあたりで海面の高さを元に水の色を強めることで、海中を突き抜けてきた太陽光が、海面が高いほどより反映されて明るくなるように調整。また、カメラが近いほどそれが映えるように調整
- 最後に太陽を考慮してspecularを計算し、加算
- fresnelモデルを参考にした式で、屈折と反射光を混ぜる(表面での反射を考慮しているイメージ)
fresnelの式をもっとスタンダードにしたり、fresnelで屈折と反射を合成する式をgetSeaColorの最後に持ってきつつ、元のシェーダーと近い結果を得る実験。
https://www.shadertoy.com/view/tlXGDj