Appearance
第03回 プロシージャルノイズと FBM
今回の授業内容
- 擬似乱数と連続ノイズの違いを理解する
- 格子ごとの乱数値を補間して 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種類の密度を設計する
- UV に Value Noise を表示する
- FBM を実装し、Octaves を1から6まで変える
- UV に時間を加え、ノイズを流す
smoothstepで密度の範囲を制御する- 次の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回 レイとカメラ、座標空間