《黑神话》是如何开发的?3D游戏技术介绍 | 陈经

《黑神话》爆火,正好借机科普3D游戏制作的常识。理解了本文,以后看游戏的眼光,就不一样了。笔者的感受是,这么复杂的游戏,居然是可以开发出来的,人类的技术发展真很伟大。

一.3D游戏开发常识

《黑神话》等动作游戏,全都是3D游戏。可以理解为有一个虚拟的游戏世界,其内部是三维的坐标系统,游戏中的物体都在里面活动。

玩家即时看见的只是游戏世界的很小一部分,随着玩家的行走、转身在不停游动变换。这个世界叫“摄像机视角”,它也是3D的。

但是目前的显示设备,是2D的屏幕。需要将摄像机视角的3D图景,转换成2D的画面显示在电脑、手机、平板、游戏机等设备上。

500

2D屏幕显示、3D摄像机视角、整个虚拟游戏世界

游戏是动态的,玩家希望看见画面流畅像放电影一样,越真实越好。这需要一个双缓冲区机制。

我们屏幕上显示的东西,是由显卡处理的(GPU以前就是显卡,后来增加了计算功能)。一幅2D图像内容放入“显存”,然后用一个显卡硬件调用,就会在屏幕上显示出来,呈现的画面叫“一帧”。如果更新画面时,对这一帧从上到下逐行扫描更新,就会出现上下不匹配的感觉。实际操作中,会准备显存中的另一个缓冲区,大小一样,在其中计算写入“下一帧”的图像数据。等全部准备好了,就将屏幕图像硬件调用的指针指过来,一下全部更新到屏幕上。原来的那帧,就成为计算再下一帧的图像缓冲区。如此来回切换,屏幕画面就像放电影一样推进了。

实践中根据人眼感觉,一秒钟显示切换30帧的“帧率”,人感觉较为流畅、可以接受了。帧率再低,就会有画面一跳一跳的卡顿、跳跃感。30的帧率继续提升,人眼会感觉画面更为流畅,普通人到60帧达到满意的程度,不需要更高了。有些玩家就追求玩《黑神话》的硬件,或者调整设置,要达到60的帧率。帧率还可以继续提高,游戏发烧友会追求120帧,其实区别没多大。再往上只有对画面极为敏感的职业电竞选手有追求了。

因此,游戏显示帧率一般是在30-60帧,以60帧为优化目标,30帧为优化底线。偶尔出现低于30帧的情况还能忍,经常出现就有问题了。另外,一秒内帧率波动,出现“掉帧”的情况也不好,不能300毫秒只有3帧,余下700毫秒27帧。有时Switch等游戏硬件上的30帧比电脑上的60帧感觉还流畅,因为帧率稳定,掉帧情况少。

以上是最基础的知识,游戏画面是从哪来的。但是,对于游戏世界如何构建,还需要更多的知识介绍。

虚拟的游戏世界,肯定是用“数据结构”来存储的。游戏世界一般模拟的是人类生活的世界,开发者总结出了几类有特性的数据结构。

地形、天空盒、植被、水体、粒子特效、场景物品、角色、布料、光源,游戏世界就是这些东西构成的。每一类都有自己的特色,相关的数据结构和处理算法都需要专门设计。

天空盒(或者天空球)可以理解为,用一个很大的方形盒子或者球形,笼罩住整个3D世界,盒子上会贴上天空图片。有些天空算法能让天空图片动态变化,效果更自然。这个盒子非常大、非常高,甚至无限高一样,玩家在地面移动时会感觉天空是稳定的。但要注意,它并不是真有一个很大的盒子数据结构,后面说渲染的时候我们再解释下。

地形就是地图,还记录了地表的高低起伏,是游戏世界最基础的数据。植被是地表的草、树等覆盖物,量非常大,不断重复,但又要体现变化。水体有特殊的运动规律,有透明、反射、波动等属性。粒子特效实现烟雾、火焰、扬沙、扬尘、攻击波等效果。场景物品定义了游戏世界的活动空间,包括建筑、石头、土壤、道具等各类刚性物体,有的远观,有的能进去要有更详细的三维建模。

其实植被也可以当物品来理解。但其数量非常多,需要不同的高效处理算法,就专门定义成一个类别。

角色,是游戏进行时玩家主要的关注焦点。角色的属性最为复杂,需要更详细的定义,3D动作游戏不少角色有漂亮的专属动作。定义角色,一个重要的手段是骨胳关节系统。关节可以扭动,角色就可以变成各种各样的形态。

角色还会有衣服、饰品、面具等等,有时几层衣服。这些也需要专门的数据结构来处理,布料就能用来表示衣服。

