单工噪声魔术数字说明

时间:2019-09-15 10:56:52

标签: math graphics glsl

我正在阅读《着色器之书》中有关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代表每个顶点的梯度贡献的权重,其余的仍然是一个难题。

希望可能有资源/评论可以帮助我理解此摘要。

0 个答案:

没有答案