Nai*_*rou 5 algorithm fractals perlin-noise
我目前正在尝试学习 Perlin 噪声,特别是用于地形生成的 2D 噪声。过去几天我一直在网上阅读文章,但他们似乎并不都同意 Perlin 噪声的工作原理,而且那些看起来很权威的文章很难理解。
所以我有一些问题,我希望这里有人可以帮助澄清。
一些文章谈到从随机数网格(二维噪声的二维网格)开始,这是有道理的。然而,其他文章讨论了用梯度向量填充网格。哪个实际上用于柏林噪声?
我不知道什么是“梯度”向量,但如果它是一个实际向量,这意味着用两个数字填充网格上的每个点,对吗?它只是一种为每个网格点获取两个随机数的方法,还是有理由将其视为方向向量?文章讨论了计算向量之间的距离,但我认为这就是插值步骤的目的......
许多关于柏林噪声的文章都谈到将多个级别的噪声组合成具有不同频率和幅度的八度音程,以获得我正在寻找的良好的有机结果。但是,其他文章说柏林噪声只是单个八度音程,而将多个级别的噪声组合成多个八度音程的行为实际上是“分数布朗噪声”。哪个是正确的?柏林噪声本身只是一种白噪声,而不是每个人都使用它的组合噪声吗?
有些文章用一组初始随机值填充网格以供使用,有些文章只是编写它们的噪声函数,这样它就不是完全随机的,而是为给定的输入吐出相同的值。这是有道理的,因此结果(尤其是在 2D 中)看起来并不混乱。但是当您开始组合多个八度音程 (FBN) 时呢?每个八度音阶都需要来自同一组值吗?或者您可以为每个八度音程设置一个单独的网格(或生成器函数)吗?我想避免重复(在结果图像上看到相同的模式重复),但我不知道它背后的逻辑是什么。
至于您开始使用的随机值网格(或梯度向量...),该网格的大小与您正在创建的图像的最终大小有什么关系?还是纯粹是频率的函数?当您增加每个倍频程的样本分辨率时,您是使用越来越大的网格,还是只是以更精细的分辨率重新采样相同的初始网格?
任何澄清都会非常有帮助。谢谢。
我不知道什么是“梯度”向量,但如果它是一个实际向量,这意味着用两个数字填充网格上的每个点,对吗?它只是一种为每个网格点获取两个随机数的方法,还是有理由将其视为方向向量?文章讨论了计算向量之间的距离,但我认为这就是插值步骤的目的
在每个坐标处只有一个数字,但是在网格点之间插入实际值。因此,(整数*)网格点之间存在梯度。这可以在 Ken Perlins 的原始来源中看到。输入 1,2 或 3 个浮点数(1D、2D 或 3D 空间中的坐标)返回单个浮点数。
*请注意,输入坐标可能会被缩放,以便整数网格点不在整数输入坐标处。
许多关于柏林噪声的文章都谈到将多个级别的噪声组合成具有不同频率和幅度的八度音程,以获得我正在寻找的良好的有机结果。但是,其他文章说Perlin噪声只是单个八度音程,而将多个级别的噪声组合成多个八度音程的行为实际上是“分数布朗噪声”。哪个是正确的?柏林噪声本身只是一种白噪声,而不是每个人都使用它的组合噪声吗?
从技术上讲,柏林噪声是单个倍频程,但不是很有用。因此,人们经常结合许多倍频程来创建分形噪声(除 Perlin 之外的其他基本噪声函数可用于创建分形噪声)。通常人们只是将基于 Perlin 噪声的分形噪声称为 Perlin 噪声,这是错误的但很常见,您必须考虑到它。
有些文章用一组初始随机值填充网格以供使用,有些文章只是编写它们的噪声函数,这样它就不是完全随机的,而是为给定的输入吐出相同的值。这是有道理的,因此结果(尤其是在 2D 中)看起来并不混乱。但是当您开始组合多个八度音程 (FBN) 时呢?每个八度音阶都需要来自同一组值吗?或者您可以为每个八度音程设置一个单独的网格(或生成器函数)吗?我想避免重复(在结果图像上看到相同的模式重复),但我不知道它背后的逻辑是什么。
对于相同的输入(坐标和种子),Perlin 噪声函数应始终输出相同的输出。无论您是使用它来预填充网格还是随手获取值都完全取决于您。每个八度应该有不同的种子。这是柏林噪声的定义属性:
*参考http://www.angelcode.com/dev/perlin/perlin.html
至于您开始使用的随机值网格(或梯度向量...),该网格的大小与您正在创建的图像的最终大小有什么关系?还是纯粹是频率的函数?当您增加每个倍频程的样本分辨率时,您是使用越来越大的网格,还是只是以更精细的分辨率重新采样相同的初始网格?
输入的坐标(以及您设置函数的频率之类的东西)应该决定噪声的属性。假设输入的坐标范围保持不变,网格的大小应该只会影响您看到噪声的分辨率。
不同的八度音程应该有不同的种子,但它们的音阶也不同;您不仅仅是为不同的八度音阶以更精细的分辨率重新采样相同的网格,您还在缩放您的坐标。