手続き的ノイズ(Perlin・Simplex)
地形やテクスチャを画像なしで無限に生成できる手続き的ノイズを、勾配ノイズの原理とfBmのオクターブ合成から理解し、格子アーティファクトや異方性の破綻を避けて設計できるようになります。
- 1.Perlin は格子点の擬似乱数な勾配ベクトルと距離ベクトルの内積を滑らかに補間する勾配ノイズで、値ノイズと違い格子点で常に0を通り滑らかな起伏になる。
- 2.Simplex は N 次元を単体(三角形・四面体)で分割し、評価コストを O(2^N) から O(N^2) へ下げ、格子由来の方向性アーティファクトも軽減した改良版。
- 3.fBm は周波数を2倍・振幅を半分にしたノイズを数オクターブ重ねて自己相似な細部を作り、地形・雲・岩肌など自然物の質感を1式で表す。
手続き的ノイズが解く問題
自然物の表面や地形は、完全な規則性も完全なランダムさも持ちません。岩肌・雲・水面・大理石はどれも「近くは似ていて遠くは違う」という空間的な相関を持ち、これを画像テクスチャで用意すると解像度とメモリに縛られ、継ぎ目やタイル反復も避けられません。手続き的ノイズ(procedural noise) は、座標を入力すると滑らかで再現可能な擬似乱数値を返す関数で、この相関構造を関数として持ちます。画像を持たずに無限の範囲を任意解像度で評価でき、テクスチャマッピング の代替やパラメータ生成に使われます。
要件は明確です。(1) 同じ座標には常に同じ値を返す(決定的・再現可能)、(2) 隣接座標の値は連続かつ滑らか(微分可能が望ましい)、(3) 統計的にはランダムに見え、特定の方向やパターンが目立たない(等方的)、(4) 局所評価が可能で並列化しやすい。GPU の シェーダ で1ピクセルごとに独立評価するため、ルックアップテーブル依存は最小に抑えます。
値ノイズと勾配ノイズの違い
最も素朴な構成が 値ノイズ(value noise) です。整数格子の各点に擬似乱数の「値」を割り当て、格子内はその値を補間します。実装は簡単ですが、格子点で値が極値になりやすく、補間しても水平方向のブロック感(格子の目)が残りがちです。
Ken Perlin が1985年に導入した 勾配ノイズ(gradient noise)=パーリンノイズ は、格子点に値ではなく 勾配ベクトル(向き) を割り当てます。ある入力点 P の値は、周囲の各格子点について「その格子点の勾配ベクトル」と「格子点から P へ向かう距離ベクトル」の 内積 を取り、それらを補間して求めます。
2次元パーリンノイズ(1セル分):
格子セルの四隅を (x0,y0)…(x1,y1) とする
各隅 c の勾配 g[c] を座標ハッシュから決定(擬似乱数な単位ベクトル)
各隅からの寄与 = 内積( g[c], P − c )
n00 = dot(g00, (fx , fy ))
n10 = dot(g10, (fx-1, fy ))
n01 = dot(g01, (fx , fy-1))
n11 = dot(g11, (fx-1, fy-1))
補間の重み f(t) でブレンド:
nx0 = lerp(n00, n10, f(fx))
nx1 = lerp(n01, n11, f(fx))
out = lerp(nx0, nx1, f(fy))
この構成の核心は、内積は格子点そのものでは距離ベクトルが0になるため必ず0を返す 点です。値ノイズが格子点で極値を作るのに対し、勾配ノイズは格子点でゼロ交差し、その周りで勾配が定める向きへ滑らかに立ち上がります。結果として起伏が自然で、格子の目が出にくくなります。出力範囲はおおむね -1..1(正確な限界は次元と勾配集合に依存し、2次元では約 ±0.707)に収まります。
線形補間(f(t)=t)で格子をつなぐと、格子境界で値は連続でも 一次微分(傾き)が不連続 になり、平坦な陰影に折れ目(マッハバンド状の筋)が見えます。Perlin の当初版は 3t²−2t³(一次微分が境界で0)を使いました。1次微分は連続ですが2次微分が跳ぶため、法線マップのように傾きを微分で使う用途では筋が残ります。改良版(Improved Noise, 2002)は 6t⁵−15t⁴+10t³ を採用し、境界で一次・二次微分がともに0になって、より滑らかになります。
Simplex ノイズ ── 次元の呪いへの対処
パーリンノイズの弱点は高次元でのコストと格子由来の異方性です。N 次元では超立方体の 2^N 個の隅すべてで内積と補間が必要で、4次元なら16隅、次元とともに指数的に増えます。さらに軸に沿った正方格子は、対角方向と軸方向で見た目の粗さが変わる 方向性アーティファクト(等方性の崩れ)を生みます。
Perlin 自身が2001年に提案した Simplex ノイズ は、空間を超立方体ではなく 単体(simplex) で敷き詰めます。単体は N 次元で頂点が最も少ない充填形状で、2次元では三角形、3次元では四面体です。頂点数は N+1 個に線形化され、評価コストは O(N^2) 程度に下がります。手順は、入力座標をスキュー変換して単体格子へ写し、点がどの単体に属するかを判定し、その N+1 個の頂点からの寄与を合成します。
Simplex の骨子(2次元):
1. 入力 (x,y) をスキューして単体格子座標へ:
s = (x + y) * F2 (F2 = (√3 − 1)/2)
i = floor(x + s), j = floor(y + s)
2. 属する三角形の3頂点を特定(下三角か上三角かを場合分け)
3. 各頂点 v について:
減衰 = max(0, 0.5 − |P − v|²)
寄与 = 減衰⁴ × dot(gradient[v], P − v)
4. 3頂点の寄与を総和(線形補間ではなく放射状の重み関数)
パーリンの格子補間と違い、Simplex は各頂点からの寄与に 距離に応じた放射状の減衰カーネル((0.5 − r²) の4乗など)を掛けて足し合わせます。補間の場合分けが不要になり、勾配も解析的に求めやすく、方向性アーティファクトも軽減されます。
Perlin の Simplex ノイズには、特に3次元以上の実装に関わる米国特許(2022年に失効)が長く存在し、これを避けるために OpenSimplex ノイズ が作られた経緯があります。OpenSimplex は単体ではなく別の格子(体心・面心立方に基づく多面体)を用い、目的の等方性を保ちつつ特許を回避します。ライブラリを選ぶ際は、3次元・4次元でのアーティファクトの少なさと素性(Simplex 系か OpenSimplex 系か)を確認するとよいでしょう。
Worley ノイズ ── 距離ベースのセルパターン
勾配ノイズとは発想の異なる Worley ノイズ(セルラーノイズ、ボロノイノイズ) も重要です。空間に擬似乱数で特徴点(feature points)を散らし、各評価点から 最も近い特徴点までの距離 F1、2番目に近い距離 F2 などを返します。F1 はボロノイ領域のような細胞状パターンを、F2 − F1 は細胞の輪郭(境界線)を強調したパターンを生みます。
石畳・爬虫類の鱗・ひび割れ・水面のコースティクス・多孔質な質感に向き、勾配ノイズの滑らかな起伏とは相補的です。実務では両者を組み合わせ、Worley で構造(セル・輪郭)を、Perlin/Simplex で内部のゆらぎを与えることが多くあります。
| 種類 | 格子点に持つもの | 特徴と主な用途 | コストの目安 |
|---|---|---|---|
| 値ノイズ | 擬似乱数の値 | 実装が簡単。格子の目が出やすい。ラフな下地に | 低 |
| Perlin(勾配) | 勾配ベクトル | 格子点で0交差し滑らか。高次元で2^N の隅を要す | 中 |
| Simplex | 勾配ベクトル | 単体分割でO(N^2)。等方性が良く高次元に強い | 中 |
| Worley(セル) | 特徴点の位置 | 距離ベースの細胞・輪郭パターン。鱗やひび | 点数に依存 |
フラクタルブラウン運動(fBm)とオクターブ合成
単一のノイズは1つの周波数帯しか持たず、のっぺりとして見えます。自然物は「大きなうねりの上に中くらいの凹凸、その上に細かいざらつき」という 多重スケールの自己相似性 を持ちます。これを模すのが フラクタルブラウン運動(fractional Brownian motion, fBm) で、周波数と振幅を段階的に変えたノイズ(オクターブ)を重ね合わせます。
fBm(オクターブ合成):
value = 0
amplitude = 1
frequency = 1
for i in 0..octaves:
value += amplitude * noise(P * frequency)
frequency *= lacunarity // 通常 2.0(周波数を倍に)
amplitude *= gain // 通常 0.5(振幅を半分に = persistence)
// 必要なら振幅総和で正規化して -1..1 に収める
各オクターブで 周波数を lacunarity 倍(ふつう2=1オクターブ上)、振幅を gain 倍(ふつう0.5)にするのが基本形です。gain(persistence とも呼ぶ)を上げると高周波成分が強まり荒々しく、下げると滑らかになります。オクターブ数は最終的な表示解像度で意味を持つ最小波長までに留めます(それ以上足しても1ピクセル未満の変化は見えず、後述のエイリアシングを招くだけ)。
fBm の派生も表現の幅を広げます。各オクターブの値の 絶対値 を取ってから合成すると、折り返しで尖った稜線が生まれる リッジドノイズ(ridged multifractal) になり、山脈の鋭い尾根の生成に向きます。オクターブごとの振幅を直前のノイズ値で変調すると、高地ほど起伏が激しいといった 不均一な多重フラクタル が作れます。
lacunarity を厳密に 2.0 にすると、各オクターブの格子が同じ整数座標で重なり、格子点(勾配ノイズが必ず0を通る点)が全オクターブで揃ってしまい、うっすらと周期的な格子の痕跡が残ることがあります。実務では 1.9〜2.1 のような非整数にずらす、あるいはオクターブごとに座標を無理数分だけ平行移動・微小回転させると、格子の相関が崩れてより自然になります。
エイリアシングと帯域制限
手続き的ノイズは連続関数なので、任意に高い周波数まで含み得ます。これをスクリーン上で離散サンプリングすると、ピクセル間隔(ナイキスト周波数)を超えた高周波が偽のパターンとして折り返す エイリアシング を起こします。遠景のノイズテクスチャがチラチラと明滅するのはこの症状で、原理は アンチエイリアシング や ミップマップ で扱うテクスチャの縮小問題と同じです。
対策の要点は 周波数の上限をサンプリング密度に合わせて動的に切ること(band-limiting)です。ノイズを事前計算してテクスチャ化するならミップマップが効きますが、シェーダ内で毎回評価する手続き的ノイズでは、ピクセルが覆う領域のサイズ(テクスチャ座標の画面微分 fwidth 相当)を見て、それより細かいオクターブの寄与をフェードアウトさせる手法が使われます。
解析的アンチエイリアス(オクターブのフェード):
px = 画面1ピクセルが覆うノイズ空間の幅 // fwidth(P) など
for i in 0..octaves:
wavelength = 1.0 / frequency
// このオクターブが1ピクセルより細かいなら寄与を落とす
fade = smoothstep(px, px*2.0, wavelength)
value += amplitude * fade * noise(P * frequency)
...
高周波オクターブほど遠景で先に消えるため、近景は細部が出て遠景は滑らかになり、破綻しません。
応用 ── 地形とテクスチャ生成
地形(ハイトマップ) では、水平座標 (x,z) を入力に fBm を評価し、その戻り値を高さ y に使います。lacunarity と gain で山岳の荒々しさを、オクターブ数で最小地形フィーチャの細かさを制御します。リッジドノイズを混ぜれば尾根を、Worley を減算すればクレーターや谷を刻めます。生成後の メッシュ化 では、高さの隣接差分から法線を求めて陰影を付けます。
テクスチャ では、ノイズ値を色や材質パラメータに写像します。大理石は「基準座標 + ノイズで摂動した位相」を正弦波に通して縞を歪ませ、木目は同心円の距離にノイズを加えます。生成したノイズは PBR の roughness や albedo、法線マップ、あるいはアルファのマスクとして流し込め、1枚の画像に固定されない解像度非依存のディテールになります。3次元ノイズを使えば、切断面が連続する ソリッドテクスチャ(木や岩を「削り出した」ような内部構造)も表現できます。
・値ノイズと勾配(Perlin)ノイズの違い:前者は格子点に値、後者は勾配ベクトルを持ち、勾配ノイズは距離ベクトルとの内積により格子点で必ず0を通る。 ・Simplex が Perlin を改良した点:超立方体(2^N 隅)ではなく単体(N+1 頂点)で分割し、コストを O(N^2) 級に下げ方向性アーティファクトを軽減。 ・fBm の3パラメータ:オクターブ数・lacunarity(周波数倍率、ふつう2)・gain/persistence(振幅倍率、ふつう0.5)。 ・ノイズのエイリアシング対策は、ピクセルが覆う幅より細かい高周波オクターブを解析的にフェードする band-limiting。
まとめ
- 手続き的ノイズは座標から再現可能で滑らかな擬似乱数値を返す関数で、画像を持たずに無限・任意解像度のディテールを生む。
- Perlin(勾配ノイズ) は格子点に勾配ベクトルを置き、距離ベクトルとの 内積 を滑らかな多項式(
6t⁵−15t⁴+10t³)で補間するため、格子点で0交差し起伏が自然になる。 - Simplex は空間を単体で敷き詰めて頂点数を
N+1に線形化し、高次元コストと方向性アーティファクトの両方を改善する。 - Worley(セルラー) は特徴点までの距離
F1/F2から細胞・輪郭パターンを作り、勾配ノイズと相補的に使う。 - fBm は周波数2倍・振幅半分のオクターブを重ねて自己相似な細部を作り、地形・テクスチャ・雲の質感を1式で表現する。遠景の エイリアシング は高周波オクターブの解析的フェードで抑えるのが定石。
グラフィックス Article
手続き的ノイズ(Perlin・Simplex)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
グラフィックス
比較で見る軸
難易度: advanced / カテゴリ: グラフィックス / タグ数: 6
導入後に効く点
Simplex は N 次元を単体(三角形・四面体)で分割し、評価コストを O(2^N) から O(N^2) へ下げ、格子由来の方向性アーティファクトも軽減した改良版。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- グラフィックス
- タグ数
- 6
判断チェックリスト
- 自社の用途が「グラフィックス / 手続き的生成」に近いか確認する。
- 強みである「Perlin は格子点の擬似乱数な勾配ベクトルと距離ベクトルの内積を滑らかに補間する勾配ノイズで、値ノイズと違い格子点で常に0を通り滑らかな起伏になる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。