【GAD翻译馆】简述图形学:现代图形技术在电子游戏中的应用

发表于2017-12-20
评论3 4.8k浏览

翻译:赵菁菁(轩语轩缘)审校:李笑达(DDBC4747

简介

嗨,我是baldurk。我已经做了几年的图形程序员,所以虽然我不是一名专家,但我想我对图形工作有一点了解。

我想写这一系列的文章已经有一段时间了,而且我最近重读了一篇有趣的文章,这篇文章详细分析了新的Deus Ex.

我认为图形——尤其以现代游戏的复杂程度——是一个有趣的话题。很少有人会真正深入了解所有错综复杂的东西,但我认为有很多话题可以令所有人都提起兴趣。我想大多数玩过游戏的人都会对游戏效果是如何实现的感到好奇,或者玩家看到一个新的图形游戏,在游戏中,他们被掀翻在地,玩家会想要知道是什么技术把这些东西组合在一起。

即使是制作一个简单的3D游戏,也有很多事情要做,更不用说像看门狗一样的游戏了。

我对于在这个系列中要介绍什么还没有明确的想法,但也可能取决于哪些内容激起了大家的兴趣。但是,我主要的思想是列出现代游戏中发生的事情,不遗漏任何一件——我不会强求大家掌握任何数学或编程知识。如果你知道CPU和显卡的区别,你知道内存和硬盘不一样,那就足够了,我会基于此解释其他的东西。

这些文章会按照看门狗的Chip &Ironicus's Let's Play为我本人提供一个小的结构参考。看门狗一款以图形著称的游戏(好坏仁者见仁智者见智),其中有很多我们可以研究的具体例子。如果有特殊的需求,我可以谈论其他游戏。

我将从游戏之间类似的基本内容开始,但我也会涉及一些看门狗的技巧和视觉效果。

我将会使用一个我在空闲时间里编写的工具,叫RenderDoc,是用于调试图形问题的——帮助你解构图形帧,让我们看看这是怎么做的。

这个动画显示了随着时间的推移建立起来的一部分帧,同时显卡绘制了每个部分。

大多数人已经知道计算机图形(和其他任何视频)都是由一系列静止的帧组成的,每秒钟显示一部分。电影一直是每秒24帧(FPS),电视也差不多,24-30帧每秒。对于游戏,FPS是可变的,因为每个帧都要做很多工作。降到30 FPS以下是不可取的,尽管经常发生这种情况。60 FPS往往是控制台游戏的上限,游戏采用30 FPS还是60 FPS取决于他们的目标。在PC上,如果你有更高的速率显示,你可以选择90, 120 FPS或以上。选择这些特定的数字的原因与垂直同步相关,这一点我们之后会解释。

从我们的角度来看,我们需要彻底搞清楚问题的本质,而不是看FPS有多高,我们看一帧的时间是多么短。如果我们想以30 FPS的速度运行,我们需要在33毫秒内就完成帧所需的一切,60 FPS减半,大约17毫秒。即使对于一台计算机来说,也需要考虑到许多要发生的事情。从理论上讲,保守计算表明子弹每毫秒大约要飞行1米。

我们会主要讨论PC机,因为平台是公开的,我不能谈论细节而不顾及到破坏控制台NDA。在大多数情况下,我不会谈论任何在控制台上不同的东西——如果我这样做的话,我可能会把它喊出来。至于移动平台,PC/控制台硬件和移动硬件之间的大部分差异超出了本系列讨论的范围。

老实说,这张照片只是在这里看起来有光泽,所以这一张图不能说明问题。

这是我们感兴趣的任务——我们不必担心让人工智能做所有的计算,或者做物理模拟来计算物体移动到哪里。你称之为“图形设计”的边界有点模糊,但我要作出区分,图形编程开始于你拥有做一个帧所需的全部信息时:你知道要发生什么事情,你在内存里有纹理和模型(而不是在磁盘上),动画已经“动”了,物理已完成了,我们现在已经得出将最终显示的帧。

边注:我将专注于一个3D游戏,带有相当传统的、像看门狗一样的渲染——许多适用于2D游戏的核心原则,但阐明概念对我来讲有点困难。另附免责声明:特别是对任何其他图形程序员,我的目的是让大家理解,所以我可能会进行一些非常没有把握的解释,大家明白就好不必较真!

所以如果要学习(粗略地说)这是如何完成的,我们需要关心引起你兴趣的东西,那么这些文章可能正适合你!如果你有任何反馈、要求进一步解释,或者如果你认为有什么特别是你想让我看看的,可以通过Twitter或电子邮件联系我。

帧的组成

在这一部分,和大部分情况一样,我们只看一个帧,并讨论游戏用来创建最终帧的构建块。此外,还有几张新的、光鲜的照片。

有一种方法是用较小的构建块建造帧。你看到的最终图像并不是立刻绘制出来的。很多年前是这样做的,但是现代图形引擎几乎都会做一些早期的处理。图形引擎将绘制许多不同类型的中间图像,帮助它计算最终图像,最后再将屏幕上的帧分层。

这些不同引擎绘制出的图像有很大的不同,这取决于图形程序员完成的技术。例如,她想确保阳光投射出适当的阴影——这需要一种阴影的图像。在其他地方,她可能想对运动员驾驶的汽车生成适当的反射,这又会需要另一个反射图像。

在构建我们的看门狗帧时使用的一些中间图像。

在这一系列中,我不一定要涵盖所有在看门狗帧中使用的图像,但我会提及主要的、有借鉴意义的内容。这正是图形研究和新技术不断发展的领域。创新的、崭新的工作在更细粒度的水平上进行,但当你听到营销号谈论一些伟大的新功能时——这些领域通常是他们会谈论的事情。

在这些中间图像中,每一个都是由更小的部分组成的。场景中的每个对象,或者可能是一组相关对象,将分别作为纹理模型进行构建。在构建游戏时,有一些艺术家在3D建模软件包中构建这些模型,并创建所需的全部资源。然后将这些模型放到一个关卡编辑器中,慢慢建立虚拟城市。

这是个常识,尤其是如果你见识过实时3D图形从20年前的幼年期成长起来的话,你就会知道今天的模型有多么复杂。事实上,早期图形的纹理是昂贵的,我们都尽可能地跳过,只填充对象上的简单颜色。只有对于像眼睛或面部这种非常需要细节的对象,才保留纹理。

三维模型完全由构成物体形状的互锁三角形构成。每个三角形有三个点,称为顶点——由于三角形互锁,顶点在几个三角形之间共享。稍后我们会回到这里,因为顶点和三角形非常重要。同样值得一提的是,一些像人物或树这样的对象在绘制之前会被动画化。该模型是在默认的静态形状中创建的,每个帧都应用了动画——我们将再次回到这个场景中。

这是艾登·皮尔斯的头部的三维模型,经过动画的。三角形是可见的,因为它们是平的,而不是像一般的那样进行视觉上的平滑。

为了更详细地介绍3D模型,应用了纹理,纹理只是普通的平面图像文件,通常是正方形的,或者像2:1这样简单尺寸的矩形。纹理通过一个更复杂的过程应用到3D模型中,我可以更详细地讨论纹理,但从概念上,它非常像仔细包装的礼物,而不是一个简单的重复包装纸模式,图像包装是精确的。如果你看过在平面中见过构建、粘合在一起的“纸工艺”(papercraft)模型,这是同样的原理。

这个比喻其实比你想象的更容易,因为这些纹理通常是首先通过把三维模型“解包”成一个平的蓝图,就像“纸工艺”模型压平了一样,然后画上纹理。这种解包通常是自动完成的,但对于特别复杂的物体,可能是手工完成的。

这是对应于上述模型的艾登·皮尔斯的头部纹理。底部部件用于牙齿和舌头。注意上面没有额·头纹理,因为额头总是会被艾登·皮尔斯标志性的帽子™盖住。

边注:解包有时会放大真正需要更多细节的部分,缩小其他不需要的部分。

谈论不同模型的“皮肤”很常见,尤其是在可定制的人物方面。最近一段时间,甚至所谓的皮肤有时也会涉及到一些小的模型变化——皮带变了或者帽子换了——但这个词最初来自于将要使用的完全相同的模型,但纹理(或皮肤)将被改变,以产生一个不同外观的人物。即使是现在,NPC或物体在这些纹理方面可以产生很多的变化,又节省了大量创建独特3D模型的时间和成本。艾登可以穿的不同服装多半只是同一模型上的不同纹理。

下面是只使用纹理的3D模型头部的简单旋转,没有别的东西。

在我们所观察的帧中,主渲染部分绘制了大约1700个对象。其中一些是相同的模型——像盆栽或垃圾箱都不是特别绘制的,但相同的模型或少数模型会被放置在几个区域。但是,绘制完整帧需要大概接近于4700个对象——大家这样就了解了需要做多少额外的工作,不仅仅是绘制所有的模型。

让我们看看另一个对象的例子,艾登戴的帽子。

这是纹理和带有纹理的帽子模型。大家可以看到纹理是在不同的部分上建立的,这些纹理最终都会聚集在模型上。

边注:帽檐和帽子的主体在质地上根本没什么关系。这是因为包装可能相当复杂,如果必要的话,包装可以发生在几个不同的部分。想要不留下任何可见问题或接缝地绘制一个古怪形状的纹理,有时需要大量的技巧。

由艾登的头部引出的想法同样适用于帽子。事实上,除了计算和解包中涉及到的具体纹理和数字外,工作方式完全相同。

为了展示在开发过程中可能出现的错误,也可以用图形编程来展示那种乐趣,我们可以做一个小实验。由于大多数的纹理是一个标准的平方大小,因为我们包装和把纹理解包到模型的方法也是一样的,如果我们改变一点会怎么样?如果我们把艾登的头纹理放到帽子模型上会发生什么?

艾登·皮尔斯的Not So Iconic帽子(商标申请)。

头部的纹理有耳朵和牙齿,这些纹理贴到了他的帽子上。帽子的边缘是帽状结构,头部的纹理只是一些头发。贴图应用相同,但使用了错误的纹理。这个例子当然是一个错误,但是如果你能够使纹理动画化或闪烁——游戏使用这些技巧为对象创建几种不同效果,大家都能看得到的那种效果,想想你能做什么。特别是《黑道圣徒4》使用了大量的“模拟”特效。

仔细想想这一点也很有用——游戏在每一个点上都仔细地将正确的模型和正确的纹理配对,这就意味着大多数独特的模型都会有自己独特的纹理来匹配。

当然,这不是一个绝对的规则——在某些情况下,为了节省一些空间,纹理可能是一个通用的平铺模式,可以在许多对象上使用。或者,一系列相关的对象——比如报纸摊,每张报纸都只用一小部分纹理,所有的报纸封面都共享这一块纹理。

尽管如此,这意味着如果你希望能够绘制许多图像来建立你的最终帧,你必须把所有所需的构建块放在一起,这会添加许多需要的模型和纹理。在下一篇文章中,我们要看看为什么有些像反射之类的东西是很难做到的,游戏中的一些技巧可以帮助节省一些时间和资源。

 

【版权声明】

原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权;

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引