9 海をつくる

7 ノイズをつくろう8 フレネル反射をつくる を組み合わせる。

パーリンノイズをハイトマップ(高さを定義したマップ)としてつかう。ddxddy という、部分微分(隣のピクセルとの差分)を取得できる関数をつかう。この外積(ベクトルとベクトルをあわせてつくったひし形に垂直なベクトル)を法線としてつかうことで、波立たせることができる。

normal = cross (
    float3(0,ddy(height),1),
    float3(1,ddx(height),0)
)

4 スクロールする水面を作る のように uv スクロールさせて波を動かす。

i.uv.x += 0.1 * _Time;
i.uv.y += 0.2 * _Time;

これで波そのものはできたが、エイリアシング(遠景の波が細かく表示され見た目が悪くなる現象)が発生する。

エイリアシングによって遠景の波が細かくなりすぎている

そこで、カメラと法線のベクトルの内積が 0 に近いほど急速に出力も 0 に近づいていく関数を導入する。今回はシグモイド関数をつかう。

σ(x)=11+ex\sigma(x) = \frac{1}{1+e^{-x}}

好きな形に近づけていく。

σ(x)=11+e60x+5\sigma(x) = \frac{1}{1+e^{-60 \cdot x + 5}}

xが0に近づくにつれて急速にyが0に近づくグラフ

フレネル反射で既に内積を求めているため、変数を拝借する。

//フレネル反射
half vdotn = saturate(dot(viewDir, i.normal));
...

//エイリアシングを防ぐための重みづけ
float weight = 1.0 / (1.0 + exp(-60.0 * vdotn + 5.0));

//パーリンノイズを生成
float height = noise(i.uv * 64) * weight;

これで、見た目の良い波ができた。

エイリアシングが消え、なだらかな波がたつ夜の海


バックリンク

ネットワーク

site_graph 20241209-develop-index 🔧技術 - インデックス 20250213-start-shader そろそろシェーダーをはじめる 20241209-develop-index->20250213-start-shader 20250213-1-write-ice-shader 1 氷のようなシェーダーを書く 20250213-2-highlight-outline 2 輪郭を浮かび上がらせる 20250213-3-create-stained-glass 3 ステンドグラスをつくる 20250213-4-create-scroll-water-surface 4 スクロールする水面を作る 20250213-5-blend-texture 5 テクスチャをブレンドする 20250213-6-move-circle-and-ring 6 円やリングを動かす 20250213-7-create-noise 7 ノイズをつくろう 20250213-8-create-fresnel-reflecting 8 フレネル反射をつくる 20250213-9-create-sea 9 海をつくる 20250213-9-create-sea->20250213-4-create-scroll-water-surface 20250213-9-create-sea->20250213-7-create-noise 20250213-9-create-sea->20250213-8-create-fresnel-reflecting 20250213-start-shader->20250213-1-write-ice-shader 20250213-start-shader->20250213-2-highlight-outline 20250213-start-shader->20250213-3-create-stained-glass 20250213-start-shader->20250213-4-create-scroll-water-surface 20250213-start-shader->20250213-5-blend-texture 20250213-start-shader->20250213-6-move-circle-and-ring 20250213-start-shader->20250213-7-create-noise 20250213-start-shader->20250213-8-create-fresnel-reflecting 20250213-start-shader->20250213-9-create-sea