最特殊的一类东西是光源。有火炬、蜡烛之类的光源。有时有一个外来光源,相当于太阳一样的平行光。由于光会反射、折射、吸收、增强,光线的处理非常复杂,是图形显示算力需求最大的算法。实际上所有物体的颜色、亮度值都是以光源为基础的。

500

看看图中有哪些数据结构?

每一种数据结构的处理,都有非常深入的计算机图形学研究背景。但是随着技术的发展,这些重要数据结构的处理算法,都基本成熟、可用了。靠这些图形学算法,3D游戏开发才有基础。上世纪90年代3D游戏就有了不错的效果,软硬件算法不断进步,到现在游戏的效果提升极大,有时逼真得吓人。了解游戏开发的基础知识,就会明白游戏对于科技进步的拉动作用。

但是,3D游戏开发涉及的数据种类、算法,实在是太多了,一般开发者没有能力自己去从头实现,中小公司都不行。

还好有游戏开发引擎,如Unity和Unreal。游戏开发引擎将相关数据结构和算法打包好,直接提供框架给游戏开发者使用。开发者按照引擎使用规范,定义好游戏世界的数据,设定游戏规则,就可以把游戏编写出来了。Unreal和Unity就如同编程更常用的Visual Studio一样,是一个集成开发环境。

除了游戏,Unity还可以用于美术、建筑、汽车设计、影视等领域,都是3D模型、3D世界进行2D显示。引擎开发公司是Unity Software,中国子公司是Unity中国。Unity中国版叫“团结引擎”,有自己的特性,和英文版不一样。Unity是最常用的游戏开发引擎,开发的游戏类型和数量最多。Unity每年都会有大版本更新,如2019版、2020版,直到2024版,小版本更新就更为频繁。

Unreal中文叫“虚幻”(但没有特殊的中文版),现在流行的是虚幻4(或称UE4)以及2020年推出的虚幻5(或称UE5),《黑神话》就是用虚幻5开发的。虚幻引擎是著名游戏公司EPIC开发的,这个公司有《堡垒之夜》、《战争机器》等成功游戏作品。为了促进行业发展,EPIC把虚幻开发引擎的源代码开放了,和开源有区别,使用还是要付费,也有赚钱的目的。和Unity一样,虚幻引擎也可以用于影视等其它领域。

虚幻引擎相比Unity,率先实现了一些独门的先进图形算法(一些在《黑神话》中有应用,如Nanite、Lumen,后文介绍),能够更好展示一些游戏效果。但Unity后面也会实现这些算法,二者不能说有高下区别。虚幻引擎还有game play,一套定义游戏规则、角色动作的代码框架,而Unity没有。但这并非说虚幻就更好,也许开发者认为game play定义规则的办法对某些游戏并不高效。

个人开发者与中小公司一般会用Unity或虚幻引擎开发游戏,大公司也会用。但是大公司同时会有自己开发的引擎,代表了公司技术实力。

另外还有DCC(Digital Content Creation)软件、建模软件,如Blender、3DMAX、Maya,生成行业最通用的FBX模型文件。

以上是游戏开发概念性的常识,大约是如何开发的,没有涉及具体的数据结构与算法。

二.游戏开发基础算法概念

游戏世界的物体,基础的表示办法是三角形网格(Mesh)。

500

如图,三角形网格(Mesh)可以模拟物体表面,一个物体就能够定义出三维的形状了。从上图可以感觉到,顶点的密度大,三角形网格数量多,物体表面就能模拟得非常好了。三角形网格表示的基础是,任意多边形都可以切成多个三角形。也有其它的网格类型,如四角形网格(加一些三角形网格),但最常用的是三角形网格,《黑神话》应该也是。

一个三角形网格,要存储顶点的3D坐标、三条边,顶点的顺序可以区分正面与反面。还有一些其它性质,如法向量、材质属性。

玩家看游戏画面时,往往意识不到三角形网格的存在。这是因为,最吸引人们注意的,是物体表面(也就是三角形内部)的“内容”,而不是顶点。要用各种色彩去填充表面,不能是光光的三角形,那就太丑了。这就是三角形内部的“纹理”(Texture),其实就是一张图片(图片局部)贴到三角形上面去。显示时不止贴图片,还要结合光源计算出里面的色彩。

有了三角形网格表示、纹理表面贴图,一个物体就很象回事了。游戏中有近景、远景,对同一个物体可以设计精度不同的模型,近景用高精度,远景用低精度,分几个级别。但这都是静态的,游戏里很多物体的形状、角度是会变的。

