我已经实现了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
?
使用加权和似乎没有任何意义。最高的频率,最低的振幅将完全被其他八度音阶所淹没,但是这将在很小的局部区域决定导数。
也许我以相同的权重将它们全部求和?还是其他?
以可视化示例...
如果您的梯度正确,则只需使用与它们用于求和振幅相同的权重对其求和。
但是请注意,梯度与频率成正比,因此,如果将频率乘以2,则梯度最终也必须乘以2。
在您的示例中,权重与频率成反比,因此,如果您尚未校正频率的梯度,则只需对它们进行求和,而无需进行任何加权,因为权重*频率校正对于所有权重而言均为1 。