【问题标题】:Why do all Simplex Noise algorithms have a Permutation & Gradient table?为什么所有 Simplex Noise 算法都有一个排列和梯度表?
【发布时间】:2013-09-19 01:26:21
【问题描述】:

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

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

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

例子:

【问题讨论】:

    标签: algorithm noise procedural-generation simplex


    【解决方案1】:

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

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

    【讨论】:

    • 所以排列值理论上是什么定义了你的梯度表的索引?
    【解决方案2】:

    在这一点上,单纯形、柏林噪声和这两者的混合之间的混淆在整个互联网上非常普遍。我知道的最著名和被引用的论文是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 的链接,在该函数中我尝试尽可能正确地实现所有内容。目标是提供一些标准的跨平台实现一堆噪音功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2018-01-19
      • 2016-06-23
      • 1970-01-01
      • 2016-10-06
      • 2016-09-27
      • 1970-01-01
      相关资源
      最近更新 更多