物体如何变动、对撞反应,需要一个“物理引擎”。游戏世界的物理,和真实世界一般是不同的,有夸张、简化。也有尽量模拟真实世界的,做得很细,这是很难的,主打真实,但效果未必好。游戏世界只要效果好,完全可以变通处理,一些物理效果细究显然是不符合牛顿定律的。但没关系,人们很容易接受游戏世界的物理规则,比真实世界更有趣、好玩。

对计算机编程来说,这提供了很大的方便。一个物理引擎只要自洽地定义出来了,效果就是那样,出来什么是什么,只要玩家接受。如果是模拟真实世界,就得非常小心地定义和模拟,想调到接近真实很难。当然物理引擎也是以真实世界规律为基础的,大差不差,符合人们的物理直觉,不能搞得无法理解了。

500

例如《黑神话》里,悟空的棍风扫到了几株小草,小草的弯曲能显示棍风的存在。如果是真实物理,会比较麻烦。在物理引擎里,就可以简单处理,对小草加一个有方向的扰动,根据扰动力度,计算各顶点偏移量,模拟出效果不难。有时这种处理非常简单,都不用物理引擎就能做好了。真实世界从原理上来说,棍子一扫不可能有太大棍风,但游戏里可以直接定义一个数值,模拟出夸张效果。

物理引擎是游戏引擎里不算难的部分,游戏开发引擎会带上。英伟达就提供了物理引擎,这是它的风格,到处找有什么需求,早早就做在开发包里。Unity很早就内置了英伟达的PhysX物理引擎。

PhysX有刚体碰撞、粒子系统、布料模拟等。粒子系统可以模拟烟雾、水流、火焰,布料模拟是处理衣服、旗帜的动态效果,效果接近真实。可以理解为,英伟达PhysX算法目标是逼近真实,并不是专门给游戏开发用的,但用到游戏上也还行。

虚幻5的默认物理引擎是EPIC自研的Chaos,以前是用PhysX的。对有些游戏项目,Chaos更适合,因为它目标不是追求真实,而是游戏效果。

在物理引擎作用下,游戏世界接受玩家输入,就可以不断演化了。根据玩家视角,将3D游戏世界呈现在2D界面上,而这是游戏开发的核心任务,处理显示问题。

相关专业名词是“渲染”(Rendering)、“渲染管线”、“着色器”(Shader)。要理解这三个名词,需要先介绍3D动作游戏运行的硬件特性,CPU+GPU,其中GPU起到了主要的计算作用。

象《黑神话》这样讲究视觉效果的动作游戏,必须有GPU,档次低了还不行。理论上只靠CPU,就可以把这些物理引擎、3D世界转成2D显示的算法跑下来。早在90年代初,就有了《侏罗纪公园》、《终结者2》等效果不错的特效电影,那时GPU都没出来。但是,这些特效,都是用很长时间做出来的,放出来1分钟,做可能要1周。而3D动作游戏显示,需要实时计算,就需要非常强大的GPU来加速计算。

许多人对CPU的串行编程逻辑不陌生,但了解GPU编程的人就少多了。GPU有成千上万个计算核心,可以并行加速计算过程。但有非常多的细节,这些核心并不是都一样的,而是分成几类,各有擅长的任务,GPU内部架构也不简单。

Shader可以理解为GPU上跑的并行加速程序。有许多种Shader,完成顶点位置、象素颜色计算这些任务。给Shader准备好输入数据,它就会把计算后的数据写到显存、内存上去。

游戏开发引擎,会提供多种Shader,开发者也可以自己编写Shader,进行特别的处理。但光有Shader,相当于程序只有一些子函数,完成不了整个任务。

这时就需要“渲染管线”,管线安排好一连串处理动作。可以把渲染管线理解为CPU+GPU编程,是一个软硬件过程,每一步调用CPU或者GPU,其中会有多个不同的Shader完成主要的计算,CPU处理逻辑、准备数据。

渲染管线是将3D的游戏世界的游戏数据转化成2D屏幕上一幅画面的过程。游戏开发引擎提供了渲染管线代码,程序员可以修改。它会计算出现在“摄像机视角”的物体,将视角以外的物体剪裁掉,边缘要处理。它需要判断场景中的物体遮挡情况。对于每个物体,计算2D显示的颜色值。

一种特殊的算法是天空渲染,其实就是6张“参考图片”,作为天空采样的纹理,对应立方体的6个面,天空渲染时根据当前位置方向计算出天空颜色值。从这个意义上说,“天空盒”实际并不存在,没有在场景文件里。

500

