ひとことで
周波数を上げ、振幅を下げながら同じノイズを何層も足し合わせる手法です。山並みの大きな起伏に、尾根の凹凸、岩肌のざらつきと、大きさの違う細部が同時に存在する自然物らしさを 1 つの関数で作れます。1 層ごとを音楽になぞらえてオクターブと呼びます。
ゲームでの使いどころ
- 地形の高さマップ:オープンワールドの山や丘の土台。ここに侵食や川の処理を加えて仕上げるのが定番です。
- 雲・霧・煙の濃度:ボリュームレンダリングする雲の密度場は、ほぼ必ず fBm(や後述の変種)です。
- テクスチャのムラ:汚れ、錆、苔の広がり、布の色ムラ。単一のノイズでは出ない「近くで見ても遠くで見ても情報がある」質感になります。
- カメラシェイク:時間を入力にした数オクターブの fBm は、大きな揺れに細かな振動が乗った自然な揺れになります。
しくみ
基本のノイズ に対して、 オクターブの fBm は次のように定義します。
| パラメータ | 意味 | よく使う値 |
|---|---|---|
| オクターブ数 | 重ねる層の数 | 4〜8 |
| ラクナリティ | 1 層ごとの周波数の倍率 | 2.0 |
| ゲイン | 1 層ごとの振幅の倍率 | 0.5 |
のとき、振幅は 1, 0.5, 0.25, … と半分ずつ小さくなり、細部ほど弱く効きます。これは自然の地形が持つ自己相似性(拡大しても似た起伏が現れる性質)を近似しています。ゲインは Hurst 指数 と の関係にあり、 が大きいほど滑らかな地形、小さいほどざらついた地形になります。
名前の「ブラウン運動」は、このスペクトル(周波数が倍になるとパワーが一定の割合で減る)がブラウン運動の軌跡と似ていることに由来します。ここでの fBm は描画のための重ね合わせであり、粒子のブラウン運動を時間発展させるものではありません。
実装のポイント
- 層ごとに回転・オフセット:同じ原点のまま周波数だけ上げると、格子点が重なって規則的な模様が出ます。
- オクターブ数は距離で変える:画面上で 1 画素より細かい層は見えないうえ、ちらつきの原因になります。カメラからの距離や画面上のサイズに応じて層数を減らすと、負荷とエイリアスの両方を抑えられます。
- 正規化:合計振幅 で割っておくと、オクターブ数を変えても全体の高さが変わりません。
つまずきやすい点
- 重さ:層の数だけノイズを評価するので、8 オクターブならコストも約 8 倍です。地形なら生成時に一度だけ計算してキャッシュします。
- どこでも同じ粗さ:素の fBm は谷も山頂も同じ粗さになり、「ノイズっぽい」地形になりがちです。谷を滑らかにしたいならリッジノイズのような多重フラクタルや、水食侵食を組み合わせます。
- ラクナリティがちょうど 2.0:層どうしの格子が一致しやすくなります。2.01 のようにわずかにずらすのも手です。
デモで試すこと
- 「オクターブ数」を 1 から順に増やしてください。奥のグラフで新しい波形が追加されるたびに、地形に一段細かい起伏が加わります。
- 「ゲイン」を 0.7 付近まで上げると、細かい層が強く残ってザラザラの岩山に、0.3 付近まで下げるとなだらかな丘陵になります。
- 黄色い線は の断面です。グラフの「合計」の波形と同じ形をしていることを確かめてください。