我最近开始意识到基于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(差异向量的长度)。