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

各位天命人,《黑神话·悟空》通关了吗?打游戏也可以学知识,我的朋友、风云学会会员陈经是一位人工智能研究者,这刚好是他的研究领域。他写了一篇长文《《黑神话》是如何开发的?3D游戏技术介绍 | 陈经》,下面我来向大家介绍一下。理解了本文,以后看游戏的眼光,就不一样了。

一.3D游戏开发常识

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

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

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

500

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

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

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

实践中,一秒钟显示切换30帧的“帧率”,人眼就感觉较为流畅了。帧率比30低,就会有卡顿感。30的帧率继续提升,人眼会感觉画面更为流畅普通人到60帧达到满意的程度,不需要更高了。有些游戏发烧友会追求120帧,其实区别没多大。再往上,只有对画面极为敏感的职业电竞选手有追求了。

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

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

虚拟的游戏世界,是用“数据结构”来存储的。开发者总结出了几类有特性的数据结构:天空盒、地形、植被、水体、粒子特效、场景物品、角色、布料、光源。游戏世界就是由这些东西构成的,每一类都有自己的特色,相关的数据结构和处理算法都需要专门设计。

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

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

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

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

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

好,现学现用一下,大家看看这幅图中,有哪些数据结构?

500

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

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

3D游戏开发涉及的数据种类、算法,实在是太多了。一般开发者没有能力自己去从头实现,中小公司都不行。还好有游戏开发引擎,如Unity和Unreal。游戏开发引擎将相关数据结构和算法打包好,直接提供框架给游戏开发者使用。开发者按照引擎使用规范,定义好游戏世界的数据,设定游戏规则,就可以把游戏编写出来了。Unreal和Unity就像编程中常用的Visual Studio一样,是一个集成开发环境。

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

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

Unreal相比Unity,率先实现了一些先进图形算法。其中有些在《黑神话》中有应用,如Nanite、Lumen,后文介绍。不过Unity以后也会实现这些算法。Unreal还有一套定义游戏规则、角色动作的代码框架,叫做game play,而Unity没有。但这并不是说Unreal就更好,也许开发者认为game play定义规则的办法对某些游戏并不高效。

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

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

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

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

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

500

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

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

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

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

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

对计算机编程来说,这提供了很大的方便。例如《黑神话》里,悟空的棍风扫到了几株小草。如果是真实物理,棍子一扫不可能有太大棍风。在物理引擎里,就可以简单处理,对小草加一个有方向的扰动,根据扰动力度,计算各顶点偏移量,模拟出夸张效果。

500

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

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

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

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

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

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

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

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

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

这时就需要“渲染管线”,安排好一连串处理动作,它是将3D游戏世界的数据转化成2D屏幕上一幅画面的过程。可以把渲染管线理解为CPU + GPU编程,是一个软硬件过程,每一步调用CPU或者GPU,其中会有多个不同的Shader完成主要的计算,CPU处理逻辑、准备数据。

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

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

500

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

《黑神话》对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建模、图形渲染、光照模型,是非常重要的前沿高科技领域。美国就是依靠计算机图形学、游戏开发等领域的领先,从九十年代起,在电影特效应用上取得了巨大成功,让好莱坞的影响力传遍全球。之前各国都有一些优秀的电影,美国优势没那么大。

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

三.游戏开发团队

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

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

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

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

500

《黑神话》中的游戏文案

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

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

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

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

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

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

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

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

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

家长们!看看游戏开发有多少技术?来让小朋友学学游戏开发基本知识?

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

全部专栏