如何计算多倍频程Perlin噪声的导数

问题描述 投票:0回答:1

我已经实现了Perlin Noise(3d),它不仅会为我提供一个字段值,而且还会为我提供解析导数。对于解析导数,我遵循了scratchapixel guide

这很好,但是如果我有多个八度音阶,我不知道如何处理导数。

对于字段值,八度求和非常简单:

假设我有4个八度的噪声,persistence 0.5和lacunarity 2,我会简单地做:

float sample_4o( vec3 samplepos )
{
   const float amp0 = 1;
   const float amp1 = 0.5f;
   const float amp2 = 0.25f;
   const float amp3 = 0.125f;
   const float freq0 = 1;
   const float freq1 = 2;
   const float freq2 = 4;
   const float freq3 = 8;
   const float v0 = perlin( freq0 * samplepos );
   const float v1 = perlin( freq1 * samplepos );
   const float v2 = perlin( freq2 * samplepos );
   const float v3 = perlin( freq3 * samplepos );
   const float maxval = (amp0+amp1+amp2+amp3);
   return ( 1 / maxval ) * ( amp0 * v0 + amp1 * v1 + amp2 * v2 + amp3 * v3 );
}

仅是八度的加权和。很容易。

但是现在我不仅有四个噪声值,而且还有四个导数(或梯度),如何使用振幅g0,g1,g2,g3组合四个3d梯度amp0,amp1,amp2,amp3

使用加权和似乎没有任何意义。最高的频率,最低的振幅将完全被其他八度音阶所淹没,但是这将在很小的局部区域决定导数。

也许我以相同的权重将它们全部求和?还是其他?

以可视化示例...

example signals

  • 我有两个信号,红色和橙色。
  • 我知道红色和橙色的值及其导数。
  • 我将橙色幅度缩放为0.5,以便获得虚线的橙色信号。
  • 我将虚线橙色添加到红色,以获得蓝色的2倍频程信号。
  • 蓝色信号的派生如何用橙色和红色的派生表达?
graphics 3d derivative perlin-noise
1个回答
0
投票

如果您的梯度正确,则只需使用与它们用于求和振幅相同的权重对其求和。

但是请注意,梯度与频率成正比,因此,如果将频率乘以2,则梯度最终也必须乘以2。

在您的示例中,权重与频率成反比,因此,如果您尚未校正频率的梯度,则只需对它们进行求和,而无需进行任何加权,因为权重*频率校正对于所有权重而言均为1 。

© www.soinside.com 2019 - 2024. All rights reserved.