当我试图在噪声计算中利用分析导数时,我会得到线条伪影 . 我是_789976的方法:3D Perlin noise analytical derivative
例如,在尝试使用IQ噪声时:
float IQturbulence(float3 p, int octaves, float freq, float amp, float gain, float lacunarity)
{
float sum = 0.5;
float3 dsum = float3(0,0,0);
for(int i = 0; i < octaves; i++)
{
float4 n = noiseDeriv((p*freq), (i)/256.0);
dsum += n.yzw;
sum += amp * n.x / (1 + dot(dsum,dsum));
freq *= lacunarity;
amp *= gain;
}
return sum;
}
我得到这些看起来像这样的网格线工件:
但是,这些行仅在我利用噪声计算中导数的 dot product (标量)时出现,
即
(1 + dot(deriv,deriv))
无论是用于调制放大,频率等,它似乎总是产生伪影 .
当使用导数到域扭曲时,我没有得到线条伪像 .
恩 .
float4 n = noiseDeriv((p + 0.15 * dsum) * freq, (i)/256.0);
这仅仅是经典Perlin噪音的限制吗?在我的项目的这个阶段,我有点犹豫是否完全改变噪声算法 . :/
- 注意:我在计算导数时使用的是五次函数 .
1 回答
所以我不确定我是否搞砸了某个地方或者是什么,但我能够通过将这一部分替换为Milo解决方案中的x衍生物来成功删除工件:
同
3D IQ噪音looks great现在!
我得到了派生here .
我没有必要更改ny和nz以便工件消失,但我继续进行更新 .