我已经在几个地方看到,要使Perlin噪声循环无缝发生,就需要以略有不同的方式对其进行两次计算,然后将这两个结果相加。

此Perlin噪声数学常见问题解答给出了一个公式:

$$ F_ {loop}(x,y,z)= \ frac {(t-z)\ cdot F(x,y,z)+ z \ cdot F(x,y,z-t)} {t} $$$

使噪声函数$ F $沿$ z $方向循环。它还提到将其扩展,在2个维度中循环将对$ F $进行4次评估,在3个维度中循环将对$ F $进行8次评估。

我知道这提供了无缝的瓷砖之间的连接不仅是连续的,而且是连续可微的,但我直觉地希望是这样的情况,即仅对噪声函数进行一次评估,并以所需的瓷砖尺寸为模减少网格点。如果噪声函数仅基于紧邻的网格点(2D噪声为4,3D噪声为8),则当要计算的点超过图块的右边缘时,一定要使用最左边的网格点

由于我已经在多个地方看到了这种多重计算方法,因此我认为它必须具有一定的优势,但是我一直在努力地尝试简单地查看其劣势当网格点太大时,将网格点重新包装到起点。我想念什么?

#1 楼

不幸的是,人们通常会推荐这样做。以这种方式在噪声函数的两个(或四个等)转换后的副本之间进行混合是一个非常糟糕的主意。它不仅价格昂贵,而且甚至无法产生看起来正确的结果!



左边有一些Perlin噪音。右边是两个Perlin噪声实例,从左到右依次堆叠和混合。

差别有点细微,但您可以看到第二个图像在垂直列运行时对比度较低。在中间。在此,噪声函数的两个不同实例之间的混合率为50%。这样的混合看起来不像原始的杂讯功能:看起来就像是泥泞的烂摊子。

好,所以只看原始杂讯并没有那么糟糕...但是如果您在图像上进行任何非线性变换时,对比度不均匀会引起问题。例如,这是阈值为60%的那​​些图像。 (例如,想在海洋中生成岛屿。)



现在,您可以清楚地看到右侧图像在空白区域中具有更少,较小的白色区域的方式中间。

就像您提到的那样,对于像Perlin这样的基于网格的噪声,更好的方法是在网格点上平铺伪随机梯度。这样做既简单又便宜,然后您可以像往常一样将插值算法应用于渐变(就像平铺纹理的双线性插值一样)。这将产生平铺噪声而没有任何怪异的伪影,因为它与基础噪声算法一起工作,而不是在其顶部工作。通过将随机特征点作为基础,您可以对沃利噪声(细胞噪声)使用类似的策略。

但是,具有多个八度的噪声并不总是那么容易。如果八度音阶之间的相对标度(即“ lacunarity”)不是整数或简单的有理数,那么您可能找不到所有八度音阶网格匹配的方便的平铺点。您可以独立地平铺每个八度音阶,但是在这种情况下,总体噪声仍然无法平铺。

评论


$ \ begingroup $
并排图像对于获得直观的解释确实有所不同。对于我自己的答案,我将牢记这一点。
$ \ endgroup $
– trichoplax
15年8月15日在9:49