柏林噪声原理介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了柏林噪声原理介绍相关的知识,希望对你有一定的参考价值。

参考技术A Perlin噪声(Perlin noise) 指由Ken Perlin发明的自然噪声生成算法。

噪声 在信号处理中一般指原信号中不存在的无规则的额外信号。在处理过程中一般是我们不需要的,需要被处理掉的。噪声和信号本身无关,其频率和强弱变化无规律。

就如上面提到的那样,噪声是干扰原信号的存在。在信号处理中,我们一般都希望通过各种方法将其从原信号中剥离出来并除掉。既然如此,为什么我们还需要创造出各式各样的噪声生成算法。原因很简单,就是我们自然界中存在各种各样的噪声。而当我们的程序出于某些目的想要模拟这些随机过程时(例如云朵,火焰等),我们就需要噪声了。

我们用随机数算法产生的二维噪声图,如下图所示:

我们可以看到用随机函数生成的噪声纹理太过嘈杂,不像我们自然界中经常见到一些非常漂亮的噪声(像数目的纹理,石头的纹理,流水等)。因此,用这种噪声来模拟上述噪声难度太大了。这也是为什么图形学的先辈们想出各种各样其他噪声算法的原因。柏林噪声就是其中之一。

柏林噪声属于基于晶格(Lattice based)的生成算法。在介绍柏林噪声算法之前,我们简单介绍下什么是晶格。以二维图像为例,晶格就是等分的网格,以一定单位将我们的图像划分成x*y(x行和y列)的网格。如下图,我们将图像划分成了3 * 3的网格。

当晶格数目越多时,生成的噪声将越“密集”。

下面来介绍柏林噪声的算法:
Perlin noise噪声生成算法总共有三个步骤:

在这里对第三点插值权重值为什么不直接应用距离来算,即选择函数s(t) = t,来进行线性插值。因为我们的晶格长度都是单位长度,所以每个点到该点所处晶格顶点的距离是[0, 1]之间的数。而 s(t) = t 函数在 0 和 1 两点上的一阶导数不为 0(为1)。这样导致噪声变化的平滑程度加剧。而上述的s(t) = 3t 2 - 2t 3 和s(t) = 6t 5 - 15t 4 + 10t 3 的一阶导数在0和1两点的倒数都为0。且s(t) = 6t 5 - 15t 4 + 10t 3 的二阶导数也满足在0和1两点为0。说明s(t) = 6t 5 - 15t 4 + 10t 3 函数不仅在0和1的斜率为零,且斜率本身的变化率也为0。所以在每个晶格顶点附近区域的变化过渡会更加的平滑。

【图形学】谈谈噪声

需要分数布朗噪声(FBM)与柏林噪声澄清

【中文标题】需要分数布朗噪声(FBM)与柏林噪声澄清【英文标题】:In need of Fractional Brownian Noise (FBM) vs Perlin Noise clarification 【发布时间】:2013-06-04 16:06:00 【问题描述】:

我正在研究用于地形生成的各种类型的噪声,我对何时噪声变为 perlin 噪声以及何时 perlin 噪声变为 fbm 感到有些困惑。我希望有人可以澄清我出错的任何地方。我目前假设如下

噪声:包含幅度和频率,它与某种形式的插值(例如线性、余弦或三次)一起指示最终值。

Perlin Noise:倍频程噪声函数的总和(每个连续函数包含两倍的频率)。从我目前所读到的内容来看,幅度似乎总是呈现为一致的减少。例如,Noise1 包含 1 的 A,Noise2 包含 0.5 的 A,Noise3 包含 0.25 的 A,这意味着这里幅度每次减半。一定要这样一直保持一致吗?

FBM:多个 perlin 噪声函数的总和,其中每个 Perlin 噪声函数必须仅包含幅度递减的八度音阶。

【问题讨论】:

另一个看起来很棒但有点模糊定义边界的技巧是 iq 的解析导数夹具:iquilezles.org/www/articles/morenoise/morenoise.htm 【参考方案1】:

Perlin Noise 实际上是一种计算所谓 Noise 的方法。它是一种相干噪声,计算为伪随机基础函数(或伪随机生成的梯度)的插值归一化梯度。频率控制梯度的“采样”距离,所以频率越高,采样距离越小,单位空间的梯度越多。振幅控制噪声函数的最大值和最小值。

Hugo Elias' page on Perlin Noise对概念、算法等有很好的描述。 Perlin Noise FAQ 以非常直观的方式解释了算法。

噪音是一个通用术语。 Perlin 噪声只是一种相干噪声。但是有很多不同的类型,具有不同的特点。

分形布朗运动实际上就是您所说的柏林噪声。它是 Perlin Noise(或其他类似的噪声函数)的多个步骤的组合,每个步骤具有不同的频率和幅度。在程序生成的背景下,从一个步骤到下一个步骤的频率变化称为间隙。从一个步骤到下一个步骤的幅度变化称为增益。

看看this。 这个地形生成项目很好地描述了 fBM 是什么以及它是如何计算的。

我希望这会有所帮助!

【讨论】:

您还可以在此处找到有关噪声的一般信息:scratchapixel.com/lessons/3d-advanced-lessons/noise-part-1 Hugo Elias 的页面很混乱,他所说的是价值噪音,而不是 Perlin 噪音。它们是不同的方法和质量。实际上,价值噪声是 Perlin 噪声的廉价替代品。 en.wikipedia.org/wiki/Value_noise Perlin Noise FAQ Mirror【参考方案2】:

perlin 噪声使用斜率来创建圆形气泡相关性,以获得更自然的外观。

八度音阶方法结合了各种尺度的噪声以生成更复杂的形式。显然,这种技术就是所谓的“分形布朗运动”。我以前从未听说过这个,但我做了一些研究,这就是我得到的。

您可以使用带有任何类型噪声的八度音阶,并在频率和幅度上随意缩放它们。一半的事情是出于数学原因从结果中删除某些伪影。

但是这个八度音程是一种独立于柏林噪声的技术。它们可以很好地协同工作,因此可以一起使用。

白噪声倍频程又名白噪声 fbm 称为值噪声。它倾向于显示底层网格,因此通常使用 perlin 噪声代替。

【讨论】:

以上是关于柏林噪声原理介绍的主要内容,如果未能解决你的问题,请参考以下文章

Ray Tracing The Next Week 超详解 光线追踪2-4

需要分数布朗噪声(FBM)与柏林噪声澄清

语音增强之谱减法

(转载)柏林噪声

柏林噪声的每顶点法线?

2D 柏林噪声