黑神话:悟空开发全解析:3D游戏技术深度揭秘与制作过程
玩家杂谈
20 人阅读
|
0 人回复
|
2025-03-01
|
各位天命人,你们通关《黑神话·悟空》了吗?打游戏能够学到知识呢。我的朋友是风云学会会员陈经,他是一位人工智能研究者,这恰好属于他的研究领域。他撰写了一篇长文,名为《《黑神话》是如何开发的?3D 游戏技术介绍 | 陈经》。如果理解了这篇文章,那么以后看待游戏的眼光就会有所不同。笔者感受到,这样复杂的游戏竟然能够被开发出来。人类的技术发展着实很伟大。
一.3D游戏开发常识
《黑神话》这类动作游戏全部都是 3D 游戏。也就是说存在一个虚拟的游戏世界,这个世界的内部是由三维坐标系统构成的,游戏里的物体都在其中活动。
玩家即时看见的只是游戏世界的一小部分,并且这部分会随着玩家的行走和转身而不停游动变换。这个被称为“摄像机视角”的世界是 3D 的。
为了能在电脑等设备上显示画面,需要把摄像机视角的 3D 图景进行转换;为了能在手机等设备上显示画面,需要把摄像机视角的 3D 图景进行转换;为了能在平板等设备上显示画面,需要把摄像机视角的 3D 图景进行转换;为了能在游戏机等设备上显示画面,需要把摄像机视角的 3D 图景进行转换,即转换成 2D 的画面。
2D屏幕显示、3D摄像机视角、整个虚拟游戏世界。
游戏是动态的。玩家希望看到的画面能够像放电影一样流畅,并且希望画面越真实越好。要达到这样的效果,就需要一个双缓冲区机制。
我们屏幕上所显示的东西,是由显卡来进行处理的。(要知道,GPU 之前就是显卡,之后又增加了计算功能。)将一幅 2D 图像的内容放置到“显存”中,接着通过一个显卡硬件来进行调用,这样就会在屏幕上显示出来,呈现出的画面被称作“一帧”。倘若在更新画面的时候,对这一帧从上面到下面逐行进行扫描更新,那么就会产生上下不匹配的感觉。实际操作时,会准备显存里另一个大小相同的缓冲区,在这个缓冲区中计算要写入“下一帧”的图像数据。当全部准备好后,就把屏幕图像硬件调用的指针指向这里,然后一次性全部更新到屏幕上。原本的那一帧,就变成了计算再下一幅帧的图像缓冲区。如此这般来回进行切换,屏幕画面就如同放电影般不断推进了。
实践中,人眼感觉较为流畅时,一秒钟显示切换的“帧率”为 30 帧。帧率若低于 30 帧,就会有卡顿感。30 帧的帧率继续提升,人眼会感觉画面更流畅。普通人到 60 帧就会达到满意程度,无需更高。有些游戏发烧友会追求 120 帧,其实区别不大。再往上,只有对画面极为敏感的职业电竞选手才会有追求。
因此,游戏显示的帧率通常在 30 帧到 60 帧之间,将 60 帧作为优化目标,把 30 帧当作优化底线。偶尔出现低于 30 帧的情况还可以忍受,要是经常出现就存在问题了。此外,一秒内帧率出现波动也不好,这种情况被称为“掉帧”,比如在 300 毫秒内只有 3 帧,而在余下的 700 毫秒内有 27 帧。有时 Switch 等游戏硬件上的 30 帧感觉比电脑上的 60 帧流畅。这是因为其帧率较为稳定,掉帧的情况比较少。
以上是最为基础的知识。游戏画面的来源是怎样的呢?然而,对于游戏世界是如何构建的,还需要更多的知识来进行介绍。
虚拟的游戏世界是通过“数据结构”进行存储的。开发者总结出了以下几类具有特性的数据结构:天空盒,它有其独特之处;地形,有着自身的特点;植被,具备特定的性质;水体,有其独特的表现;粒子特效,有自己的特色;场景物品,有其特定的模样;角色,有其独有的属性;布料,有自身的特点;光源,有其独特的存在。游戏世界正是由这些东西构成的,每一类都有自己的特色,相关的数据结构和处理算法都需要专门进行设计。
天空盒(或天空球),意思是用一个很大的方形盒子或者球形将整个 3D 世界笼罩起来,并且在盒子上贴上天空图片。有些天空算法能够使天空图片动态变化,从而达到更自然的效果。这个盒子很大且很高,当玩家在地面移动时,会觉得天空是稳定的。不过要留意,实际上并没有一个真正很大的盒子数据结构,后面在说渲染的时候会进行解释。
地形如同地图,并且记录了地表的高低起伏情况,它是游戏世界最为基础的数据。植被是地表的草以及树等覆盖物,其数量极为庞大,一直在不断重复,然而又要将变化体现出来。水体具备特殊的运动规律,具有透明、反射、波动等属性。粒子特效能够实现烟雾、火焰、扬沙、扬尘以及攻击波等效果。场景物品对游戏世界的活动空间进行了定义,其中包含建筑、石头、土壤、道具等各种刚性物体。这些物体有的可以远观,有的则能够进入。对于它们,需要有更详细的三维建模。实际上,植被也可以被当作物品来理解。然而,由于植被的数量极为众多,需要不同的高效处理算法,所以专门将其定义为一个类别。
玩家主要关注的焦点是角色。角色的属性最为复杂,所以需要更详细的定义。在 3D 动作游戏中,有不少角色拥有漂亮的专属动作。定义角色的一个重要手段是骨胳关节系统。关节能够扭动,这样角色就能变成各种各样的形态。
角色拥有衣服,还拥有饰品以及面具等物品,并且有时会有好几层衣服。这些物品都需要专门的数据结构去进行处理,而布料可以用来表示衣服。
一类特殊的东西是光源。其中有火炬、蜡烛等这类光源。有时还会有一个外来光源,像是太阳那样的平行光。因为光会出现反射、折射、吸收、增强等情况,所以光线的处理极为复杂,它是图形显示算力需求最大的算法。实际上,所有物体的颜色、亮度值都是以光源为依据的。
好,现学现用一下,大家看看这幅图中,有哪些数据结构?
每一种数据结构的处理都有着极为深入的计算机图形学研究背景。凭借这些图形学算法,3D 游戏开发才具备了基础。在上世纪九十年代,3D 游戏就已经展现出了不错的效果。随着软硬件的不断进步,到如今游戏的效果提升得非常大,有时逼真到令人害怕。只要了解游戏开发的基础知识,就能够明白游戏对于科技进步所起到的拉动作用。
3D 游戏开发所涉及的数据种类繁多,所涉及的算法也很多。一般的开发者没有能力自行从头开始实现这些,就连中小公司也难以做到。幸好有游戏开发引擎,像 Unity 和 Unreal 这样的。游戏开发引擎把相关的数据结构和算法进行了打包,直接为游戏开发者提供了框架供其使用。开发者依据引擎的使用规范,对游戏世界的数据进行定义,设定游戏的规则,这样就能够编写游戏了。Unreal 如同编程里常用的 Visual Studio 那样,是一个集成开发环境。Unity 也如同编程里常用的 Visual Studio 那样,是一个集成开发环境。
Unity 是最为常用的游戏开发引擎,其开发的游戏类型丰富且数量最多。除了游戏领域之外,它还能应用于美术、建筑、汽车设计、影视等诸多领域,这些领域都涉及 3D 模型和 3D 世界的 2D 显示。该引擎的开发公司是 Unity Software,其在中国的子公司是 Unity 中国。Unity 的中文版被称作“团结引擎”,具有自身的特性,与英文版存在差异。Unity 每年会有大版本的更新,像 2019 年有 2019 版,2020 年有 2020 版,一直到 2024 年有 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 就更优秀。或许开发者觉得,对于某些游戏而言,通过 gameplay 来定义规则的方式并非高效。
个人开发者以及中小公司通常会选用 Unity 引擎或者 Unreal 引擎来开发游戏。大公司也会使用这两种引擎,不过大公司除了使用这些商业引擎之外,还会拥有自己研发的引擎,以此来展现公司的技术实力。
此外有 DCC 软件,也就是 Digital Content Creation,用于数字内容生成。还有建模软件,像 Blender、3DMAX、Maya,这些软件可用来生成行业中最通用的 FBX 模型文件。
以上是游戏开发概念性的常识,没有涉及具体的数据结构与算法。
二.游戏开发基础算法概念
对游戏世界的物体,基础的表示办法是三角形网格(Mesh)。
用三角形网格来模拟物体表面,这样就能定义一个物体的三维形状。顶点的密度越大,所形成的三角形网格就越多,物体表面也就能够被模拟得越好。三角形网格表示的基础在于,任意多边形都能够被切成多个三角形。除了三角形网格之外,还有其他的网格类型,像四角形网格(其中会添加一些三角形网格),然而最常用的还是三角形网格,《黑神话》很可能也是使用三角形网格来进行相关操作的。
一个三角形网格,需要存储顶点的 3D 坐标以及三条边。顶点的顺序能够区分出正面与反面。同时,还具备一些其他性质,像法向量以及材质属性。
玩家看游戏画面时,通常意识不到三角形网格的存在。因为最能吸引注意的是物体表面(也就是三角形内部)的“内容”,而非顶点。需要用各种色彩去填充表面,不能只是光光的三角形。这就是三角形内部的“纹理”(Texture),实际上就是将一张图片贴到三角形上面。显示时不仅要贴图片,还要结合光源来计算出里面的色彩。
有了三角形网格表示以及纹理表面贴图,一个物体就显得较为逼真了。在游戏中存在近景和远景之分,对于同一个物体能够设计出精度各异的模型,近景采用高精度,远景采用低精度,划分出几个不同的级别。然而,这些都是静态的情况,游戏里很多物体的形状和角度是会发生变化的。
物体的变动以及对撞反应,需要一个“物理引擎”。游戏世界的物理与真实世界有所不同,存在夸张和简化的情况,也有尽量模拟真实世界且做得很细致的,但这是很困难的,虽然主打真实,但效果不一定好。只要游戏世界的效果好,完全可以进行变通处理。一些物理效果显然不符合牛顿定律,在评论区经常能看到有人说:我们这儿不归牛顿管!但没关系,人们很容易接纳游戏世界的物理规则,并且游戏世界的物理规则比真实世界更具趣味性和好玩性。
对于计算机编程而言,这带来了极大的便利。在《黑神话》中,悟空的棍风扫到了若干株小草。倘若处于真实物理情境,棍子一扫是不可能产生如此大的棍风的。而在物理引擎里,能够进行简便的处理,即给小草添加一个具有方向的扰动,依据扰动力的大小,计算出各个顶点的偏移量,从而模拟出夸张的效果。
物理引擎在游戏引擎中属于不算难的部分,游戏开发引擎会配备。英伟达提供了物理引擎,这体现了它的特点,会提前去寻找各种需求,并早早地将其纳入开发包中。Unity很早就将英伟达的 PhysX 物理引擎内置在其中。
PhysX 具备刚体碰撞、粒子系统以及布料模拟等功能。其中,粒子系统能够模拟烟雾、水流和火焰等现象。布料模拟则主要用于处理衣服、旗帜等的动态效果,其效果较为接近真实情况。可以这样理解,英伟达的 PhysX 算法的目标是尽可能地逼近真实,它并非专门为游戏开发而设计,但应用于游戏中也还可以。
虚幻 5 的默认物理引擎是 EPIC 自研的 Chaos,之前曾使用 PhysX。对于某些游戏项目而言,Chaos 更为合适,因为它的目标并非追求真实,而是注重游戏效果。
游戏世界在物理引擎的作用下,接受玩家的输入后,就能够不断地演化。从玩家的视角出发,把 3D 游戏世界呈现在 2D 界面上,这是游戏开发的核心任务,主要是处理显示方面的问题。
相关专业名词有“渲染”“渲染管线”以及“着色器”。要理解这三个名词,需先介绍 3D 动作游戏运行所依赖的硬件特性,即 CPU 与 GPU,其中 GPU 在其中起到了主要的计算作用。
象《黑神话》这样注重视觉效果的动作游戏,是必须要有 GPU 的,并且 GPU 的档次还不能低。从理论上来说,仅仅依靠 CPU 的话,是能够将这些物理引擎、3D 世界转化为 2D 显示的算法并运行起来的。在九十年代初的时候,就已经有了《侏罗纪公园》、《终结者 2》等特效电影,而那个时候 GPU 还没有出现。但是这些特效都是经过很长时间才制作出来的,播放 1 分钟的特效,可能需要花费 1 周的时间。而3D动作游戏,需要实时计算,就需要非常强大的GPU。
很多人对 CPU 的串行编程逻辑是熟悉的。然而,了解 GPU 编程的人则少得多。GPU 拥有成千上万个计算核心,能够并行加速计算过程。不过,这里存在着非常多的细节。这些核心并非完全相同,而是被分成了几类,每一类都有擅长的任务。并且,GPU 的内部架构也不是简单的。
着色器 Shader 能够被理解为在 GPU 上运行的并行加速程序。存在着许多种类的 Shader,这些 Shader 可以完成顶点位置以及像素颜色计算等任务。如果为 Shader 准备好输入数据,那么它就会将计算后的数据写入显存和内存中。
游戏开发引擎会提供各式各样的 Shader,开发者还能够自己去编写 Shader,从而进行特殊的处理。然而,仅仅拥有 Shader 的话,就如同程序仅仅具备一些子函数一样,是无法完成整个任务的。
这时需要“渲染管线”,要安排好一连串的处理动作。它是把 3D 游戏世界的数据转化为 2D 屏幕上一幅画面的过程。可以将渲染管线理解为 CPU 与 GPU 的编程,是一个软硬件结合的过程,每一步会调用 CPU 或者 GPU,其中有多个不同的 Shader 来完成主要的计算,CPU 负责处理逻辑和准备数据。
游戏开发引擎提供了可被程序员修改的渲染管线代码。它能计算出处于“摄像机视角”内的物体,并将视角之外的物体剪裁掉,同时处理好物体的边缘。它还需要对场景中的物体遮挡情况进行判断。对于每一个物体,都要计算其 2D 显示的颜色值。
一种特殊的算法是天空渲染。这种算法其实就是 6 张“参考图片”,这些图片被用作天空采样的纹理,分别对应立方体的 6 个面。在进行天空渲染时,会根据当前的位置和方向来计算出天空的颜色值。从这个意义上来说,“天空盒”实际上并不存在,它并没有被包含在场景文件里。
一个游戏的渲染管线编写完毕,那么关于图形显示的部分就完成了。然而,倘若更换了 GPU,或许就需要更换一种渲染管线。要是 GPU 的性能不够强,一些高开销的 Shader 就无法运行,这时就需要换成低开销的 Shader,这样帧率和画质就会降低。《黑神话》首次启动时,会进行“着色器编译”这一操作。此操作是依据机器的 CPU 与 GPU 组合,来编译出适宜的二进制代码。而在这之后再次启动,就无需进行该操作了。
《黑神话》对 GPU 的性能有要求,原因在于此。倘若 GPU 连游戏最低要求的 Shader 都无法运行,那么游戏就无法启动。并且 Shader 不可能由 CPU 来替代运行,因为其速度太慢,难以被接受。
要注意渲染管线只负责显示相关的计算。像游戏的 game play 玩法以及物理引擎,这些属于另外的管线,并且也有可能调用 GPU。Rendering 指的是计算渲染一帧画面并且向显存写入画面数据这个行为。渲染是一种动作,而渲染管线是一个过程。
介绍到此,3D 游戏开发的主要脉络已清晰。然而,还缺一个极为重要且最为复杂的部分,那就是光照模型。场景的模样由一个或多个光源的光照效应所决定,其计算极为复杂,并且与物品的材质相关。物品的材质实际上就是物品与光线相互作用的性质,物体呈现为草、树还是水,是由吸收、反射、透明等这些光照属性所决定的。
物体的颜色并非其本身所固有的属性,而是由较为复杂的物理学理论所决定的。此物理学理论涉及漫反射、镜面反射、微表面理论等概念。在游戏开发中,这种理论被称作 Physical Based Rendering,它主要用于处理光线与物品之间的交互。同时,光照模型也是渲染过程中的一个重要概念。
一个简单的光照模型是这样的:只考虑直射光,即假定场景中的每个点都能独立地受到各个光源直接照射的影响。光源可以被抽象为点光源,而平行光相当于无限远且无衰减的点光源。要计算场景中一个点的亮度,就假定是所有点光源打在这个点上所产生的复合效应。这个计算方法较为简单,并且可以通过 GPU 进行加速。它能够提供一个基本的光照效果,实际上大多数游戏都是采用这种方式来实现光照的,但这样做出来的效果会显得不够真实。因为光线在物体上会发生反射和折射,这就相当于又出现了新的光源,而简单光照模型并没有考虑到这种效应。
考虑光线的反射、折射效应,即为全局光照模型。理论方面极为复杂,包含直接光照、间接光照,且需进行积分。存在一些传统算法用于处理,然而如今硬件性能提升,便能够实时运用光线追踪算法,即 Ray Tracing,简称光追。
光线追踪算法会从视点(眼睛)射出数以亿计的光线。它会模拟光线与物体的相交、反射以及折射等情况。并且会反复进行迭代,一直到遇上光源,或者光线跑出去了,又或者迭代次数达到了足够多。在图中,蓝线就是从视点发出的追踪光线,这些光线会根据折射、反射等效应产生次生光线。虚线表示光源对每个关键点的作用,光源的主要可能作用路径都被考虑在内了,最终能够计算出复合效应。可能的作用路径非常多,但如果转折太多次,光强就可以忽略了。
要注意,光线追踪算法的光线是逆向从眼睛发出以寻找光源,并非从光源发出,这一点与直觉相悖。原因在于最终是玩家用眼睛去观看画面,只有眼睛能看到的光才具有意义,从眼睛发出光线进行逆向推导更为有效。而光源发出的光线,只有在机缘巧合的情况下才能到达眼睛,并不适合用于光线追踪。
这是一种蒙特卡洛抽样模拟算法,视点放出的光线数量越多,模拟效果就越好。光线追踪算法的效果最为出色,它能够模拟出非常好的阴影和反射效果,像水面反光、火焰倒影等场景都很绚丽。GPU 经常使用光追来展示其性能,英伟达的 RTX 系列 GPU,在 1 秒钟内可以发出上百亿根光线。
《黑神话》等游戏界面存在选项,可选择画质以及是否开启光线追踪等。在某些场景中,开启光线追踪会呈现出明显的效果。就像这两张图进行对比那样,开启光线追踪后的水体折射倒影效果十分惊人。
《黑神话》的画面展示广受好评,这其中有虚幻 5 引擎中 Nanite 技术的功劳,也有 Lumen 技术的功劳。
《黑神话》画面有一个特性,近景、中景、远景看着都很自然。前面提到,一个物体的模型有高精度和低精度之分,用于近景和远景显示且分几级。但有时会出现不太自然的感觉,精度会有跳变。Nanite 技术能够加载超高精度的模型(多达十亿个三角面),使几何体更真实细腻,这就需要高效的几何压缩和内存管理。根据程序需求,要实时计算出合适的模型和场景进行显示,而不是存储几级低精度模型。这就需要进行良好的优化,模型渲染的面数是动态决定的,对于看不见的以及远处的部分,可以节省算力,这就使得模型本身处于动态变化之中。总体效果表现为场景画质很高,变化自然且实时流畅,达到了影视级的高质量画面。
虚幻 5 的一个重要技术是 Lumen 技术,它与光照相关,使得《黑神话》的光影效果十分出色。Lumen 运用了“动态全局光照”,对光照模型进行了很大程度的优化,其漫反射效果良好。另外,虚幻引擎的粒子特效系统 Nigara 也很出色,像火焰、刀光、能量波、落叶飞舞等效果都很棒。这些技术的具体细节较为复杂,我们只需感受其效果即可。
游戏开发中的 3D 建模是重要的领域,图形渲染也是重要的领域,光照模型同样是重要的领域,这些都是前沿高科技领域。美国凭借计算机图形学以及游戏开发等领域的领先地位,从九十年代开始,在电影特效应用方面取得了巨大的成功,使得好莱坞的影响力得以传遍全球。之前各国都有一些较为优秀的电影,而那时美国的优势没有那么明显。
目前计算机图形学技术在 3A 游戏开发中仍在迅速发展,它与高性能 GPU 开发相互联动,属于具有战略意义的技术前沿领域。所以中国需要对高水平、高质量的游戏开发予以支持,以推动技术应用和原创技术的研发。《黑神话》的火爆,对于技术进步而言,是一个非常好的消息。
三.游戏开发团队
先介绍完了 3D 动作游戏开发相关的图形学知识,接着再来介绍游戏开发人员与团队。
开发一个 3D 动作游戏,需要以下三类开发者:一类是负责编写程序的;一类是进行策划工作的;一类是从事美术创作的。人员可以兼任不同的角色,但任务分工主要就是这三类。除此之外,还有与音频相关的工作以及游戏测试工作。有些开发人员具备跨领域的能力,我们逐一进行阐述。
图形程序员主要进行写 Shader 和修改渲染管线的工作,以实现加速图形渲染。
客户端程序员分为多种类型,其中有网络方向的,有 AI 方向的,有 game play 方向的,有动画方向的,有物理方向的等等。这些相关功能,大型游戏都有可能需要。倘若存在后端服务器,那么就需要开发后端程序。
游戏策划有多种类型。其中,系统策划负责设计炼丹、升级以及道具等系统。关卡策划需设计地图,为玩家设置重重过关挑战任务。数值策划对游戏精微的战力、经济等数值体系进行设计,有时它是游戏的核心机制。战斗策划能让打斗更加精彩。文案策划负责输出文字,使故事与角色生动起来。
有一种特殊的策划职位名为“技术策划”。这种职位需要懂得游戏开发技术,能够运用专业的数学建模以及程序知识,参与到策划工作当中,以此来弥补其他策划在专业方面的不足,进而提升策划的质量。
美术对于游戏的成功有着极为重要的作用,它决定了游戏的艺术感档次。《黑神话》的美术风格,获得了极高的评价。- 特效:负责设计各种精彩炫目的打斗、魔法特效。
有一种职位叫“技术美术”。它既了解美术,又懂得图形学,还会编程写 shader。比如能够运用图形学技术,把从网络收集来的美术素材制作出美术效果。技术美术的美术能力并不弱,或许在校招时进来就能培养出职场级的原画能力,能够生产商业美术资产,再加上其技术能力,综合实力就变得很强了。
音频方面,有专门负责艺术类音乐的,也有负责处理打斗、动作音效的。另外还有“技术音频”,它能够把原始音频素材处理出各种效果,像空旷场景和密集场景就会有不同的音效。
另外,很重要的一点是需要对游戏进行测试,测试工程师的职责是找出程序中的 bug,从而让程序能够稳定运行。同时,还有负责“用户体验”的人员,他们不是去寻找 bug,而是对程序的用户感受进行评价,提出修改建议,以提升游戏作品的水平和档次。
《黑神话》这样的 3A 大作,上述这些职位是应该都具备的。有一些人会承担多种职务,对几个领域都有所了解。
游戏公司能够将部分任务进行分解并外包出去,这样做可以有效地降低开发成本。据悉,《黑神话》的开发商游戏科学拥有 133 名正式员工,同时还有一个由 500 人组成的外包团队。
土豪们!《黑神话》是通过这样的方式开发出来的,这并不难吧?那么,你们要不要来投资开发一个呢? |
|
|
|
|
|