はじめに
前回の記事では、Voronoi Noiseを用いて岩肌やクリスタルといった「構造的な自然物」を錬成しました。これで、滑らかな自然を作る Perlin Noise と、構造を作る Voronoi Noise という2大巨頭を手に入れたことになります。
しかし、ノイズの探求はここで終わりません。 今回は再び「アルゴリズムの進化」に目を向けます。
実は、私たちがこれまで使ってきた標準的な Perlin Noise には、「高次元になると計算が重すぎる」「よく見ると四角い跡(アーティファクト)が見える」 という致命的な弱点がありました。
この問題を劇的に解決し、Perlin Noiseを「過去の技術」へと追いやった天才的なアルゴリズム。それが、Perlin Noiseの生みの親であるKen Perlin氏自身が2001年に発表した『Simplex Noise(シンプレックス・ノイズ)』です。
今回は、このSimplex Noiseの「天才的な閃きの構造」を図解で直感的に理解していきましょう。
前回の記事:
[Noise 入門 #13] Voronoi Noiseの実践 — 数式で「岩肌」「ひび割れ」「クリスタル」を錬成する
Noise 入門シリーズ第13回。前回学んだVoronoiの概念をShader(GLSL)の実装へと落とし込みます。F1とF2の組み合わせによるテクスチャ表現のバリエーションや、Domain Warpingとの融合による有機的な質感作りまでを網羅。
https://humanxai.info/posts/noise-intro-13-voronoi-applications/1. Perlin Noise が抱えていた2つの「限界」
1985年に Ken Perlin によって生み出された Perlin Noise は、CG界に「自然な乱数」という革命をもたらしました。しかし、ハードウェアが進化し、リアルタイムでの 3D 生成や 4D(3D + 時間)の計算が求められるようになるにつれ、このアルゴリズムが根本的に抱える2つの致命的な弱点が浮き彫りになってきました。
Simplex Noise の美しさを真に理解するために、まずは前時代(Perlin Noise)の限界を深掘りしてみましょう。
弱点①:次元の呪い — 計算量の爆発 ($O(2^N)$)
Perlin Noise は、空間を「四角形(あるいは立方体)」のグリッドで分割して計算します。 任意の座標 が与えられたとき、その点を囲む 「すべてのグリッドの頂点」 との距離と勾配(Gradient)を計算し、それらを補間(Interpolation)することで最終的な値を導き出します。
ここでの問題は、「次元が上がるごとに、頂点の数が倍増していく」 という点です。数学的には計算量が となり、いわゆる指数関数的な爆発を起こします。
- 2D(平面): 四角形の 4つ の頂点を計算 ($2^2$)
- 3D(立体): 立方体の 8つ の頂点を計算 ($2^3$)
- 4D(立体+時間): 超立方体(Tesseract)の 16個 の頂点を計算 ($2^4$)
「たかだか16個なら大したことないのでは?」と思うかもしれません。しかし、これまでの記事でやってきた FBM(Fractal Brownian Motion) を思い出してください。
もし 4D の Perlin Noise に 5 オクターブの FBM を掛けた場合、1ピクセルあたり 16頂点 × 5回 = 80回 もの内積と補間計算が走ります。これをフルHDや4Kの解像度で毎フレーム(60fps)Shaderで回せば、途端にGPUの処理限界を叩いてしまいます。動く Volumetric Clouds(#09)などを実装する際、この計算コストの重さは致命傷になります。
弱点②:アーティファクト — 四角いグリッドの「跡」が見える
2つ目の弱点は、ビジュアルの品質に関わる問題です。 Perlin Noise は、直交座標系(X軸・Y軸・Z軸に綺麗に直角に交わるグリッド)をベースにしています。この「きっちりとした四角形」の上で補間を行うため、出力結果には構造上の 「方向的な偏り(Directional Bias)」 が生まれてしまいます。
これを遠くから引いて見たり、コントラストを強くしたりすると、以下の現象が起きます。
- 十字のうっすらとした線: 縦横の軸に沿って、グリッドの境界線がうっすらと見えてしまう。
- 対角線の偏り: 45度の斜め方向に、不自然な規則性を持ったパターン(カクつき)が連続して現れる。
自然界の大地や雲には、誰かが定規で引いたような「X軸・Y軸」は存在しません。ランダムであるべき自然物の中に、うっすらと「方眼紙の跡」が見えてしまうこの現象(アーティファクト)は、プロシージャル生成において長らく「CG特有の作り物っぽさ」の原因となっていました。
この2つの限界(重すぎる計算コストと、直交グリッドによる不自然さ)を前に、生みの親である Ken Perlin 自身が「四角形のグリッドを使うこと自体が間違っていたのではないか?」という根本的なパラダイムシフトに辿り着きます。
それが、次項の「四角形から三角形への進化」へと繋がっていきます。
2. 天才の閃き:「四角形」をやめて「三角形」にする
前述した「重すぎる計算コスト」と「不自然なアーティファクト」。
この2つの呪縛から逃れるため、Ken Perlin氏が目をつけたのは、空間を区切る「基準となる図形(グリッド)そのものの形」でした。
「もし、空間を埋め尽くす図形の中で、一番『頂点』が少ないものを使えば、計算量は最小になるのではないか?」
このコロンブスの卵とも言える発想から導き出されたのが、数学や幾何学における「単体(Simplex)」という概念です。
「単体(Simplex)」とは何か?
単体(シンプレックス)とは、特定の次元において「空間を構成するために必要な、最小限の頂点を持つ図形」のことを指します。簡単に言えば、各次元における「もっともシンプルな形」です。
空間の次元数を N としたとき、単体の頂点の数は常に N + 1 個になります。
- 1D(直線): 線分(2つの頂点)
- 2D(平面): 三角形(3つの頂点)
- 3D(立体): 四面体(4つの頂点)
- 4D(超空間): 五胞体(5つの頂点)
つまり、Simplex Noise は、これまでの方眼紙のような「四角形のグリッド」を完全に捨て去り、「正三角形(高次元では正四面体)」を隙間なく敷き詰めたハニカム構造のようなグリッドの上でノイズを計算するアルゴリズムへと進化したのです。
驚異的な計算コストの削減と恩恵
この「四角形から三角形へのパラダイムシフト」がもたらしたパフォーマンスの向上は、まさに劇的でした。
先ほどの Perlin Noise の計算量(O(2^N))と比較してみましょう。
- 3Dノイズの場合: Perlin Noiseが 8個 の頂点を計算して補間していたのに対し、Simplex Noise(四面体)はたった 4個 の頂点で済みます。(計算コストが半減!)
- 4Dノイズの場合: Perlin Noiseが 16個 の頂点を必要としていたのに対し、Simplex Noise(五胞体)はたった 5個 の頂点で計算が完了します。(計算コストが1/3以下に!)
次元が上がれば上がるほど、指数関数的に増えていた Perlin Noise の計算量に対し、Simplex Noise は多項式的(O(N^2) 程度)に抑えられます。これが、GPUのShader(GLSL)で重い Volume Cloud(3D)や、うねる魔法陣(時間変化を加えた4D)をリアルタイムで描画できる最大の理由です。
アーティファクト(四角い跡)の消失
さらに、このグリッドの変更は「見た目の美しさ」にも直結しました。
正三角形を敷き詰めたグリッドは、四角形のグリッドが持っていた「X軸・Y軸」という強固な方向性(Directional Bias)を持ちません。どの方向から見ても均等に近い距離感を持つため、Perlin Noise 特有の「遠くから見るとうっすら十字の線が見える」「45度方向にカクつきが出る」といった不自然なアーティファクトが消滅します。
結果として、Simplex Noise は計算が圧倒的に軽いだけでなく、より自然界に近い、全方位に滑らかな(Isotropicな)ノイズを生み出すことに成功したのです。
この「幾何学的な美しさ」が伝わる構成に深掘りしてみました。Simplexという名前の由来や、頂点数が N + 1 になる法則を入れることで、数学的な裏付けがより強固になります。
続いて、最も難解とされる「3. Simplex Noise の仕組み(直感ステップ)」(空間を歪ませる Skewing の概念)のセクションを深掘りしていきましょうか?
3. Simplex Noise の仕組み(直感ステップ)
「三角形グリッドが圧倒的に優れているのは分かった。でも、プログラム上の配列や画面のピクセル座標(X軸・Y軸)は、基本的に『四角形』で作られているよね? どうやって三角形を当てはめるの?」
素晴らしい疑問です。ここが Simplex Noise のアルゴリズムにおける最も変態的で、かつ最も賢い部分です。コンピュータが扱いやすい直交座標(四角)と、計算が軽い単体座標(三角)のいいとこ取りをするため、アルゴリズムは以下の3つのステップで「空間の次元を歪めて戻す」というマジックを行います。
Step 1: 空間を歪ませる(Skewing)
いきなり三角形のグリッドを生成するのではなく、まずは私たちがよく知る通常のXY座標の空間(四角形のグリッド)を用意します。そして、この空間全体を対角線方向($X=Y$の方向)にグニャッと引っ張って歪ませます。
すると、正方形だったグリッドが「ひし形」に変形しますよね。 この「ひし形」を対角線でパカッと半分に割ってみてください。見事に、2つの「正三角形(に近い形)」が生まれました。
これが Skewing(スキューイング:歪曲) です。 コンピュータにとって計算しやすい「四角形の座標系」を保ったまま、数学的な計算によって空間を歪ませることで、擬似的に「三角形のグリッド(Simplex)」を作り出しているのです。
Step 2: 自分がどの三角形にいるか特定する(Simplex Identification)
空間を歪ませた「ひし形グリッド」の世界で、次に「現在のピクセル(座標)が、どの三角形の中にいるのか」を判定します。
ひし形は2つの三角形で構成されています。 自分がどちらの三角形に属しているかは、実はとても簡単な条件分岐で判定できます。歪ませた座標の小数点以下の部分を見て、「XとY、どちらの方が大きいか?」を比べるだけです。
- $X > Y$ なら、右下の三角形
- $Y > X$ なら、左上の三角形
四角形の Perlin Noise では無条件で4つの頂点を計算していましたが、Simplex Noise ではこのシンプルな判定を挟むことで、「計算すべき頂点を3つに絞り込む」ことができます。これが計算量削減の最大の鍵です。
Step 3: 元の世界に戻して距離を測り、ノイズを計算する(Unskewing & Radial Attenuation)
計算すべき3つの頂点(高次元なら 個の頂点)が特定できました。 しかし、今はまだ「歪んだ空間(ひし形)」の中です。本当の距離を測るためには、見つけた頂点の座標を元の正しい座標系(Unskewed な空間)に戻す必要があります。
頂点を元の空間に戻したら、あとは Perlin Noise と同じです。 各頂点が持つ「ランダムな勾配ベクトル(Gradient)」と、現在地からの「距離ベクトル」の内積を取ります。
ただし、値の混ぜ方(補間)が Perlin Noise とは異なります。Perlin Noise が XY 軸に沿った補間(smoothstep など)を行っていたのに対し、Simplex Noise は頂点を中心とした「円形(球状)の減衰関数」を使います。これにより、軸の方向にとらわれない、どの角度から見ても自然で滑らかなノイズ(Isotropic Noise)が完成するのです。
💡 ポイント:空間を歪める「魔法の数字」
空間を歪める(Skewing)際、適当に引っ張っているわけではありません。直交座標を美しい正三角形のグリッドに変換するため、2Dの場合は $F_2 = \frac{\sqrt{3}-1}{2}$、元の空間に戻す(Unskewing)ため $G_2 = \frac{3-\sqrt{3}}{6}$ という定数が使われます。
次回 GLSL で実装する際、コードの中にいきなり 0.366025 や 0.211324 という謎の数字が出てきますが、その正体はこの数式が弾き出した「空間を歪めるための魔法の係数」なのです。
4. Perlin vs Simplex 比較まとめ
4. Perlin vs Simplex 比較まとめ
ここまでの解説を踏まえ、Classic Perlin Noise と Simplex Noise の違いを一覧表にまとめました。現代のリアルタイムレンダリング(WebGLや各種3Dエンジンなど)において、なぜ Simplex Noise がプロシージャル生成のデファクトスタンダードとして扱われるのか、その理由がよくわかるはずです。
| 特徴 | Classic Perlin Noise | Simplex Noise |
|---|---|---|
| グリッド形状 | 四角形(Cube) | 三角形(Simplex) |
| 計算量 (3D) | 8頂点(重い) | 4頂点(圧倒的に軽い) |
| 計算の増え方 | 指数関数的 ($O(2^N)$) | 多項式的 ($O(N^2)$) |
| 見た目の自然さ | 縦横の癖(アーティファクト)が出やすい | 癖がなく、全方位により自然で滑らか(Isotropic) |
| 適した用途 | 負荷の少ない軽量な2D表現 | 3D地形生成、4D(時間変化)のリアルタイムアニメーション |
なぜ今でも Perlin Noise が使われることがあるのか?
圧倒的な性能を誇る Simplex Noise ですが、実は 1D や 2D のような低次元においては、空間を歪ませる(Skewing)処理の手間などもあり、Perlin Noise との計算コストの差はそこまで大きくありません。また、Perlin Noise の方がアルゴリズム自体が直感的でゼロから実装しやすいため、「とりあえず2Dのキャンバスにちょっとした揺らぎが欲しい」というケースでは、今でも手軽な選択肢として活躍しています。
しかし、私たちがこれから目指す「うねる魔法陣」「リアルタイムに流れる雲のボリューム」「広大で複雑な3D地形」といった、高次元かつ重厚な表現の世界では、計算量と美しさを兼ね備えた Simplex Noise が必須の技術となります。
次回予告:Simplex Noise を GLSL で実装する
アルゴリズムの理論と「四角形から三角形へ」という天才的な閃きの構造は理解できました。Simplex Noise は「軽くて、綺麗で、高次元に強い」、まさに次世代の魔法の基盤です。
次回(#15)は、この Simplex Noise を GLSL(Shader)で実際に実装 していきます。 あの複雑に見えた Skewing(空間の歪み)の係数をコードに落とし込み、ついに「空間(3D)」や「時間(Time)」をパラメータに加えた うねる4Dノイズ の世界へ突入します。GPUの力を極限まで解放する準備はいいですか?
💬 コメント