【问题标题】:Perlin noise how to get a vector from a permutation-array?Perlin 噪声如何从排列数组中获取向量?
【发布时间】:2014-04-26 03:42:53
【问题描述】:

我目前正在尝试在 HLSL 上以 2D 方式实现 perlin 噪声。我看了Ken's improved Perlin Noise,但我不明白从排列数组到向量的转换是如何工作的。 我知道我可以得到这样的哈希码

int g00 = p[floorX + p[floorY]],
    g10 = p[floorX + 1 + p[floorY]],
    g01 = p[floorX + p[floorY + 1]],
    g11 = p[floorX + 1 + p[floorY + 1]];

(floorX 和 floorY 是分解为 8 位的地板 x,y 坐标。)

来自here,但我还是不明白。我也不明白 Ken 的实现中的“grad(...)”- 方法是如何工作的。 谁能解释一下它是如何工作的?

【问题讨论】:

    标签: hash gradient permutation perlin-noise


    【解决方案1】:

    Ken Perlin 的实际 java 实现实际上是他的 GPU 实现的伪代码,这意味着某些部分(尤其是您坚持的部分)是完全无法理解的(使用一些优化理论)。

    为了可读性, 尝试来自 Simplex Noise Demystified' (2005) in pdf 的 Stefan Gustavson 的参考 java 实现,它更易读,因为它部分设计为教学工具。

    他的 grad() 函数中的一长串位操作和条件(使用三进制速记运算符)用于选择伪随机单位向量。特别是,它应该从围绕单位圆(在 2D 中)或球体(在 3D 中近似于立方体边的中点)等分布的集合中进行选择,并且以相同的概率这样做每一个。 如果哈希例程对最低 4 位进行了充分加扰,那么这 16 个选项可以映射到 12 个最佳 3D 向量(长度为 sqrt2)快速 - 这就是它正在做的事情(而且,恕我直言,为什么Perlin 噪声很少达到他在随附论文中提出的标准。

    特别是,他将两个轴单位向量(x、y 和 z)相加——伪随机选择,每个具有伪随机确定的符号。

    由于您想要 2D 噪点,我建议您对渐变本身使用查找表,但请使它们的长度都相同(它看起来比 Perlin 在附录中复制的 EveryWhere 中留下的快捷方式要好一些,并且向量通常已经是浮点数)。而且你实际上可以选择 8 个好的基础梯度(所以按位加扰可以在不变形的情况下工作!)。

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 2020-06-06
      • 2014-02-15
      • 2014-11-20
      • 2011-09-20
      • 2021-09-04
      • 2011-07-28
      • 2021-06-30
      • 2013-07-23
      相关资源
      最近更新 更多