没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
游戏引擎剖析
----Jake Simpson
第 1 部分: 游戏引擎介绍, 渲染和构造 3D 世界
介绍
自 Doom 游戏时代以来我们已经走了很远。 DOOM 不只是一款伟大的游戏,它同时也开创
了一种新的游戏编程模式: 游戏 "引擎"。 这种模块化,可伸缩和扩展的设计观念可以让游
戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有
的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数都
以 ID 公司的 Quake 引擎为基础, 这些游戏包括 Counter Strike, Team Fortress, Tac
Ops, Strike Force, 以及 Quake Soccer。Tac Ops 和 Strike Force 都使用了 Unreal
Tournament 引擎。事实上, "游戏引擎" 已经成为游戏玩家之间交流的标准用语,但是究竟
引擎止于何处,而游戏又从哪里开始呢?像素的渲染,声音的播放,怪物的思考以及游戏事
件的触发,游戏中所有这一切的幕后又是什么呢? 如果你曾经思考过这些问题, 而且想要
知道更多驱动游戏进行的东西,那么这篇文章正好可以告诉你这些。 本文分多个部分深入
剖析了游戏引擎的内核, 特别是 Quake 引擎,因为我最近工作的公司 Raven Software 已经
在 Quake 引擎的基础上开发出了多款游戏,其中包括著名的 Soldier of Fortune 。
开始
让我们首先来看看一个游戏引擎和游戏本身之间的主要区别。 许多人们会混淆游戏引
擎和整个游戏 。这有点像把一个汽车发动机和整个汽车混淆起来一样 。 你能够从汽车里面
取出发动机, 建造另外一个外壳,再使用发动机一次。 游戏也像那。 游戏引擎被定义为所
有的非游戏特有的技术。 游戏部份是被称为 '资产' 的所有内容 (模型,动画,声音,人工
智能和物理学)和为了使游戏运行或者控制如何运行而特别需要的程序代码, 比如说 AI--
人工智能。
对于曾经看过 Quake 游戏结构的人来说, 游戏引擎就是 Quake。exe ,而游戏部分则
是 QAGame。dll 和 CGame。dll 。 如果你不知道这是什么意思, 也没有什么关系;在有人向
我解释它以前, 我也不知道是什么意思。 但是你将会完全明白它的意思。 这篇游戏引擎指
导分为十一个部份。 是的, 从数量上来说,总共是十一个部份! 每个部分大概 3000 字左右。
现在就从第一部分开始我们的探索吧,深入我们所玩游戏的内核,在这里我们将了解一些基
本的东西, 为后面的章节作铺垫。。。
渲染器
让我们从渲染器来开始游戏引擎设计的探讨吧, 我们将从游戏开发者(本文作者的背景)
的角度来探讨这些问题。事实上,在本文的各个段落,我们将常常从游戏开发者的角度探讨,
也让您像我们一样思考问题!
什么是渲染器,为什么它又这么重要呢?好吧,如果没有它,你将什么也看不到。它让
游戏场景可视化,让玩家/观众可以看见场景,从而让玩家能够根据屏幕上所看到的东西作
出适当的决断。 尽管我们下面的探讨可能让新手感到有些恐惧,先别去理会它。 渲染器做
些什么?为什么它是必须的?我们将会解释这些重要问题。
当构造一个游戏引擎的时候, 你通常想做的第一件事情就是建造渲染器。 因为如果看
不见任何东西 – 那么你又如何知道你的程序代码在工作呢? 超过 50% 的 CPU 处理时间花
费在渲染器上面; 通常也是在这个部分,游戏开发者将会受到最苛刻的评判。 如果我们在
这个部分表现很差,事情将会变得非常糟糕, 我们的程序技术,我们的游戏和我们的公司
将在 10 天之内变成业界的笑话。 它也是我们最依赖于外部厂商和力量的地方,在这里他们
将处理最大限度的潜在操作目标。 如此说来, 建造一个渲染器确实不象听起来那么吸引人
(事实如此), 但如果没有一个好的渲染器, 游戏或许永远不会跻身于排行榜前 10 名。
如今,在屏幕上生成像素,涉及到 3D 加速卡, API ,三维空间数学, 对 3D 硬件如
何工作的理解等等。对於主机(游戏机)游戏来说,也需要相同类型的知识,但是至少对于
主机, 你不必去尝试击中一个移动中的目标。 因为一台主机的硬件配置是固定的 "时间快
照", 和 PC(个人计算机)不同, 在一台主机的生命期中,它的硬件配置不会改变。
在一般意义上,渲染器的工作就是要创造出游戏的视觉闪光点,实际上达到这个目标需
要大量的技巧。3D 图形本质上是用最少的努力创造出最大效果的一门艺术, 因为额外的 3D
处理在处理器时间和和內存带宽方面都是极为昂贵的。 它也是一种预算, 要弄清楚你想在
什么地方花费处理器时间,而你宁愿在什么地方节省一些从而达到最好的整体效果。 接下
来我们将会介绍一些这方面的工具,以及怎样更好的用它们让游戏引擎工作。
建造 3D 世界
最近,当我和一位从事计算机图形方面工作长达数年之久的人会谈时,她向我吐露道,
当她第一次看到实时操纵计算机 3D 图象时, 她不知道这是怎么实现的, 也不知道计算机
如何能够存储 3D 图象。 今天这对于在大街上的普通人来说或许是真实的,即使他们时常玩
PC 游戏, 游戏机游戏, 或街机游戏。
下面我们将从游戏设计者的角度讨论创造 3D 世界的一些细节,你也应该看一看 Dave
Salvator 所写的“3D 管线导论“,以便对 3D 图象生成的主要过程有一个整体的了解。
3D 物体(对象)被储存成 3D 世界中的一系列点(被称为顶点), 彼此之间有相互关系,
所以计算机知道如何在世界中的这些点之间画线或者是填充表面。 一个立方体由 8 个点组
成,每个角一个点。立方体有 6 个表面, 分别代表它的每一个面。 这就是 3D 对象储存的
基础。 对于一些比较复杂的 3D 物体, 比如说一个 Quake 的关卡,将有数以千计(有时数
以十万计)的顶点, 和数以千计的多边形表面。
参见上图的线框表示(注:原文在这里有一幅图)。 本质上与上面的立方体例子类似,
它仅仅是由许许多多的小多边形组成的一些复杂场景。模型和世界如何储存是渲染器的一部
份功能, 而不属于应用程序/游戏部份。 游戏逻辑不需要知道对象在內存中如何表示, 也
不需要知道渲染器将怎样把他们显示出来。 游戏只是需要知道渲染器将使用正确的视野去
表示对象, 并将在正确的动画幀中把正确的模型显示出来。
在一个好的引擎中,渲染器应该是可以完全被一个新的渲染器替换掉, 并且不需要去
改动游戏的一行代码。许多跨平台引擎, 而且许多自行开发的游戏机引擎就是这样的,如
Unreal 引擎, --举例来说, 这个游戏 GameCube 版本的渲染器就可以被你任意的替换掉。
让我们再看看内部的表示方法—除了使用坐标系统,还有其他方法可以在计算机內存里
表示空间的点。在数学上,你可以使用一个方程式来描述直线或曲线, 并得到多边形, 而
几乎所有的 3D 显示卡都使用多边形来作为它们的最终渲染图元。 一个图元就是你在任何显
示卡上面所能使用的最低级的绘制(渲染)单位,几乎所有的硬件都是使用三个顶点的多边
形(三角形)。 新一代的 nVidia 和 ATI 显卡可以允许你以数学方式渲染(被称为高次表面),
但因为这不是所有图形卡的标准, 你还不能靠它作为渲染策略。
从计算的角度来看,这通常有些昂贵,但它时常是新的实验技术的基础,例如,地表的
渲染,或者对物件锐利的边缘进行柔化。 我们将会在下面的曲面片小节中更进一步介绍这
些高次表面。
剔除概观
问题来了。 我现在有一个由几十万个顶点/多边形描述的世界。 我以第一人称视角位于
我们这个 3D 世界的一边。 在视野中可以看见世界的一些多边形, 而另外一些则不可见,
因为一些物体, 比如一面看得见的墙壁, 遮挡住了它们。 即使是最好的游戏编码人员, 在
目前的 3D 显卡上, 在一个视野中也不能处理 300,000 个三角形且仍然维持 60fps (一个主
要目标)。 显卡不能处理它, 因此我们必须写一些代码,在把它们交给显卡处理之前除去那
些看不见的多边形。 这个过程被称为剔除。
有许多不同的剔除方法。 在深入了解这些之前,让我们探讨一下为什么图形显示卡不
能处理超高数量的多边形。 我是说,最新的图形卡每秒钟不能处理几百万个多边形吗?它
不应该能够处理吗? 首先,你必须理解市场销售宣称的多边形生成率和真实世界的多边形生
成率。 行销上宣称的多边形生成率是图形显示卡理论上能够达到的多边形生成率。
如果全部多边形都在屏幕上, 相同的纹理,相同的尺寸大小, 正在往显示卡上传送多
边形的应用程序除了传送多边形以外什么也不做, 这时显卡能处理多少多边形数量, 就是
图形芯片厂商呈现给你的数字。
然而,在真实的游戏情形中,应用程序时常在后台做着许多其他的事情 -- 多边形的 3D
变换, 光照计算, 拷贝较多的纹理到显卡內存, 等等。 不仅纹理要送到显示卡, 而且还
有每个多边形的细节。一些比较新的显卡允许你实际上在显卡內存本身里面储存模型/世界
几何细节, 但这可能是昂贵的,将会耗光纹理正常可以使用的空间,所以你最好能确定每
一幀都在使用这些模型的顶点, 否则你只是在浪费显示卡上的存储空间。 我们就说到这里
了。 重要的是,在实际使用显卡时,并不必然就能达到你在显卡包装盒上所看到的那些指
标,如果你有一个比较慢速的 CPU , 或没有足够的內存时,这种差异就尤为真实。
基本的剔除方法
最简单的剔除方式就是把世界分成区域, 每个区域有一个其他可见区域的列表。 那样,
你只需要显示针对任何给定点的可见部分。 如何生成可见视野区域的列表是技巧所在。 再
者, 有许多方法可以用来生成可见区域列表, 如 BSP 树, 窥孔等等。
可以肯定,当谈论 DOOM 或 QUAKE 时,你已经听到过使用 BSP 这个术语了。 它表示二叉
空间分割。
BSP 是一种将世界分成小区域的的方法,通过组织世界的多边形,容易确定哪些区域是
可见的而哪些是不可见的 – 从而方便了那些不想做太多绘制工作的基于软件的渲染器。它
同时也以一种非常有效的方式让你知道你位于世界中的什么地方。
在基于窥孔的引擎 ( 最早由 3D Realms 已经取消的 Prey 项目引入游戏世界 )里,每
个区域 ( 或房间) 都建造有自己的模型, 通过每个区域的门 ( 或窥孔 )能够看见另外的区段。
渲染器把每个区域作为独立的场景单独绘制。 这就是它的大致原理。 足以说这是任何一个
渲染器的必需部份,而且非常重要。
尽管一些这样的技术归类在 "遮挡剔除"之下,但是他们全部都有同样的目的: 尽早消除
不必要的工作。 对於一个 FPS 游戏(第一人称射击游戏) 来说,视野中时常有许多三角形,
而且游戏玩家承担视野的控制,丢弃或者剔除不可见的三角形就是绝对必要的了。 对空间
模拟来说也是这样的, 你可以看见很远很远的地方 – 剔除超过视觉范围外面的东西就非常
重要。 对于视野受到限制的游戏来说 – 比如 RTS (即时战略类游戏)--通常比较容易实现。
通常渲染器的这个部份还是由软件来完成, 而不是由显卡完成, 由显卡来做这部分工作只
是一个时间问题。
基本的图形管线流程
一个简单的例子,从游戏到多边形绘制的图形管线过程大致是这样:
· 游戏决定在游戏中有哪些对象, 它们的模型, 使用的纹理, 他们可能在什么
动画幀,以及它们在游戏世界里的位置。 游戏也决定照相机的位置和方向。
· 游戏把这些信息传递给渲染器。以模型为例 ,渲染器首先要查看模型的大小 ,
照相机的位置, 然後决定模型在屏幕上是否全部可见, 或者在观察者 (照相机视野) 的左
边,在观察者的后面,或距离很远而不可见。它甚至会使用一些世界测定方式来计算出模型
是否是可见的。 (参见下面这条)
· 世界可视化系统决定照相机在世界中的位置,并根据照相机视野决定世界的哪
些区域 / 多边形是可见的。有许多方法可以完成这个任务, 包括把世界分割成许多区域的
暴力方法,每个区域直接为"我能从区域 D 看见区域 AB & C", 到更精致的 BSP(二叉空间
分割)世界。 所有通过这些剔除测试的多边形被传递给多边形渲染器进行绘制。
· 对於每一个被传递给渲染器的多边形, 渲染器依照局部数学 ( 也就是模型动画)
和世界数学(相对于照相机的位置?)对多边形进行变换,并检查决定多边形是不是背对相机
(也就是远离照相机)。背面的多边形被丢弃。 非背面的多边形由渲染器根据发现的附近灯
剩余52页未读,继续阅读
资源评论
风轻扬1314
- 粉丝: 111
- 资源: 548
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功