3d 三维柏林噪声的分析导数会产生线伪影

3d 三维柏林噪声的分析导数会产生线伪影,3d,derivative,perlin-noise,procedural-generation,3d,Derivative,Perlin Noise,Procedural Generation,我正在实现一个基于3D柏林噪声的球形行星生成器,但是当我试图在噪声计算中利用分析导数时,我得到了线伪影。我使用Milo Yip的方法计算分析导数: 例如,尝试使用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(in

我正在实现一个基于3D柏林噪声的球形行星生成器,但是当我试图在噪声计算中利用分析导数时,我得到了线伪影。我使用Milo Yip的方法计算分析导数:

例如,尝试使用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;
}
无论是用来调制放大、频率等,它似乎总是产生伪影

当使用域扭曲的导数时,我没有得到任何线瑕疵

这仅仅是经典柏林噪声的限制吗?在项目的这个阶段,我对完全改变噪声算法有点犹豫/

  • 注:我在计算导数时使用五次函数

所以我不确定我是否在什么地方搞砸了,但我能够通过将这一部分替换为Milo解决方案中的x衍生产品成功地移除这些瑕疵:

float nx = gx000
    + uP * (dot100 - dot000)
    + u  * (gx100 - gx000)
    + v  * (gx010 - gx000)
    + w  * (gx001 - gx000)
    + uP * v * (dot110 - dot010 - dot100 + dot000)
    + u * v *  (gx110 - gx010 - gx100 + gx000)
    + uP * w * (dot101 - dot001 - dot100 + dot000)
    + u * w *  (gx101 - gx001 - gx100 - gx000)
    + v * w *  (gx011 - gx001 - gx010 + gx000)
    + uP * v * w * (dot111 - dot011 - dot101 + dot001 - dot110 + dot010 + dot100 - dot000)
    + u * v * w *  (gx111 - gx011 - gx101 + gx001 - gx110 + gx010 + gx100 - gx000);

3D智商噪音现在

我得到了推导

我不必改变纽约和新西兰的文物消失,但我继续前进,并更新了这些以及

float ny = vP*(c - a) 
    + u*vP*(a + d - b - c)
    + vP*w*(a + g - c - e)
    + u*vP*w*(b + c + e + h - a - d - f - g);

float nz = wP*(e - a)
    + u*wP*(a + f - b - e)
    + v*wP*(a + g - c - e)
    + u*v*wP*(b + c + e + h - a - d - f - g);

因此,我不确定我是否在什么地方搞砸了,但我成功地将这一部分替换为Milo解决方案中的x导数,从而消除了瑕疵:

float nx = gx000
    + uP * (dot100 - dot000)
    + u  * (gx100 - gx000)
    + v  * (gx010 - gx000)
    + w  * (gx001 - gx000)
    + uP * v * (dot110 - dot010 - dot100 + dot000)
    + u * v *  (gx110 - gx010 - gx100 + gx000)
    + uP * w * (dot101 - dot001 - dot100 + dot000)
    + u * w *  (gx101 - gx001 - gx100 - gx000)
    + v * w *  (gx011 - gx001 - gx010 + gx000)
    + uP * v * w * (dot111 - dot011 - dot101 + dot001 - dot110 + dot010 + dot100 - dot000)
    + u * v * w *  (gx111 - gx011 - gx101 + gx001 - gx110 + gx010 + gx100 - gx000);

3D智商噪音现在

我得到了推导

我不必改变纽约和新西兰的文物消失,但我继续前进,并更新了这些以及

float ny = vP*(c - a) 
    + u*vP*(a + d - b - c)
    + vP*w*(a + g - c - e)
    + u*vP*w*(b + c + e + h - a - d - f - g);

float nz = wP*(e - a)
    + u*wP*(a + f - b - e)
    + v*wP*(a + g - c - e)
    + u*v*wP*(b + c + e + h - a - d - f - g);
有趣的是,在第页,de Carpentier采用了另一个导数d(w*f)/df,并将其纳入了他的最终导数计算中(参见他的
perlinnoisedriv
方法)
//获取导数d(w*f)/df
float2dwp=f*f*f*(f*(f*36-75)+40);//36f^5-75f^4+40f^3
这不是二阶导数,所以我不确定这条曲线的用途。有没有数学天才知道如何将这一点纳入叶美洛的方程式中?:)de Carpentier的方法仅适用于2D。有趣的是,在第页,de Carpentier采用了另一个导数d(w*f)/df,并将其纳入最终的导数计算中(参见他的
Perlinnoisedriv
方法)
//获取导数d(w*f)/df
float2dwp=f*f*f*(f*(f*36-75)+40);//36f^5-75f^4+40f^3
这不是二阶导数,所以我不确定这条曲线的用途。有没有数学天才知道如何将这一点纳入叶美洛的方程式中?:)de Carpentier's仅适用于2D。
float ny = vP*(c - a) 
    + u*vP*(a + d - b - c)
    + vP*w*(a + g - c - e)
    + u*vP*w*(b + c + e + h - a - d - f - g);

float nz = wP*(e - a)
    + u*wP*(a + f - b - e)
    + v*wP*(a + g - c - e)
    + u*v*wP*(b + c + e + h - a - d - f - g);