为了实现程序化地形,我实现了双线性插值白噪声。

我可以得到这种结果:

opengl - 具有脊形分形噪声的程序地形-LMLPHP

我想实现脊形分形噪声,以获得更真实的地形,例如:

opengl - 具有脊形分形噪声的程序地形-LMLPHP

但是,我找不到有关脊形分形噪声的很好的教程。你能告诉我怎么做吗?

最佳答案

脊式Perlin噪声实际上很容易做到-您只需对最终的高度图或噪声层的某些子集进行ABS()(然后反转所得的高度图值,以确保脊出现在较高的值)。

示例:opengl - 具有脊形分形噪声的程序地形-LMLPHP(带有三线性插值的基本Perlin噪声,然后是整个高度场的ABS和INVERT)。 (INVERT的意思是“乘以-1”。)

我强烈建议尝试分形噪声层的各种配置以及基本的数学/逻辑运算。

另一个示例:opengl - 具有脊形分形噪声的程序地形-LMLPHP(两个不同的低频Perlin噪声层使用逻辑INTERSECTION/数学MINIMUM函数合并)

但是,对分形噪声算法进行简单的修改不会为您提供那些看起来像“下坡”的细节(并使地形更加逼真和吸引人)。要实现这些目标,您将需要添加某种侵 eclipse 模拟,这是一种更为复杂的野兽(在算法方面和在CPU方面)。

有关这方面的信息,我推荐这两篇论文(您可以忽略GPU部分,算法可以在CPU上正常工作,尽管以我的经验,对于1000x1000 px的图像,仿真需要花费一分钟左右的时间):

  • Mei, Xing, Decaudin, Philippe and Hu, Bao-Gang. Fast Hydraulic Erosion Simulation and Visualisation on GPU. 2007.
  • Fast Hydraulic and Thermal Erosion on the GPU. Jákó, Balász. 2011. The 15th Central European Seminar on Computer Graphics.

  • 编辑:

    让我们澄清一下“在高度字段上应用ABS”的含义。

    您只需在 map 的每个像素中获取高度的数值,然后在其上应用ABS()函数,并丢弃其符号即可。

    假定珀林噪声发生器生成的值在范围(或另一个以0为中心的范围)内。预计约50%的像素的值大于0,而预期约50%的像素的值小于0。

    由于所有双线性/三线性插值将确保曾经有一个平滑的斜率穿过0值,因此ABS会在0所在的位置创建尖锐的山脊。

    考虑这张图片:

    opengl - 具有脊形分形噪声的程序地形-LMLPHP

    它显示了两个COS(x)函数,其中一个是使用ABS函数调制的(我添加了一个小的偏移量以确保两条线分别可见)。现在,想象一下紫色的线是垂直翻转的-您最终会看到两座山,两山之间有锋利的山脊和一个山谷:)

    关于opengl - 具有脊形分形噪声的程序地形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36796829/

    10-12 14:05