本期为GAMES104《现代游戏引擎:从入门到实践》视频公开课文字实录第19期。本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发。
课程共计22个课时,将介绍现代游戏引擎所涉及的系统架构,技术点,引擎系统相关的知识。为配合学习实践,课程组在 GitHub 上开源了小引擎Piccolo,上线1个月即获得了2900+star, 累计下载量已超过20000+。
以下内容为公开课视频转文字版本,为阅读通顺,有删减
今天我们介绍如何渲染大自然,包括地形、大气和云的渲染技术。下图是游戏《荒野大镖客》中的截图,我个人认为是十分壮丽的,因为它完美地诠释了我们所生活的这个星球上的世界。大家可以看到日夜变换、阳光、云层、雨水、树木、山川河流等自然现象和景观。(关注公众号,回复关键词“课件”,获取10000+页课程PDF)
对于游戏研发者来说,特别是图形工程师来说,最大的挑战就是如何将这些现象在虚拟世界中用0和1表现出来。
GAMES104课程专注于讲解如何开发游戏引擎,而不是教大家如何使用现有的引擎做出上图中的效果。制作上图中的效果比较简单,但如果是开发制作这种效果的引擎,我们就需要知道底层的原理。我们首先从观察大自然开始来理解我们所生活的世界。下图中是一张真实世界的照片,我们可以看到很多物体,比如天空、植被、河流、大量的小溪、乱石等等。如果我们在引擎中实现了前5讲所介绍的功能,我们会发现,引擎所表现出来的效果和上图相差甚远。引擎缺乏天空效果和天空中云的效果,地面上的植被也表现得非常差,地形绘制功能也很差。这就是这一节课要解决的问题。
01「地形的几何」
在我们的游戏引擎团队中,会根据大家从事的具体方向对工作进行分工,有的同学会专门负责地形的渲染,有的同学会负责天空效果的渲染。下面的截图来自于《微软飞行模拟》,《微软飞行模拟》整个游戏占用的存储空间大约是150G,需要通过不停地串流数据(Streaming Data)来将地图拼接在一起。我们举这个例子是为了说明现代游戏引擎对于地形的绘制能力。
下面的截图来自于另一款游戏《无人深空》,这款游戏当年曾经欺骗了很多人的感情,但我还是很佩服开发这款游戏的工作室,他们一直没有放弃,不断地在进行更新和优化。
地形绘制技术不仅需要表达类似于地球的世界,而且还要表达外星地貌,比如火星等星球的地貌效果。
我们先介绍最简单的表达地形的方法,这就是高程图(编者注:即Heightfield,也可以称为高度场,下文会混合使用这两个名词)高程图并不是什么新技术,早在几十年前的测绘行业中,人们就已经开始使用等高线(Contour)图来表达地形的高低变化,包括人造卫星对地球进行扫描所生成的也是高程图。
仔细观察下图中左边的两幅图像,我们会发现,这两幅图像类似于分形图。分形是一种可以无限缩放、无限自我相似的一种形状(编者注:即分形的每一部分都是整体缩小后的形状,或者近似于整体缩小后的形状)自然界中的一切,无论是雪花、海岸线,还是山脉的走势,包括山脉的腐蚀,都符合分形的原则。我们后面会介绍如何让计算机自动生成各种各样的地貌,而这个数学规律是非常有用的。当我们得到了高程图之后,对地形的渲染就会变得非常简单。虽然高程图技术非常简单,也较为古老,但配合适当的材质纹理和光影之后,它的表现力十分优秀。这也是为什么直到现在,高程图还是现代游戏中地形渲染的主要方法。
有了高程图之后,最简单的渲染方法就是每隔1米或0.5米生成一个均匀的网格,再将每个顶点根据高程图进行位移,形成我们想要的地形效果,然后在上面应用各种属性,比如高度、材质等等。这种方法存在着一定的局限性,比如当我们想表达一个很大的世界(开放世界)时,这种方法显然不行。因为如果我们表达1平方公里的地形,并且每1米生成一个格子,则会生成200万个三角形,计算机还可以进行处理。但如果我们需要表达几千平方公里到上万平方公里的地形,计算机显然无法对海量的三角形进行处理。
大家很快就会发现,这个事情并不难。我们观察上图中的地形可以发现,在近处可以看到地形的无数细节,而远处则看不到细节。这里存在着大量的优化空间。我们在前面的课程中提到过一个概念,叫做LOD。LOD的全称是“Level of Detail”,即根据物体在屏幕上占据的面积大小或距离的远近