Math 单纯形噪声幻数解释

Math 单纯形噪声幻数解释,math,graphics,glsl,Math,Graphics,Glsl,我正在阅读Shader的书中关于(点击查看完整代码)的一章,很难理解这里使用的一些神奇数字。这将不是一个与bug相关的线程,但在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

我正在阅读Shader的书中关于(点击查看完整代码)的一章,很难理解这里使用的一些神奇数字。这将不是一个与bug相关的线程,但在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 ); // ???
vec3p=permute(permute(i.y+vec3(0.0,i1.y,1.0))
+i.x+vec3(0.0,i1.x,1.0));
//梯度生成的随机数
//元素方面:0.5-x^4
//按最大夹紧元素使用:如果x<0,则m=0(即从顶点开始的梯度为0)
//x1,x2,x3:三角形单纯形的3个顶点
//点积是从v到simpelx顶点的距离
vec3 m=最大值(0.5-vec3(点(x0,x0),点(x12.xy,x12.xy),点(x12.zw,x12.zw)),0.0);
m=m*m;
m=m*m;
vec3 x=2.0*fract(p*C.www)-1.0;//坡度2*fract(x/41)-1,in[-1,1]
vec3h=abs(x)-0.5;//在[-0.5,0.5]
vec3 ox=地板(x+0.5);//在[-1,1]
vec3 a0=x-ox;
//(x-ox)^2+(abs(x)-.5)^2
m*=1.79284291400159-0.85373472095314*(a0*a0+h*h);/???
同时,我知道在另一个例子中,他们使用预先计算的2d数组表和随机索引来查找渐变,上面的几行对我来说没有多大意义。我猜
m
代表每个顶点的梯度贡献的权重,其余的仍然是一个谜


希望有参考资料/评论可以帮助我理解这段代码。

事实证明,
p
是一个随机向量,你可以用一个常数替换下面的奇特计算,它不会对输出造成太大影响。它们在这里没有秘密,它们只是随机的。事实证明,
p
是一个随机向量,你可以用一个常数替换下面的奇特计算,它对输出影响不大。这里没有秘密,它们只是随机的。