【发布时间】:2017-10-07 09:14:09
【问题描述】:
我正在实现一个基于 3D perlin 噪声的球形行星生成器,但在尝试利用噪声计算中的解析导数时,我得到了线伪影。我正在使用 Milo Yip 的方法计算解析导数: 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;
}
我得到这些网格线伪影,如下所示:
但是,这些行仅在我在噪声计算中利用导数的点积(标量)时出现,
即
(1 + dot(deriv,deriv))
是否用于调制放大、频率等。它似乎总是会产生伪像。
当使用域扭曲的导数时,我没有得到线伪影。
例如
float4 n = noiseDeriv((p + 0.15 * dsum) * freq, (i)/256.0);
这仅仅是经典 Perlin 噪声的限制吗?在我的项目的这个阶段,我有点犹豫要完全改变噪声算法。 :/
- 注意:我在计算导数时使用的是五次函数。
【问题讨论】:
-
有趣的是,在 this 页面上,de Carpentier 正在采用另一个导数 d(w*f)/df 并将其合并到他的最终导数计算中(参见他的 @987654327 @ 方法)。
// Get the derivative d(w*f)/dffloat2 dwp = f * f * f * (f * (f * 36 - 75) + 40); // 36f^5 - 75f^4 + 40f^3这不是二阶导数,所以我不确定这条曲线的用途。是否有任何数学天才可能知道如何将其纳入 Milo Yip 的方程式? :) de Carpentier's 仅适用于 2D。
标签: 3d derivative perlin-noise procedural-generation