Perlin噪声是一种由Ken Perlin发明的自然噪声生成算法,广泛应用于计算机图形学、游戏开发、动画制作等领域。它通过在多维空间中采样随机向量,并使用插值方法将这些向量组合起来,生成平滑的随机值。Grad函数是Perlin噪声算法中的一个关键组成部分,用于计算噪声值。以下是关于Perlin噪声的相关信息:
在Perlin噪声中,Grad函数实际上是一个用于计算梯度的函数,它接收一个向量作为输入,并返回一个向量作为输出。这个向量通常是一个单位向量,表示该方向上的梯度大小。在二维空间中,Grad函数可以这样实现:
vec2 grad2(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p) - 0.5;
vec2 u = f * f * (3.0 - 2.0 * f);
vec2 v = -1.0 + 1.0 * (f * 2.0 - 1.0);
vec2 t0 = vec2(1.0, 0.0);
vec2 t1 = vec2(-1.0, 0.0);
vec2 t2 = vec2(0.0, 1.0);
vec2 t3 = vec2(0.0, -1.0);
vec2 i0 = floor(u + t0);
vec2 i1 = floor(u + t1);
vec2 i2 = floor(u + t2);
vec2 i3 = floor(u + t3);
vec2 t00 = vec2(i0.x, i0.y);
vec2 t01 = vec2(i1.x, i0.y);
vec2 t02 = vec2(i2.x, i0.y);
vec2 t03 = vec2(i3.x, i0.y);
vec2 t10 = vec2(i0.x, i1.y);
vec2 t11 = vec2(i1.x, i1.y);
vec2 t12 = vec2(i2.x, i1.y);
vec2 t13 = vec2(i3.x, i1.y);
vec2 t20 = vec2(i0.x, i2.y);
vec2 t21 = vec2(i1.x, i2.y);
vec2 t22 = vec2(i2.x, i2.y);
vec2 t23 = vec2(i3.x, i2.y);
vec2 t30 = vec2(i0.x, i3.y);
vec2 t31 = vec2(i1.x, i3.y);
vec2 t32 = vec2(i2.x, i3.y);
vec2 t33 = vec2(i3.x, i3.y);
vec2 i00 = mix(vec2(t00.x, t00.y), vec2(t10.x, t10.y), f.x);
vec2 i01 = mix(vec2(t01.x, t01.y), vec2(t11.x, t11.y), f.x);
vec2 i02 = mix(vec2(t02.x, t02.y), vec2(t12.x, t12.y), f.x);
vec2 i03 = mix(vec2(t03.x, t03.y), vec2(t13.x, t13.y), f.x);
vec2 i10 = mix(vec2(t00.x, t01.y), vec2(t10.x, t11.y), f.y);
vec2 i11 = mix(vec2(t01.x, t01.y), vec2(t11.x, t11.y), f.y);
vec2 i12 = mix(vec2(t02.x, t02.y), vec2(t12.x, t12.y), f.y);
vec2 i13 = mix(vec2(t03.x, t03.y), vec2(t13.x, t13.y), f.y);
vec2 p00 = mix(vec2(t00.x, t00.y), vec2(t10.x, t10.y), v.x);
vec2 p01 = mix(vec2(t01.x, t01.y), vec2(t11.x, t11.y), v.x);
vec2 p02 = mix(vec2(t02.x, t02.y), vec2(t12.x, t12.y), v.x);
vec2 p03 = mix(vec2(t03.x, t03.y), vec2(t13.x, t13.y), v.x);
vec2 p10 = mix(vec2(t00.x, t01.y), vec2(t10.x, t11.y), v.x);
vec2 p11 = mix(vec2(t01.x, t01.y), vec2(t11.x, t11.y), v.x);
vec2 p12 = mix(vec2(t02.x, t02.y), vec2(t12.x, t12.y), v.x);
vec2 p13 = mix(vec2(t03.x, t03.y), vec2(t13.x, t13.y), v.x);
vec2 p20 = mix(vec2(t00.x, t02.y), vec2(t10.x, t12.y), v.x);
vec2 p21 = mix(vec2(t01.x, t02.y), vec2(t11.x, t12.y), v.x);
vec2 p22 = mix(vec2(t02.x, t02.y), vec2(t12.x, t12.y), v.x);
vec2 p23 = mix(vec2(t03.x, t03.y), vec2(t13.x, t13.y), v.x);
vec2 p30 = mix(vec2(t00.x, t03.y), vec2(t10.x, t13.y), v.x);
vec2 p31 = mix(vec2(t01.x, t03.y), vec2(t11.x, t13.y), v.x);
vec2 p32 = mix(vec2(t02.x, t03.y), vec2(t12.x, t13.y), v.x);
vec2 p33 = mix(vec2(t03.x, t03.y), vec2(t13.x, t13.y), v.x);
vec2 grad = mix(mix(p00, p10, i1.x), mix(p01, p11, i1.x), i0.x);
grad += mix(mix(p02, p12, i1.x), mix(p03, p13, i1.x), i0.x);
grad += mix(mix(p20, p30, i2.x), mix(p21, p31, i2.x), i0.x);
grad += mix(mix(p22, p32, i2.x), mix(p23, p33, i2.x), i0
领取专属 10元无门槛券
手把手带您无忧上云