一个游戏的渲染管线编写完成,关于图形显示的部分就好了。但是,如果换了GPU,可能需要换一种渲染管线。如GPU不够强,一些高开销的Shader跑不了,就要换成低开销的Shader,帧率、画质就要降了。《黑神话》程序第一次启动的时候,会进行“着色器编译”,就是在根据机器的CPU+GPU组合,编译出合适的二进制代码,之后再启动就不需要了。

《黑神话》这类3A游戏,对GPU的性能有要求,就是这个原因。如果GPU连游戏最低要求的Shader都跑不了,游戏就跑不起来,干脆不让玩算了。Shader的计算过程更不可能换成CPU跑,太慢无法接受。

要注意渲染管线只管显示相关的计算,象游戏的game play玩法、物理引擎,这些是另外的管线,也可能调用GPU。Rendering,就是指计算渲染一帧画面、向显存写入画面数据这个动作。渲染是动作,渲染管线是过程。

介绍到这里,3D游戏开发的主要脉络就有了。但是还差一个最重要、最复杂的部分,光照模型。场景的样子,是由一个或多个光源光照的效应决定的,计算非常复杂,还与物品的材质有关。物品的材质,其实就是物品与光线交互的性质,物体看上去是草、树还是水,是吸收、反射、透明这些光照属性决定的。

物体的颜色不是其固有属性,有较为复杂的物理学理论,涉及光学的漫反射、镜面反射、微表面理论等概念。在游戏开发里叫Physical Based Rendering,用于处理光线与物品的交互,光照模型也是渲染中的重要概念。

一个简单的光照模型是,只考虑直射光,就是假定场景中的每个点都独立地受各个光源直接照射的影响。光源可以抽象成点光源,平行光相当于无限远、无衰减的点光源。要计算场景中一个点的亮度,就假定是所有点光源打在这个点上的复合效应。这个计算方法简单,也能用GPU加速,能提供一个基本的光照效果,实际上大多数游戏就这么做了,但显得不够真实。光线会在物体上发生反射、折射,等于又有新的光源了,这个效应简单光照模型没考虑到。

复杂些的是全局光照模型,就是把光线的反射、折射效应也考虑进去。理论上这非常复杂,直接光照、间接光照,还要积分。有一些传统算法来处理,但现在硬件好了,就可以实时地用光线追踪(Ray Tracing)算法了。

500

光线追踪算法,是从视点(眼睛)发出数以亿计的光线,模拟与物体相交、反射、折射,反复迭代,直到遇上光源或跑出去了、迭代次数够多了。图中蓝线就是从视点发出的追踪光线,根据折射、反射等效应产生次生光线。虚线代表光源对每个关键点的作用,光源主要的可能作用路径都被考虑到了,最终可以计算出复合效应。可能的作用路径非常多,但如果转折太多次,光强就可以忽略了。

要注意,光线追踪算法的“光线”,是从眼睛逆向发出来去寻找光源,而不是从光源发出来,反直觉的。这是因为最终玩家是用眼睛去看画面,眼睛能看到的光才有意义,从眼睛发出来光线逆向推导更有效。而光源发出来的光线,要机缘巧合才能到达眼睛,不适合用来做光线追踪。

这是一种蒙特卡洛抽样模拟算法,视点放出的光线越多模拟效果越好。光线追踪算法效果最好,能够模拟出很好的阴影、反射效果,水面反光、火焰倒影等场景很炫。GPU常用光追来展示性能,英伟达的RTX系列GPU,1秒钟可以发出上百亿根光线。

500

500

《黑神话》开光追的下图,水体折射倒影效果惊人,上图未开光追

《黑神话》等游戏界面会有选项,选择画质、是否开光追等等。在一些场景,开光线追踪会有明显效果。

《黑神话》广受好评的画面展示,还有虚幻5引擎中Nanite技术和Lumen技术的功劳。

500

黑神话中的佛像群,极精细的建模

黑神话画面的一个特性是,景色逼真,无论近景、中景、远景看着都很自然。前面说过,一个物体的模型会有高精度和低精度的,用于近景和远景显示,分几级。但有时会有不太自然的感觉,精度有跳变。Nanite技术可以加载超高精度的模型(多达十亿个三角面),几何体更为真实细腻,这需要高效的几何压缩和内存管理。看程序需要,实时计算出合适的模型和场景显示,而非存储几级低精度模型。这需要很好的优化,模型要渲染多少个面是动态决定的,看不见的、远的就可以节省算力,等于模型本身都在动态变化。总体效果就是场景画质很高,变化自然,实时流畅,达到了影视级的高质量画面。

500

影视级的高质量画面

