在这一点上,单纯形、柏林噪声和这两者的混合之间的混淆在整个互联网上非常普遍。我知道的最著名和被引用的论文是Stefan Gustavson's。古斯塔夫森先生在其中说了以下内容
为了清楚起见,我将使用混合方法,
使用来自经典噪声的梯度散列方法,但使用单纯形网格和直接求和
单纯形噪声的噪声贡献
因此,结果既不是单纯形噪声也不是 Perlin 噪声,而是一种混杂或混合噪声算法,具有两者的某些特征。'
Perlin 噪声是经典噪声,它使用预定义(以某种方式生成)梯度向量和置换表(保存梯度表的索引)。因此,为了从坐标 (x, y, z) 获得梯度,您应用某种哈希函数,经典的 Perlin 噪声只需使用模,然后您从排列表中获取一个索引,该索引又为您提供另一个索引您用来从表格中抓取渐变。使用模运算作为散列函数立即为您提供 Perlin 噪声的可重复性质。
排列表看起来像这样; [0, 1, 2, ..., sizeof(gradient_table) - 1].
Simplex 噪声为patented(至少用于 3D 及以上的纹理生成),其算法在此处描述。单纯形噪声使用两个独特的发明来与 Perlin 噪声区分开来。
1) 没有梯度表和置换表。相反,渐变是使用位操作算法即时生成的。
2) 它不是由正方形(2D)组成的坐标网格,而是由平铺平面的simpliest geometric form 组成。在 2D 中这是三角形,在 3D 中是四面体。这个坐标网格减少了网格的可见伪影。
单纯形噪声还有一些次要但仍然非常重要的特性,使其成为一种更加优雅的算法。例如,没有内积,因为来自顶点的所有贡献都是使用球形内核进行的。甚至简单坐标网格和笛卡尔(或普通坐标)之间的转换也被优化为单次乘法,这使得转换变得非常便宜。
作为一个无耻的自我推销,我将提供一个指向我的噪声函数repository 的链接,在该函数中我尝试尽可能正确地实现所有内容。目标是提供一些标准的跨平台实现一堆噪音功能。