3 个稳定版本

1.1.0 2024 年 1 月 29 日
1.0.1 2023 年 10 月 19 日
1.0.0 2023 年 2 月 14 日

#162 in 算法

每月 26 次下载

CC0 许可证

125KB
2K SLoC

OpenSimplex 2

OpenSimplex Noise 的后续版本,以及更新的 OpenSimplex。包括 2D、3D 和 4D 噪声。

动机

旧版的 OpenSimplex 使用了与 Simplex 不同的网格布局方案。它在常见应用中表现良好,但与原始 Simplex 点布局在 3D/4D 中的对比度不够一致。当扩展到 5D+ 时,它完全崩溃,产生了明显变化的值范围的斜带。

OpenSimplex2 不是通过顶点重排,而是通过在需要的地方使用不同的方法构建和遍历相容布局。

还重新审视了梯度向量表,以改善旧噪声和新噪声的概率对称性。

包含

OpenSimplex2(F)

  • 看起来最像 Simplex。
  • 与常见的 Simplex 实现一样快。
  • 3D 是通过构建两个旋转的立方体网格的偏移并集作为旋转的体心立方网格来实现的,然后找到每个网格上最接近的两个点。
  • 4D 是通过使用 5 个偏移的(反向倾斜的)网格副本来实现的,以产生目标网格。这项技术可以推广到任意数量的维度。
  • 捆绑的 2D 函数只是带有良好梯度表的 2D Simplex。4D 技术也扩展到 2D,但发现这种方法更快,并且没有找到其使用的限制证据。3D 和 4D 是该领域的创新贡献。

OpenSimplex2S

  • 看起来最像 2014 年的 OpenSimplex。
  • 使用类似于 2014 年 OpenSimplex 的大顶点贡献范围,但在 3D 和 4D 中具有更好的均匀性。
  • 3D 的实现方式与 OpenSimplex2(F) 相似,但找到每个网格上最接近的四个点以匹配更大的半径。
  • 4D 使用普通斜率和一个预生成的 4x4x4x4 查找表实现。在我的项目待办事项中,我有一个更过程化的实现正在进行,如果我发现它在性能上具有竞争力,我将将其替换。
  • 2D 基于 Simplex,但使用不同的方法来找到哪些点在范围内。
  • 推荐用于脊噪声(如果将单个层传递到 abs(x))的选择。

更新后的梯度 Legacy OpenSimplex

  • 在某些使用原始 OpenSimplex 的代码库中,将具有新梯度表的相同噪声替换进去可能需要更少的开发周期。这带来了适度的改进,而没有改变一致性特征或内部频率。
  • 包含在 _old/{language}/legacy 中。

较老的 OpenSimplex2 实现

  • 在性能和可移植性重新设计之前的 OpenSimplex2 噪声实现。
  • 也可以在 _old 目录中找到。

注意:区域生成器已移动到 它们原始的存储库

C FFI 使用

如果需要,请安装 Rust 工具链

使用以下命令构建调试或发布工件

cargo build
# or
cargo build --release

库文件将在 ./target/{debug,release}/ 中。从 ./rust/OpenSimplex2.h 复制头文件。

