Unity图形编程

【GDC 2017】Building Worlds with N

2022-01-29  本文已影响0人  离原春草

今天这是通过Perlin噪声生成的高清地形效果(Perlin噪声输出高清贴图),可以看到这种地形虽然看似合理,但是却缺少了真实地形的自然感,比如地形存在较为严重的重复,山体的梯度也基本上保持一个常数等。形随机生成的相关噪声算法,视频链接在文末给出。

为了能够生成多样化的游戏世界,并且保持一个可控的性能与内存消耗,Hello Games尝试了很多种方式,其中第一种方式就是照搬《我的世界》中的噪声算法,也就是使用三线性混合的分层低频Perlin噪声,总的来说就是使用一个低频(低频的好处是可以移除高频中的奇怪细节,从而得到平滑的地形效果)的3D Perlin噪声(噪声存储为一个volume texture),之后通过三线性插值的方式将噪声用于地形生成,具体细节可以参考[2]。

上图是Minecraft中的截图效果,不过这种效果跟真实世界的效果还有比较大的差距,Hello Games想要得到的是下面截图中的效果,具有更真实的山脉,水体侵蚀等自然景观。

Hello Games的第二种尝试是使用高频噪声生成初始地形,之后通过图像处理算法生成合理地形效果。

这是通过Perlin噪声生成的高清地形效果(Perlin噪声输出高清贴图),可以看到这种地形虽然看似合理,但是却缺少了真实地形的自然感,比如地形存在较为严重的重复,山体的梯度也基本上保持一个常数等。

第三种尝试是通过对地球上的真实DEM(digital elevation map)数据进行训练,经过训练之后就能够得到真实地形的shape,gradient分布等数据,将这个数据输入到噪声生成算法中从而以求输出真实自然的地形效果。

Ian Parberry通过对真实地形数据的分析发现,地形的梯度数据是符合指数分布的,将这个分布规律应用到Perlin噪声中就能够得到上图中的较为真实的地形效果,具体可以参考[3]。这个地形效果在真实感上面已经十分令人满意了,不足之处在于真实世界太过无聊(boring),而这就跟游戏的初衷相违背了。

最终Hello Games选用了一种叫做Uber Noise的生成算法,这是一种unifying的方法(没做解释,不太理解这里这个词的具体含义)

在Uber Noise中,这些噪声都有被用到,下面会讲这些噪声是如何使用的,已经通过对这些噪声的组合,最终能够输出什么样的效果。

Perlin噪声是十分常见的噪声,经常用于地形、云层等的模拟。

Perlin噪声在使用的过程中通常会跟FBM算法(多层不同频率不同幅度的噪声叠加)结合用于输出更为真实的图形效果。

将上述的算法输出取绝对值,就得到了上图中的billow效果。这种效果能够输出具有尖锐梯度(sharp crease)的地形侵蚀效果以及平缓的billowy效果。

将Billow效果翻转就能够得到Ridged效果,这种效果适合输出具有尖锐梯度的陡峭山峰的效果。

要想生成真实世界中的各种自然地形效果,比如地洞、河流、侵蚀等,经常会需要了解到周边像素或者voxel的数据,而普通的噪声是没有办法获取到这些数据的,因为会不断的向前传递递归,基本上就等于无解了,但实际上我们是可以通过对低频噪声进行处理,将其梯度等数据传输给高频噪声用于对高频噪声进行调制从而得到类似的效果,上面的算法给出了这个过程的具体描述,下面截图中也给出了一些更为具体的参考资料。

Carpentier给出了一种通过GPU完成的实时地形生成算法,这个算法包含了程序化地形生成以及渲染方案,生成算法最终可以给出十分真实的山脉、河流等侵蚀效果(借鉴了Inigo Quilez的算法),具体可以参考其博客[4]以及毕业论文[5],下图是论文中的相关截图。

这是普通Perlin噪声的输出效果

将低频噪声的梯度输入高频噪声的生成算法中,可以得到这样的真实自然也更为有趣的地形效果。这里是单层地形的效果,而No Mans Sky实际上包含了多层地形,下一层地形会使用上一层地形的输出作为输入。

下面要介绍的是Domain Warping算法,也就是使用另外一个函数来对生成的噪声进行调制。一步步来介绍其中的实施细节,上图中是普通的Perlin噪声输出效果。

在Perlin FBM的基础上,通过FBM嵌套可以得到如上图所示的分层效果。

再次嵌套,可以得到更为细腻的分层效果,大图如下所示:

从这个图中可以模糊的看到河流的轨迹,而Hello Games就是使用这张图来生成海岸线以及河流的。

这是Inigo Quilez使用类似算法输出的带颜色的效果图,跟真实的地形效果虽然有一些差距,但是也相去不远了。

这张图是真实地形的俯视效果。

这里给出了希望从Uber Noise中得到的地形效果,下面来对实施的细节做一些披露。

这是Uber Noise的调用接口,可以看到具有较多的输入参数。

Sharpness是通过对Ridge效果跟Billowy效果的混合而得到的。

Erosion用于控制地表的细节

根据derivative调整幅度,通常用于实现不同类型的erosion

对Domain进行Perturb

通过将需要突出的噪声数据塞入到Gain中来实现对应特征的放大。

参考资料

[1]. Building Worlds with Noise Generation - No Mans Sky - Video

[2]. The Word of Notch - Terrain generation - Minecraft

[3]. Modeling Real-World Terrain with Exponentially Distributed Noise - JCGT 2015

[4]. Scape - Giliam de Carpentier](https://www.decarpentier.nl/scape-render)

[5]. Effective GPU-based synthesis and editing of realistic heightfields - Giliam de Carpentier

上一篇 下一篇

猜你喜欢

热点阅读