Glsl Voro噪波着色器,了解iqnoise和哈希函数

Glsl Voro噪波着色器,了解iqnoise和哈希函数,glsl,interpolation,noise,voronoi,procedural-generation,Glsl,Interpolation,Noise,Voronoi,Procedural Generation,我最近意识到了基于细胞噪声的程序生成技术。我来了,这很好地解释了蜂窝(或Worley)噪声的概念。在进一步阅读后,作者链接到Inigo Quilez(Voro Noise的作者)继续对其着色器进行粗略概述的地方。然而,我不明白其中的一些部分。为什么要创建这样的哈希函数: vec3 hash3( vec2 p ) { vec3 q = vec3( dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3)),

我最近意识到了基于细胞噪声的程序生成技术。我来了,这很好地解释了蜂窝(或Worley)噪声的概念。在进一步阅读后,作者链接到Inigo Quilez(Voro Noise的作者)继续对其着色器进行粗略概述的地方。然而,我不明白其中的一些部分。为什么要创建这样的哈希函数:

vec3 hash3( vec2 p ) {
    vec3 q = vec3( dot(p,vec2(127.1,311.7)), 
                   dot(p,vec2(269.5,183.3)), 
                   dot(p,vec2(419.2,371.9)) );
    return fract(sin(q)*43758.5453);
}
我不知道这些数字的意义,也不知道为什么在这里使用sin,他的页面上似乎没有解释

我也不明白为什么需要迭代25个点,而不是前面示例中使用的9个点

for (int j=-2; j<=2; j++) {
        for (int i=-2; i<=2; i++) {
            ...
        }
    }
最后,《voro noise》一书的作者探讨了幂函数是什么,但他并没有详细说明为什么会这样。为什么我们以这种方式创建K(作者谈到将平滑步长提高到1的幂,但我不认为这是可能的)为什么我们创建
ww
,将其乘以偏移量z分量,为什么我们将
va
除以
wt
?我知道我们在所有点之间根据它们的贡献添加某种插值,但我不明白为什么插值器是按原样构造的

float k = 1.0+63.0*pow(1.0-v,4.0);
float va = 0.0;
float wt = 0.0;

        ...
        float ww = pow( 1.0-smoothstep(0.0,1.414,sqrt(d)), k );
        va += o.z*ww;
        wt += ww;
...
return va/wt;

hermitian插值器(
smoothstep
here)在这里有什么帮助?据我所知,我们在这里传递0,sqrt(2)和sqrt(差分向量的长度)

这不只是一个近似值吗?@Betterdev必须在那里更具体一些,巴德。加权voronoi图被定义为用权重减除的euklidian距离。这不只是一个近似值吗?@Betterdev必须在那里更具体一些,巴德。加权voronoi图被定义为用权重减除的euklidian距离重量。
float k = 1.0+63.0*pow(1.0-v,4.0);
float va = 0.0;
float wt = 0.0;

        ...
        float ww = pow( 1.0-smoothstep(0.0,1.414,sqrt(d)), k );
        va += o.z*ww;
        wt += ww;
...
return va/wt;