变更日志

  • 调整了此 README.md。 (2022 年 3 月 26 日)
  • 重写了函数以实现无实例化种子化和减少对查找表的依赖。重新组织了存储库。在文件/类名称中将 OpenSimplex2F 重命名为 OpenSimplex2。 (2022 年 1 月 16 日)
  • 简短了 Simplex/OpenSimplex2(F) 4D 的查找表(2020 年 7 月 5 日)
  • 将 4D 添加到 OpenSimplex2(F) Java/C#,将 OpenSimplex2S 4D 移植到 C#。 (2020 年 7 月 5 日)
  • 将 4D 添加到 OpenSimplex2S Java。 (2020 年 4 月 30 日)
  • README.md 中的单个渲染替换为综合渲染。 (2020 年 2 月 10 日)
  • 将 12 个方向的 2D 梯度集替换为 24 个方向的集,以减少在阈值单八度 2D 噪声中可见特征重复。 (2020 年 2 月 10 日)
  • 将文件名 FastSimplexStyleNoise 重命名为 OpenSimplex2F,将 SuperSimplexNoise 重命名为 OpenSimplex2S。 (2020 年 2 月 10 日)
  • 将遗留的 OpenSimplex 移动到遗留目录。 (2020 年 2 月 10 日)
  • 稍微重新组织了上面的描述,并添加了 TODO/变更日志。 (2020 年 1 月 23 日)
  • 将噪声重命名为 "OpenSimplex (2.0)",分为两个版本/变体。 (2020 年 1 月 23 日)
    • SuperSimplex 和 FastSimplexStyleNoise 在算法上非常相似,并且与原始 OpenSimplex 的精神相同。
    • OpenSimplex 在许多项目中都有使用,命名可能有助于促进在其替代位置采用新的噪声。
  • 添加评估器的 C# 端口。 (2020 年 1 月 13 日)
  • 创建包含区域生成器的单独文件。 (2020 年 1 月 13 日)
  • 将 PlaneFirst 评估器重命名为 XYBeforeZ,并添加 XZBeforeY。 (2020 年 1 月 13 日)
  • 修复了 AreaGenLatticePoint3D 中用于区域生成器的 equals() 方法。 (2019 年 12 月 24 日)

渲染

2D 噪声

Renders 2D

  • OpenSimplex2S 是 OpenSimplex2(F) 的更平滑的副本。
  • OpenSimplex2S 和更新后的 OpenSimplex 实际上是相同的。
  • 原始 OpenSimplex 产生了更多直的部分,并且不太可能是概率上对称的。

3D 噪声(改进 XY 方向)

Renders 3D ImproveXY

  • OpenSimplex2(F) 和 OpenSimplex2S,3D ImproveXY 的 2D 切片,在沿第三轴移动时保持大部分相同的属性。
  • 更新后的 OpenSimplex 在切片中都看起来不错,但切片彼此不同。在动画中,这一点尤为明显。
  • 原始的OpenSimplex不如均匀,也不具备相同的概率对称性。

3D噪声(后备方向)

Renders 3D Fallback

  • OpenSimplex2(F)和OpenSimplex2S是3D在经典晶格方向上的二维切片,看起来不错,但不太适合X/Y平面作为主要关注点。
  • 这个更新的OpenSimplex渲染似乎比原始的OpenSimplex表现出更少的方向偏差。

4D噪声(改进XY_改进ZW方向)

Renders 4D ImproveXY_ImproveZW

  • OpenSimplex2S 4D比原始OpenSimplex具有更高的对比度。
  • OpenSimplex2(F) 4D具有非常密集的外观。对于fBm来说很合适,但如果用于崎岖噪声,可能最好与额外的步骤搭配使用。

4D噪声(改进XYZ方向)

Renders 4D ImproveXYZ

  • 二维切片看起来不错,但这种旋转主要用于使用额外的时间变量对3D对象进行纹理处理。

4D噪声(后备方向)

Renders 4D Fallback

  • OpenSimplex2(F)具有最明显的对角线伪影,其次是旧版OpenSimplex。

4D噪声(环面映射)

Renders 4D Torus

  • 4D生成的无缝可重复的二维噪声,使用noise4(r sin x, r cos x, r sin y, r cos y)进行映射

公共领域奉献

这是一款免费且不受限制的软件。大多数文件都在CC0下发布。标记的某些目录中的文件属于UNLICENSE,因为它们是基于UNLICENSE代码(例如,拉取请求、带有DigitalShadow查找表的旧OpenSimplex)以外的代码。根据我所知,没有专利要求涵盖此处实现的内容(尽管这里也没有法律建议)。请使用此软件制作酷炫的东西,而不是专利!享受吧。

无运行时依赖