【问题标题】:Simplex noise vs Perlin noise单纯形噪声与 Perlin 噪声
【发布时间】:2011-09-20 07:51:33
【问题描述】:

我想知道为什么在 Simplex 出现后 Perlin 噪声在今天仍然如此流行。单纯形噪声是由 Ken Perlin 自己制造的,它应该取代他的旧算法,该算法在更高维度上速度较慢且质量更好(没有可见的伪影)。

Simplex 噪声于 2001 年问世,在这 10 年中,我只看到人们在为地形生成高度图、创建程序纹理等方面谈论 Perlin 噪声。

谁能帮帮我,Simplex 噪声有什么缺点吗?我听说 Perlin 噪声在 1D 和 2D 噪声方面更快,但我不知道这是不是真的。

谢谢!

【问题讨论】:

    标签: image-processing textures perlin-noise simplex-noise


    【解决方案1】:

    “如果它没有坏,就不要修理它。”

    看看你是否能找到任何人告诉你为什么 Simplex 更好。 “它更快并且扩展到多个维度”和“简单噪声尝试降低更高维噪声函数的复杂性”是我发现的。我们中的大多数人都在 2 或 3 维中工作,如果我们足够幸运能够随着时间的推移做某事,可能会使用 4 维。

    我认为公平地说,Perlin 的实时使用量太少而无法处理,对于大多数用途来说,标准的 Perlin 噪声就足够了。在预渲染中(例如在电影行业中使用的),时间并不重要,因为无论如何渲染都很慢;在实时模拟中,我们有足够的方法来减少正在进行的处理范围,您不太可能每隔几纳秒/毫秒就生成大量噪声图——这只是基本的实时优化。

    【讨论】:

    【解决方案2】:

    如果仅仅是因为名字,我一点也不感到惊讶。您必须在 Perlin 噪声和 Simplex 噪声之间进行选择。后者较新并且有一些优势。但是,你知道,这听起来像是两者的“简单”版本。我会选择更复杂的;噪音应该很复杂,不是吗?

    人们往往是相当不理性的。

    【讨论】:

    【解决方案3】:

    Ken Perlin 为他的单纯形噪声算法申请了专利。据我所知,他的经典算法没有专利。

    【讨论】:

      【解决方案4】:

      对经典 Perlin 噪声的一些偏好可能来自于能够使用已知值产生已知的视觉特征,而不是投入所需的时间来找到使用单纯形噪声获得等效输出所需的输入参数。

      [simplex noise] 与它的视觉特征略有不同,因此它并不总是直接替代经典噪音的插件。依赖于经典噪声的详细特征(例如精确的特征大小、值的确切范围或更高阶统计数据)的应用程序可能需要进行一些修改才能在改用单纯形噪声时看起来不错。
      Stefan Gustavson 的Simplex noise demystified

      【讨论】:

        【解决方案5】:

        只是一些轶事经验,我使用经典 Perlin 噪声的原因是因为 Ken Perlin 有一个 C implementation 的经典 Perlin 噪声,同时提供了一个 Java implementation 的改进的 Perlin 噪声。听起来很傻,经典的 Perlin 噪音更容易复制并粘贴到我的程序中,所以这就是我使用它的原因。我一直打算转而移植那个 Java 实现,但经典的 Perlin 似乎工作得很好,所以我从来没有费心添加它。

        Stefan Gustavson has some very good C implementations of Simplex Noise, here

        【讨论】:

        • 感谢您的网址。该页面没有列出代码的许可条款。知道它附带什么样的许可吗?
        • 据我所知,每个人都使用 Perlin 噪声而不需要任何许可。另请注意Stefan Gustavson's C implementations 非常好。
        【解决方案6】:

        我还没有处理过单纯形噪声,但我可以想到几个原因:

        • 也许是因为我们习惯了正方形和 90 度角?正方形、立方体……对我们来说比三角形、四边形或超四边形更自然。
        • perlin 噪声中的每一层都只是一个简单的位图。
        • perlin 噪声的输出是易于平铺的正方形。纹理通常是平铺的正方形。
        • 您通常使用低维噪声。根据我的经验,2D 和 3D 是最常见的。
        • 单纯形噪声更难理解和实施
        • 可能显卡中的采样器可以对用于 perlin 噪声的正交位图进行插值,但不能对用于单纯噪声的 60 度角位图进行插值。 (这点可能有误,我几年没用显卡了)

        【讨论】:

        • 嗯,好吧,我会尝试用我目前对 Perlin 噪声、Simplex 噪声和分数布朗运动的知识来解决这个问题。我在下面的观点可能是错误的,所以如果我说的不正确,请纠正我。陈述 1:可能是真的,但人们总是可以修改噪声的输出,使其看起来呈 90 度角的四四方方。陈述 2:Afaik,fbm 正在使用噪声,无论是 perlin、simplex 还是任何其他噪声,它都会创建八度音阶层。 Simplex 和 perlin 只是一种噪音,与层无关。陈述 3:与我对陈述 1 的回答相同
        • 我主要知道程序纹理生成中的perlin噪声。在概念上,您可以通过创建由随机灰度像素组成的位图来创建它,然后使用不同的缩放因子混合多个图层。 freespace.virgin.net/hugo.elias/models/m_perlin.htm 展示了如何通过简单地混合几层随机像素位图来创建柏林噪声。
        • 声明 4:好的,当然,您也可以在 Simplex 中使用 1D 和 2D,它不会产生像 perlin 噪声那样的伪影。声明 5:我不同意,它是专门为使其更容易在硬件中实现而设计的,但我不知道 CPU 方面的情况,我很容易转换到它。陈述 6:我不知道,但就像我对陈述 5 的回答一样,根据 Ken Perlin 的说法,Simplex 应该更容易在 GPU 中实现。
        • "据我所知,最让人困惑的是Ken Perlin的Java参考实现的不可理解性。他提供了非常紧凑且未注释的代码来演示原理,但该代码显然是不打算作为教程阅读。经过几次尝试后,我放弃了代码,而是阅读了他的论文,这更加清晰。”
        • 关于您对将多个图层混合在一起的评论,这不是柏林噪声的一部分,即 fBm。 fBm 产生几层噪声并将它们混合在一起。对 Simplex 噪声执行相同的概念。那里没有变化:)
        【解决方案7】:

        我会直截了当地回答这个问题,我会说这是因为 Perlin 噪音非常容易让你头脑发热。另一方面,单纯形噪声是一种非常复杂且毛茸茸的野兽。启动和运行 Perlin 实现比 simplex 容易得多,因此得到更多使用。两者在视觉上非常相似(尤其是在您稍微处理噪声之后)对单纯形的情况没有帮助。

        Kenneth Perlin 自己为基于硬件的实现设计了simplex 算法,因此做出了使这更容易的设计决策。这方面的一个例子可以在这个引用中看到,来自专利。

        需要表内存:最初的 Noise 算法依赖于大量的表查找,这在软件实现中是相当合理的,但在硬件实现中成本高昂并构成成本瓶颈,尤其是在多个 Noise 实例时功能需要并行。理想情况下,Noise 的实现不应该依赖于存在显着大小的表。

        【讨论】:

          【解决方案8】:

          恕我直言,单纯噪声看起来更糟,很多人认为它在更高维度上看起来“越来越糟糕”。对于大多数应用程序,我仍然推荐它而不是 perlin,因为大多数应用程序不会只使用原始单纯形,而是使用它的八度音阶,它看起来与 perlin 的八度音阶大致相同,并且八度音阶的速度要快得多。

          【讨论】:

          • 与我的解释相差不远。我确实有几点要补充:Simplex 的单个八度音阶更“点”,但在一个好的 impl 中仍然有更少的定向伪影。添加多个八度音阶时,点状消失但方向偏差仍然存在,使 Simplex 成为更高质量的选择。如果您需要一个八度音阶,那么为了避免方形和点状,我要么使用经过修改以产生更少点状结果的单纯形(例如底部显示的我的 OpenSimplex2S 算法i.imgur.com/gvhRwmX.png),要么使用一片域旋转的 3D+佩林i.imgur.com/k06UVx5.png
          猜你喜欢
          • 2012-01-14
          • 2020-06-06
          • 2014-02-15
          • 2013-08-22
          • 1970-01-01
          • 2013-09-23
          • 2011-06-12
          • 2021-06-30
          • 2013-07-23
          相关资源
          最近更新 更多