我正在阅读《着色器之书》中有关simplex noise的章节(单击获取完整代码),并且难以理解此处使用的一些魔术数字。这不会是与错误相关的线程,但在SO的社区准则下应该是有意义的。
请参阅以下几行:
vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))
+ i.x + vec3(0.0, i1.x, 1.0 ));
// random numbers for gradient generation
// element wise: 0.5 - x ^ 4
// use max clamp element wise: if x < 0 then m = 0 (i.e. the gradient from the vertex is 0)
// x1, x2, x3: 3 verteces of triangle simplex
// dot product is the distance from v to simpelx verteces
vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);
m = m*m ;
m = m*m ;
vec3 x = 2.0 * fract(p * C.www) - 1.0; // gradient? 2 * fract(x / 41) - 1, in [-1, 1]
vec3 h = abs(x) - 0.5; // in [-0.5, 0.5]
vec3 ox = floor(x + 0.5); // in [-1, 1]
vec3 a0 = x - ox;
// (x - ox) ^ 2 + (abs(x) - .5) ^ 2
m *= 1.79284291400159 - 0.85373472095314 * ( a0 * a0 + h * h ); // ???
与此同时,我在另一个java implementation中了解到他们使用了预先计算的2d数组表和随机索引来查找渐变,但是上述几行对我来说意义不大。我猜m
代表每个顶点的梯度贡献的权重,其余的仍然是一个难题。
希望可能有资源/评论可以帮助我理解此摘要。