Skip to content

第03回 プロシージャルノイズと FBM

前回: 第02回 HLSL の制御構文と反復計算

今回の授業内容

  • 擬似乱数と連続ノイズの違いを理解する
  • 格子ごとの乱数値を補間して Value Noise を作る
  • 複数の周波数をループで合成し、FBM を作る
  • Scale、Octaves、Lacunarity、Gain を調整する
  • 雲、岩、水面に適した密度マスクを作る

テクスチャーを使わずに値を作る

プロシージャルノイズは、座標から毎回同じ値を計算します。画像テクスチャーを用意せず、大きさや時間を自由に変更できます。一方で、ピクセルごとに計算が必要です。

hlsl
float Hash21(float2 p)
{
    p = frac(p * float2(123.34, 456.21));
    p += dot(p, p + 45.32);
    return frac(p.x * p.y);
}

Hash 関数は座標を0から1の値へ変換します。暗号用の乱数ではなく、視覚表現のための擬似的な値です。

Value Noise を作る

UV を整数部と小数部に分け、4隅の乱数値をなめらかに補間します。

hlsl
float ValueNoise(float2 p)
{
    float2 cell = floor(p);
    float2 local = frac(p);
    float2 smoothLocal = local * local * (3.0 - 2.0 * local);

    float a = Hash21(cell);
    float b = Hash21(cell + float2(1.0, 0.0));
    float c = Hash21(cell + float2(0.0, 1.0));
    float d = Hash21(cell + float2(1.0, 1.0));

    float bottom = lerp(a, b, smoothLocal.x);
    float top = lerp(c, d, smoothLocal.x);
    return lerp(bottom, top, smoothLocal.y);
}

floor で格子番号、frac で格子内の位置を取得します。補間前に小数部を曲線で変形すると、格子の境界で値がなめらかにつながります。

FBM で大小の模様を合成する

Fractal Brownian Motion(FBM)は、周波数と振幅の異なるノイズを重ねる方法です。

hlsl
float Fbm(float2 p, int octaves, float lacunarity, float gain)
{
    float value = 0.0;
    float amplitude = 0.5;
    float frequency = 1.0;

    [loop]
    for (int i = 0; i < 8; i++)
    {
        if (i >= octaves) break;
        value += ValueNoise(p * frequency) * amplitude;
        frequency *= lacunarity;
        amplitude *= gain;
    }

    return value;
}
役割
octaves重ねるノイズの数
lacunarity次の周波数の倍率
gain次の振幅の倍率

Octaves を増やすと細部が増えますが、ノイズ関数の実行回数も増えます。

実習:3種類の密度を設計する

  1. UV に Value Noise を表示する
  2. FBM を実装し、Octaves を1から6まで変える
  3. UV に時間を加え、ノイズを流す
  4. smoothstep で密度の範囲を制御する
  5. 次の3設定を作成する
用途特徴
大きな形とやわらかい境界
高い周波数と硬いしきい値
方向性のある座標変形と時間変化

授業内課題:ドメインワープ

1つ目の FBM を座標のずれに使い、2つ目の FBM を読みます。

hlsl
float2 warp = float2(
    Fbm(p, 4, 2.0, 0.5),
    Fbm(p + 17.3, 4, 2.0, 0.5)
);
float organic = Fbm(p + warp * warpStrength, 5, 2.0, 0.5);

単なる加算よりも、流れやうねりを持つ有機的な模様になります。

完成条件

  • Hash、Value Noise、FBM の役割を順番に説明できる
  • Octaves、Lacunarity、Gain を調整できる
  • 目的の異なる3種類の密度マスクを作成している
  • ループの最大回数が固定されている

今回のまとめ

プロシージャルノイズは座標から値を生成します。FBM で大きな形と小さな細部を合成し、ドメインワープで座標自体をゆがめると、雲、煙、岩、水の基礎となる密度を作れます。

次回: 第04回 レイとカメラ、座標空間