2

我已经尝试实现 Simplex Noise 大约一个月了,我确实理解使用 Simplices 来减少所需的计算量以及梯度方面的安全功率的想法。但是,将其实现为任何语言似乎都是不可能的任务。

在我找到的每一个、每一个、每一个代码、我阅读的资源中,无处不在,代码似乎有一个 G 和一个 P 表。通过一些谷歌搜索和四处询问,我了解到它们是一个排列和梯度表。他们在做什么?为什么我们需要它们?

我目前的想法是排列表只包含随机值,因此不必在运行时计算它们。

例子:

4

2 回答 2

6

本质上是的,P表是用来从G表中选择一个随机梯度的。然而,重要的是它需要是可重复的。也就是说,在 3D 情况下,对于给定的(i,j,k)三元组,您需要始终能够产生相同的“随机”渐变。这就是使噪声函数连贯的原因。因此,它在 P 表中进行一些查找的公式的全部要点是结果看起来是随机的,但它对于给定的输入是确定性的。

如果您不关心性能,您可以轻松地使用(i,j,k)伪随机数生成器来播种,然后使用它从 G 表中选择一个梯度。

于 2013-09-19T02:47:08.773 回答
4

单纯形、柏林噪声和这两者的混合之间的混淆在这一点上在整个互联网上非常普遍。我所知道的最著名和被引用的论文是Stefan Gustavson 的。古斯塔夫森先生在其中说:

为了清楚起见,我将使用混合方法,使用来自经典噪声的梯度散列方法,但使用单纯形网格和单纯形噪声的噪声贡献的直接求和

因此,结果既不是单纯形噪声也不是 Perlin 噪声,而是具有两者某些特征的混杂或混合噪声算法。

Perlin 噪声是经典噪声,它使用预定义(以某种方式生成)梯度向量和置换表(保存梯度表的索引)。因此,为了从坐标 (x, y, z) 获得梯度,您应用某种散列函数,经典的 Perlin 噪声只需使用模,然后您从排列表中获取一个索引,该索引又为您提供另一个索引您用来从表格中抓取渐变。使用模运算作为散列函数立即为您提供 Perlin 噪声的可重复性质。

排列表看起来像这样;[0, 1, 2, ..., sizeof(gradient_table) - 1]。

单纯形噪声已获得专利(至少用于 3D 及以上的纹理生成),其算法在此处描述。单纯形噪声使用两个独特的发明来将其与 Perlin 噪声区分开来。

1)没有梯度表也没有置换表。相反,梯度是使用位操作算法即时生成的。

2)它不是由正方形(2D)组成的坐标网格,而是由平铺平面的最简单的几何形式组成。在 2D 中这是三角形,在 3D 中是四面体。该坐标网格减少了网格的可见伪影。

单纯形噪声还有一些次要但仍然非常重要的特征,使其成为一种更加优雅的算法。例如,没有内积,因为来自顶点的所有贡献都是使用球形内核进行的。甚至简单坐标网格和笛卡尔(或普通坐标)之间的转换也被优化为单次乘法,这使得转换变得非常便宜。

作为一个无耻的自我推销,我将提供一个指向我的噪音函数的链接,我会在其中尝试尽可能正确地实现所有内容。目标是提供某种标准的跨平台实现一堆噪音功能。

于 2017-04-26T07:31:49.480 回答