虚幻5的另一个重要技术是关于光照的Lumen技术,让《黑神话》的光影效果很出色。Lumen应用了“动态全局光照”,对光照模型进行了大幅优化,漫反射效果好。还有虚幻引擎的粒子特效系统Nigara,火焰、刀光、能量波、落叶飞舞效果很好。这些技术的具体细节非常复杂,我们感受下效果就好。有兴趣的可以找深入的学习资料,本文主要是介绍技术脉络、整体认知。

500

使用Lumen动态全局光照,阴影区明暗变化丰富,区域中接收了漫反射光

游戏开发中3D建模、图形渲染、光照模型,是非常重要的前沿高科技领域。美国就是依靠计算机图形学、游戏开发等领域的领先,从上世纪90年代起,在电影特效应用上取得了巨大成功,让好莱坞的影响力传遍全球。之前各国都有一些优秀的电影,美国优势没那么大。

目前,3A游戏开发涉及的计算机图形学技术还在快速进步,与高性能GPU开发联动,是有战略意义的技术前沿。因此,中国需要支持高水平、高质量的游戏开发,拉动技术应用与原创技术研发。《黑神话》的爆火,对技术进步来说,也是很好的消息。

三.游戏开发团队

介绍了3D动作游戏开发相关的图形学知识,再介绍下游戏开发人员与团队。

要开发一个3D动作游戏,三类开发者是必需的,写程序的、搞策划的、做美术的。人员可以兼职,但是任务分工就是这样。另外还有音频相关的,游戏也需要测试。有些开发人员,是跨领域的,我们一个个来说。

3D游戏程序开发的任务有客户端程序、引擎程序、图形程序。客户端就是玩家面对的游戏界面,客户端程序员开发实现游戏玩法。引擎程序员,就是处理游戏引擎相关的程序代码的,高水平的能自己开发、修改引擎。图形程序员,就是写Shader、改渲染管线,加速图形渲染的。

客户端程序员又分多种,有网络方向、AI方向、game play方向、动画方向、物理方向等等。相关功能,大型游戏都可能需要。如果有后端服务器,也要开发后端程序。

500

《黑神话》中的游戏文案

游戏策划也分多种,如系统策划,负责炼丹、升级、道具这些系统的设计。关卡策划,要设计地图,给玩家过关设置重重挑战任务。数值策划,对游戏精微的战力、经济等数值体系进行设计,有时是游戏的核心机制。战斗策划,让打斗更加精彩。文案策划,输出文字让故事与角色生动起来。

有一种特殊的策划职位叫“技术策划”,要懂游戏开发技术,会用专业的数学建模与程序知识,参与策划工作,弥补其它策划的专业不足,提升策划质量。

美术对于游戏的成功非常重要,决定了游戏的艺术感档次,《黑神话》的美术风格得到了极高评价。

重要的美术职位有:原画,画出漂亮又艺术的角色、场景、物品,现在有AI帮助出图效率高多了;3D建模,需要用DCC软件对场景、物品、角色建模;动画师,设计过场动画、生产人物骨胳动画资产,如角色的漂亮动作是放动画师画的姿势动画,画30帧放出来90帧,多的是插值生成;地编,要编辑地图,将各类模型放入关卡策划设计的地图里;特效,设计各种精彩炫目的打斗、魔法特效。

还有一种职位叫“技术美术”,了解美术,又懂图形学,会编程写shader。例如会用图形学技术,将网络收集的美术素材做出美术效果。技术美术的美术能力也不弱,可能校招进来就培养职场级的原画能力,能生产商业美术资产,再加上技术能力,综合实力就强了。

音频方面,有负责艺术类音乐的,也有处理打斗、动作音效的。还有“技术音频”,将原始音频素材处理出效果,如空旷场景、密集场景各有不同音效。

另外非常重要的是,游戏要测试,测试工程师负责找出程序bug,最后让程序稳定运行。另外,还有负责“用户体验”的,是非常有水平的人。不是找bug,而是评价程序的用户感受,提出修改建议,提升游戏作品水平档次。

象《黑神话》这样的3A大作,上面的这些职位应该都有。一些人会身兼数职,几个领域都懂。

游戏公司还可以将一些任务分解外包,能有效降低开发成本。据说开发商游戏科学开发《黑神话》有133名正式员工,还有500人的外包团队。

土豪们!现在知道了吧,《黑神话》就是这样开发出来的,是不是不难?怎么样,来投钱开发一个吧?

家长们!不要只顾玩游戏,看看游戏开发有多少技术?来让小孩学学游戏开发基本知识。

少年们!不要只玩手游了,来玩下3A游戏大作,看看游戏是怎么开发出来的。想想自己能做什么,说不定,未来的游戏开发天才,就是你了!

全部专栏