噪声

介绍
程序生成的随机数列
噪声的种类和产生方式

梯度噪声
将坐标系划分成一块一块的晶格之后在晶格的每个顶点处生成一个随机的梯度(可以理解成方向向量),然后在计算噪声的时候会综合计算该噪声所在的晶格的顶点上的方向向量(图中绿色箭头)进行聚合计算(可以理解成加权计算合力)

Perlin Noise
// reference shadertoy
float perlinNoise(vec2 p) {
vec2 pi = floor(p);
vec2 pf = fract(p);
vec2 w = pf * pf * (3.0 - 2.0 * pf);
return mix(mix(dot(hash22(pi + vec2(0.0, 0.0)), pf - vec2(0.0, 0.0)),
dot(hash22(pi + vec2(1.0, 0.0)), pf - vec2(1.0, 0.0)), w.x),
mix(dot(hash22(pi + vec2(0.0, 1.0)), pf - vec2(0.0, 1.0)),
dot(hash22(pi + vec2(1.0, 1.0)), pf - vec2(1.0, 1.0)), w.x),
w.y);
}

Perlin Noise 加 fbm(分型布朗运动)
const mat2 mtx = mat2( 0.80, 0.60, -0.60, 0.80 );
float fbm6( vec2 p ) {
float f = 0.0;
f += 0.500000*perlinNoise( p ); p = mtx*p*2.02;
f += 0.250000*perlinNoise( p ); p = mtx*p*2.03;
f += 0.125000*perlinNoise( p ); p = mtx*p*2.01;
f += 0.062500*perlinNoise( p ); p = mtx*p*2.04;
f += 0.031250*perlinNoise( p ); p = mtx*p*2.01;
f += 0.015625*perlinNoise( p );
return f/0.96875;
}
Value Noise
float valueNoise(vec2 p) {
vec2 w = floor(p);
vec2 k = fract(p);
k = k*k*(3.-2.*k); // smooth it
float n = w.x*10. + w.y*48.;
float a = hash(n);
float b = hash(n+10.);
float c = hash(n+48.);
float d = hash(n+58.);
return mix(
mix(a, b, k.x),
mix(c, d, k.x),
k.y);
}
和 Perlin noise 差不多,效果差速度快
通常用来做火焰效果
Worley Noise
voronoi
最后更新于
这有帮助吗?