Voro-Noise着色器,了解iqnoise和哈希函数

时间:2017-07-26 15:26:52

标签: glsl interpolation noise voronoi procedural-generation

我最近开始意识到基于Cell噪声的程序生成技术。我来across this website,很好地解释了细胞(或沃利)噪音的概念。在进一步阅读后,作者链接到Voro-Noise,其中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++) {
            ...
        }
    }

将每个循环中的'2'和'-2'更改为'1'和'-1'似乎会产生伪影并改变模糊的本质。

为什么我们采用距离差的点积和自身? (我猜这个矢量的长度是平方的吗?)

    vec2  r = g - f + o.xy;
    float d = dot(r,r);

最后,虽然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)如何帮助?根据我的理解,我们在这里传递0,sqrt(2)和sqrt(差异向量的长度)。

0 个答案:

没有答案