Perlin噪声

Perlin 噪声是 Ken Perlin 开发的一种梯度噪声。

历史

Ken Perlin 于 1983 年开发了 Perlin 噪音,因为他对当时计算机生成图像 (CGI) 的类似机器的外观感到沮丧。 他在 1985 年的一篇名为 An Image Synthesizer 的 SIGGRAPH 论文中正式描述了他的发现。 他在为动画公司数学应用集团 (MAGI) 制作迪斯尼的计算机动画科幻电影 Tron (1982) 后开发了它。 1997 年,Perlin 因创建算法而获得奥斯卡技术成就奖,引文如下:

感谢 Ken Perlin 开发的 Perlin Noise,这是一种用于在计算机生成的表面上产生自然纹理的技术,用于电影视觉效果。Perlin Noise 的发展使计算机图形艺术家能够更好地表现视觉效果中自然现象的复杂性 电影业。

Perlin 没有为该算法申请任何专利,但在 2001 年,他获得了使用单纯形噪声的 3D+ 实现进行纹理合成的专利。 单纯形噪声具有相同的目的,但使用更简单的空间填充网格。 单纯形噪声缓解了 Perlin 经典噪声的一些问题,其中包括计算复杂性和视觉上显着的方向性伪影。

使用

Perlin噪声是一种程序纹理基元,是视觉效果艺术家用来增加计算机图形中真实感外观的一种渐变噪声。 该函数具有伪随机外观,但其所有视觉细节大小相同。 此属性使其易于控制; 可以将 Perlin 噪音的多个缩放副本插入到数学表达式中,以创建各种各样的程序纹理。 使用 Perlin 噪音的合成纹理通常用于 CGI 中,通过模仿自然界纹理的受控随机外观,使计算机生成的视觉元(例如物体表面、火、烟或云)看起来更自然。

当内存极其有限时,它也经常用于生成纹理,例如在演示中。 它的后继者,如分形噪声和单纯形噪声,在实时图形和各种计算机图形中的非实时程序纹理的图形处理单元中几乎无处不在。

它经常用于视频游戏中,使程序生成的地形看起来很自然。

算法细节

Perlin 噪声最常实现为二维、三维或四维函数,但可以为任意数量的维度定义。 实现通常包括三个步骤:定义随机梯度向量的网格,计算梯度向量与其偏移量之间的点积,以及在这些值之间进行插值。

网格定义

定义一个 n 维网格,其中每个网格交点都与一个固定的随机 n 维单位长度梯度向量相关联,但在一维情况下梯度是介于 -1 和 1 之间的随机标量。

点积

要计算任何候选点的值,首先要找到该点所在的xxx网格单元。 然后,确定该单元格的 2 n {displaystyle 2{n}} 个角及其相关的梯度向量。 接下来,对于每个角,计算一个偏移向量。 偏移向量是从那个角到候选点的位移向量。

对于每个角点,我们取其梯度向量与到候选点的偏移向量之间的点积。 如果候选点恰好位于网格角,则此点积将为零。

请注意,梯度向量的影响随着距离的增加而增加,这可以通过首先将偏移向量归一化为长度 1 {displaystyle 1} 来避免。 这将引入明显的急剧变化,除非在接下来的插值步骤中考虑了距离。 然而,归一化偏移向量并不是一种常见的做法。

Perlin噪声

对于二维网格中的一个点,这将需要计算 4 个偏移向量和点积,而在三维中则需要 8 个偏移向量和 8 个点积。 一般来说,该算法具有 O ( 2 n ) {displaystyle O(2{n})} 复杂度,其中 n {displaystyle n} 是维数。

插值

最后一步是在 2 n {displaystyle 2{n}} 点积之间进行插值。 使用在 2 n {displaystyle 2{n}} 网格节点处具有零一阶导数(也可能还有二阶导数)的函数执行插值。 因此,在靠近网格节点的点,输出将近似于节点的梯度向量与节点的偏移向量的点积。 这意味着噪声函数将在每个节点处通过零,从而使 Perlin 噪声具有其特有的外观。

0

点评

点赞

相关文章