5

我目前正在尝试学习 Perlin 噪声,特别是用于地形生成的 2D 噪声。在过去的几天里,我一直在网上阅读文章,但他们似乎并不都同意 Perlin 噪声的工作原理,而且那些看起来确实具有权威性的文章理解起来非常复杂。

所以我有一些问题希望有人能帮助澄清。

  • 一些文章谈论从随机数网格(用于 2D 噪声的 2D 网格)开始,这是有道理的。然而,其他文章谈论用梯度向量填充网格。哪个实际上用于 Perlin 噪声?

  • 我不知道什么是“梯度”向量,但如果它是一个实际的向量,这意味着用两个数字填充网格上的每个点,对吧?它只是一种为每个网格点获取两个随机数的方法,还是有理由将其视为方向向量?这些文章讨论了计算向量之间的距离,但我认为这就是插值步骤的用途......

  • 许多关于 Perlin 噪声的文章都谈到了将多个级别的噪声组合成具有不同频率和幅度的八度音阶,以获得我正在寻找的良好的有机结果。但是,其他文章说 Perlin 噪声只是单个倍频程,而将多个级别的噪声组合成多个倍频程的行为实际上是“分数布朗噪声”。哪个实际上是正确的?Perlin 噪声本身只是一种白噪声,而不是每个人都使用它的组合噪声吗?

  • 有些文章用一组初始随机值填充网格,有些文章只是写了他们的噪声函数,这样它就不是完全随机的,而是为给定的输入吐出相同的值。这是有道理的,因此结果(尤其是在 2D 中)看起来并不混乱。但是,当您开始组合多个噪声八度音阶 (FBN) 时呢?每个八度音程是否需要来自同一组值?或者您可以为每个八度音程播种一个单独的网格(或生成器函数)吗?我想避免重复(在结果图像上看到相同的模式重复),但我不知道它背后的逻辑是什么。

  • 至于您开始的随机值网格(或梯度向量......),该网格的大小与您正在创建的图像的最终大小有什么关系?还是纯粹是频率的函数?当您增加每个倍频程的采样分辨率时,您是使用越来越大的网格,还是只是以更精细的分辨率重新采样相同的初始网格?

任何澄清都会非常有帮助。谢谢。

4

2 回答 2

6

我不知道什么是“梯度”向量,但如果它是一个实际的向量,这意味着用两个数字填充网格上的每个点,对吧?它只是一种为每个网格点获取两个随机数的方法,还是有理由将其视为方向向量?文章讨论了计算向量之间的距离,但我认为这就是插值步骤的用途

在每个坐标处只有一个数字,但是在网格点之间插入实际值。因此,(整数*)网格点之间存在梯度。这可以在 Ken Perlins 的原始资料中看到。输入 1,2 或 3 个浮点数(1D、2D 或 3D 空间中的坐标)返回单个浮点数。

*请注意,输入坐标可以缩放,使得整数网格点不在整数输入坐标处。

许多关于 Perlin 噪声的文章都谈到了将多个级别的噪声组合成具有不同频率和幅度的八度音阶,以获得我正在寻找的良好的有机结果。但是,其他文章说 Perlin 噪声只是单个倍频程,而将多个级别的噪声组合成多个倍频程的行为实际上是“分数布朗噪声”。哪个实际上是正确的?Perlin 噪声本身只是一种白噪声,而不是每个人都使用它的组合噪声吗?

Perlin 噪声在技术上是单个八度音阶,但不是很有用。因此,人们经常组合许多倍频程来创建分形噪声(除 Perlin 之外的其他基本噪声函数可用于创建分形噪声)。通常人们只是根据 Perlin 噪声 Perlin 噪声来调用分形噪声,这是错误的,但很常见,您必须考虑到它。

有些文章用一组初始随机值填充网格,有些文章只是写了他们的噪声函数,这样它就不是完全随机的,而是为给定的输入吐出相同的值。这是有道理的,因此结果(尤其是在 2D 中)看起来并不混乱。但是,当您开始组合多个噪声八度音阶 (FBN) 时呢?每个八度音程是否需要来自同一组值?或者您可以为每个八度音程播种一个单独的网格(或生成器函数)吗?我想避免重复(在结果图像上看到相同的模式重复),但我不知道它背后的逻辑是什么。

对于相同的输入(坐标和种子),Perlin 噪声函数应始终输出相同的输出。无论您是使用它来预填充网格还是只是随手获取值,这完全取决于您。每个八度应该有不同的种子。这是 Perlin 噪声的定义属性:

  • 明显的随机性,在人眼看来应该是随机的*
  • 可重现,这意味着使用相同的输入它总是会给出
    相同的输出*
  • 值之间的平滑过渡,意味着没有锐利的边缘*

*参考http://www.angelcode.com/dev/perlin/perlin.html

至于您开始的随机值网格(或梯度向量......),该网格的大小与您正在创建的图像的最终大小有什么关系?还是纯粹是频率的函数?当您增加每个倍频程的采样分辨率时,您是使用越来越大的网格,还是只是以更精细的分辨率重新采样相同的初始网格?

输入的坐标(以及您设置函数的频率之类的东西)应该决定噪声的属性。假设输入坐标的范围保持不变,网格的大小应该只影响您看到噪声的分辨率。

不同八度的噪音应该有不同的种子,但它们也有不同的音阶;你不只是为不同的八度音阶以更精细的分辨率重新采样相同的网格,你正在缩放你的坐标。

于 2013-08-29T14:05:56.617 回答
0

这来自我在程序地形中使用 Perlin 噪声的经验。

普通噪声会有一个正方形网格,其中节点值是随机生成的。基于此,您定义了两个变量的函数,例如:

  1. 在与网格节点函数值重合的点处等于节点值
  2. 对于任何其他点,给定一个包含它的网格正方形,对对应于该网格正方形的四个节点值进行双线性插值

很简单。

然而,在 Perlin 噪声中,每个网格节点都有一个用于节点值的 2D 向量,而不是单个数字。我们仍然需要我们的高度函数将二维平面映射到标量高度值,因此说节点处的高度等于节点值(二维向量)是没有意义的。

相反,点 P 的高度函数定义如下:

  1. 取包含点 P 的网格正方形
  2. 从该正方形的每个节点绘制一个矢量 V 朝向 P
  3. 对于该正方形的每个节点,取向量 V 和该节点的值(也是一个向量,记住)的点积,我们得到一个标量值
  4. 现在我们有四个标量值对应于每个节点。与普通噪声一样,进行双线性插值以找到 P 点的高度

由于此定义,Perlin 噪声高度函数 (PNHF) 在网格节点处始终等于 0。

您可以使用 PNHF 的域,例如旋转它、操纵频率(输入缩放)和幅度(输出缩放),这样您就得到了 Octave。

将几个不同的八度音阶相加,您可以获得非常令人信服的地形。世界是你的游乐场。祝你好运!

于 2021-01-25T23:55:43.403 回答