Noise & irregularity

Value Noise

バリューノイズ

格子点の乱数値を補間して柔らかい模様を作る。

4 / 10

Interactive demo

Preparing the demo…

Value Noise

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

格子点に乱数の値そのものを置き、その間を補間するもっとも素朴なノイズです。勾配を使うパーリンノイズより単純で速く、実装も数行で済みます。そのぶん格子の癖が出やすいので、重ねて使ったり、細部より「ぼんやりした変化」がほしい場面に向いています。

ゲームでの使いどころ

  • 明かりのちらつき:時間を入力にした 1 次元の値ノイズで、たいまつや蛍光灯の明るさを揺らします。安いうえに十分それらしく見えます。
  • 雲の影・霧の濃淡:地面に落ちる大きな雲影など、ぼやけていてよい模様。
  • fBm の下地:何オクターブも重ねると格子の癖が目立たなくなるので、コスト重視の地形や雲に使われます。
  • CPU での手軽な乱数場:勾配ベクトルの表を持たなくてよいので、サーバー側の生成処理などにも組み込みやすいです。

しくみ

2D の場合、点 p\mathbf{p} を含むセルの 4 隅の乱数値 a,b,c,da, b, c, d を、セル内の位置 (u,v)(u, v) で双線形補間します。

noise(p)=lerp(lerp(a,b,w(u)),  lerp(c,d,w(u)),  w(v))\text{noise}(\mathbf{p}) = \text{lerp}\big(\text{lerp}(a, b, w(u)),\; \text{lerp}(c, d, w(u)),\; w(v)\big)

ここで重み関数 w(t)w(t) の選び方が見た目を大きく左右します。

補間重み w(t)w(t)見た目
最近傍t<0.5t < 0.5 なら 0、それ以外 1段差のあるブロック。値が連続しない
線形tt値は連続するが、格子線で傾きが急変し折れ目が出る
スムーズ3t2−2t33t^2 - 2t^3(smoothstep)格子点で傾きが 0 になり、折れ目が消える

時間方向にも同じ考え方が使えます。整数時刻ごとに乱数を決めて、その間を smoothstep で補間すれば、値がなめらかに移り変わります(デモの「時間方向にも補間」)。

実装のポイント

  • 5 次の重み:6t5−15t4+10t36t^5 - 15t^4 + 10t^3 に替えると、2 階微分まで連続になり、法線を計算したときの格子模様がさらに減ります。
  • テクスチャで代用:乱数を並べた小さなテクスチャをバイリニアで拡大するだけでも、線形補間の値ノイズになります。GPU ではこれが最速です。

つまずきやすい点

  • 格子の模様が見える:値の最大・最小が必ず格子点に来るため、1 層だけだと規則的な「こぶ」の並びに見えます。回転させた座標で複数層を重ねると緩和できます。
  • 低周波の成分が強い:値ノイズはパーリンノイズに比べて大きな塊ができやすく、コントラストが格子ごとにばらつきます。細かい模様にはパーリン系が向きます。
  • ハッシュの品質:fract(sin(x) * 43758.5) 型のハッシュは GPU によって精度が異なり、座標が大きいと縞が出ます。整数演算ベースのハッシュの方が安全です。

デモで試すこと

  1. 補間を最近傍 → 線形 → スムーズと切り替え、面の変化を観察してください。黄色いピン(格子点の乱数値)は同じまま、間のつなぎ方だけが変わっています。
  2. 「格子の数」を増やすと、同じ面積により細かな起伏が入ります。これを何層も重ねたのが fBm です。
  3. 「乱数を振り直す」で別の地形になります。シード値を変えるだけで無数のバリエーションが得られるのが手続き的生成の利点です。

References

Curl-Noise for Procedural Fluid Flow ↗

A general reference for this subcategory.