勾配ノイズ
https://gyazo.com/b8d87a3d9fa12034e6175c566b0c4339
簡単のために1次元で考えると、格子点に固定値ではなく1次関数があるイメージ。傾きは乱数。格子点から坂道が伸びていて、その坂道の寄与分(高さ)が観測する位置によって変わる感じ。 2次元では傾きが(a,b)のような勾配になるだけで、考え方は同じ。勾配ベクトルと、格子点からの距離ベクトルの内積をとることで、その地点での『高さ』を計算する。あとは格子点間をエルミート補間などで補間することで完成。 code:glsl
// リアルタイムグラフィックスの数学 第3章より
float gnoise21(vec2 p){
vec2 n = floor(p);
vec2 f = fract(p);
for (int j = 0; j < 2; j ++){
for (int i = 0; i < 2; i++){
vec2 g = normalize(hash22(n + vec2(i,j)) - vec2(0.5)); // 勾配と格子点からの距離の内積をとり、格子点の値を決定
vi+2*j = dot(g, f - vec2(i, j)); // 勾配と距離の内積をとり、各頂点からの「高さ(寄与)」を算出 }
}
f = f * f * f * (10.0 - 15.0 * f + 6.0 * f * f); // 格子点間をエルミート補間(5次関数)
return 0.5 * mix(mix(v0, v1, f0), mix(v2, v3, f0), f1) + 0.5; }
格子点に固定の乱数を割り振り、その間を補間して作られる値ノイズにくらべてブロック状のムラが現れづらいが、計算コストは若干高い。