Simplex noise
#Perlin_noise #ノイズ #単体_(数学)
https://gyazo.com/0a8a8b23244e8efbfada009b120a2608
Pixel Composerで生成したSimplex noise
Simplex noiseは、Perlin noiseのグリッドを単体 (数学) にしたもの
おなじくKen Perlinによる
グリッド感がより少なく、パフォーマンスが良い
コードは長くなると思うよ
The Book of Shadersの説明、結構しっかりしてる
https://thebookofshaders.com/11/
https://userpages.cs.umbc.edu/olano/s2002c36/ch02.pdf
https://en.wikipedia.org/wiki/Simplex_noise
https://github.com/patriciogonzalezvivo/lygia/blob/04b0151b07833df6ec94c4b56dbae22a93688e91/generative/snoise.glsl
https://cmaher.github.io/posts/working-with-simplex-noise/
手順 (2D)
座標系を三角形状のグリッドに分ける
https://gyazo.com/d9f4844d479c3d609c3ea4d10d0bb4fe
座標系のせん断を行う
code:glsl
const mat2 SKEW = mat2(1.0, 0.0, 0.0, 1.0) + (SQRT3 - 1.0) / 2.0;
const mat2 UNSKEW = mat2(1.0, 0.0, 0.0, 1.0) - (1.0 - 1.0 / SQRT3) / 2.0;
https://gyazo.com/55e7e508fc09b0c7a994f52f982a9b19
各グリッドの角にランダムな方向ベクトルを生成する
https://gyazo.com/08f0bb2e593dabde165c9eee1e7e8f92
各ピクセル、3つの角に対して、角からの相対座標で、ベクトルの向きとの内積を取る
https://gyazo.com/f2358fd3f4f0f9544f50e498a0be0bf3
カーネルと組み合わせて補間する
Simplexの各角からピクセルまでの距離を$ rとおいたとき、$ w = 8 \ {\rm max}(0.6 - r^2, 0.0)^4
https://gyazo.com/38b22ad65469c0089d79b125bac52daa
https://www.shadertoy.com/view/N3lSRM
3Dの場合
Simplexは、各単位立方体ごとに6つ定義される
Simplexは別に正四面体にはならず、ちょっと辺の長さが違う等面四面体となる
単位立方体内のx, y, z座標の大小関係ごとに、4角が定義可能
$ (0, 0, 0)と$ (1, 1, 1)は必ず含まれるよ
table:simplex
大小関係 頂点0 頂点1 頂点2 頂点3
x > y > z (0, 0, 0) (1, 0, 0) (1, 1, 0) (1, 1, 1)
x > z > y (0, 0, 0) (1, 0, 0) (1, 0, 1) (1, 1, 1)
y > x > z (0, 0, 0) (0, 1, 0) (1, 1, 0) (1, 1, 1)
y > z > x (0, 0, 0) (0, 1, 0) (0, 1, 1) (1, 1, 1)
z > x > y (0, 0, 0) (0, 0, 1) (1, 0, 1) (1, 1, 1)
z > y > x (0, 0, 0) (0, 0, 1) (0, 1, 1) (1, 1, 1)
https://gyazo.com/eaa0b8a993496da5b7c34a131b471302
https://www.shadertoy.com/view/sXXSDr