游戏渲染的发展史 - 图文

更新时间:2023-10-20 23:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

分 类 号 密 级 U D C 编 号 10486

武 汉 大 学 工程硕士专业论文

游戏渲染的发展史

研 究 生 姓 名:林诗

学号:2010212160149

指导教师姓名:朱新铭 工 程 领 域 名 称:软件工程 研 究 方 向:游戏引擎技术

2011 年 5月 10日

目 录

目 录 ............................................................. 2 摘 要 ............................................................. 4 第一章 2D游戏的发展 ............................................... 4

1.1游戏机的开拓时代 ............................................................................................................. 4

1.1.1世界上第一款视频游戏\双人网球\....................................................................... 4 1.1.2第一款交互式游戏太空大战 .................................................................................. 6 1.1.3第一款街机游戏“电脑空间”发布 .......................................................................... 8

第二章 图形的显示和图形引擎的处理 ................................ 10

2.1图形引擎系统的处理过程 ............................................................................................... 10 2.2图形引擎系统的功能分析 ............................................................................................... 12

第三章 图形渲染系统模块的设计 .................................... 13

3.1图形渲染系统的层次划分 ............................................................................................... 13 3.2图形操作流程.........................................................14

3.2.1调入位图图像文件...............................................14 3.2.2绘制位图图像并显示到屏幕 ................................................................................ 15 3.3动画贴图子模块的设计与实现............................................15

3.3.1子画面动画 ............................................................................................................ 15 3.3.2帧动画 .................................................................................................................... 16 3.3.3精灵行走动画 ........................................................................................................ 16 3.3.4游戏滚动背景 ........................................................................................................ 18 3.4屏幕渲染管理模块的设计与实现 ................................................................................... 19

3.4.1场景管理的设计原理 ............................................................................................ 19 3.4.2画面互相遮挡问题的解决 .................................................................................... 20 3.4.3渲染状态管理 ........................................................................................................ 23 3.5特效处理系统模块的设计 ............................................................................................... 24

3.5.1混合特效技术 ........................................................................................................ 24 3.6粒子特效在游戏中的应用 ............................................................................................... 26

第四章 从2D到3D游戏的过渡 ...................................... 30

4.1 2.5D游戏的形成 ............................................................................................................. 30 4.2 2.5D游戏的好处………………………………………………………………………...31 4.3 3D游戏的定义…………………………………………………………………………..32 4.4游戏史上第一个3D游戏 ................................................................................................ 32

第五章3D游戏的渲染技术 .......................................... 34

5.1 3D图形渲染管线 ............................................................................................................ 34

5.1.1什么是渲染 ............................................................................................................ 34 5.1.2什么是渲染管线 .................................................................................................... 34 5.1.3图元装配和光栅化 ................................................................................................ 38 5.1.4光栅操作 ................................................................................................................ 39

2

5.1.5形象化图形流水线 ................................................................................................ 40

第六章 3D游戏图形引擎设计 ........................................ 41

6.1 3D游戏图形引擎的要素 ................................................................................................. 41

6.2 游戏图形引擎实现过程 .................................................................................................. 42

6.2.1坐标变换 ................................................................................................................ 42 6.2.2物体剔除 ................................................................................................................ 43 6.2.3背面消除 ................................................................................................................ 43 6.2.4 3D物体空间裁剪 .................................................................................................. 43 6.2.5渲染和光栅化 ........................................................................................................ 44

第七章 3D图形引擎中渲染器的设计技术 .............................. 44

7.1渲染器低层次细分 ........................................................................................................... 44 7.1.1三维模型子系统 .................................................................................................... 45 7.1.2 场景管理子系统 ................................................................................................... 45 7.1.3特效子系统 ............................................................................................................ 46 7.2渲染内核核心模块和技术 ............................................................................................... 47

7.2.1光照和表面性质 .................................................................................................... 47 7.2.2房间和地形 ............................................................................................................ 50 7.2.3 空间划分和排序 ................................................................................................... 52 7.2.4可见性判断和裁剪 ................................................................................................ 53 7.2.5碰撞检测 ................................................................................................................ 53 7.2.6 粒子系统 ............................................................................................................... 55 7.2.7 雾效 ....................................................................................................................... 55

第八章3D游戏的发展 .............................................. 56

8.1前期发展 ........................................................................................................................... 56 8.2 3D游戏的革命 ................................................................................................................. 59 8.3最近十年游戏的发展 ....................................................................................................... 61 8.4游戏发展的未来 ............................................................................................................... 66

参考文献………………………………………………………………………………….67

3

摘 要

本文介绍了视频游戏发展的历史,视频游戏中图形的显示和图形引擎的处理技术,游戏渲染技术的发展。其中包括2D游戏渲染引擎设计,3D游戏渲染技术。 图形渲染系统是2D游戏图形引擎中非常重要的一部分,该系统的主要功能是将制定的图像及效果在显示终端上显示出来,包括各种图像、动画效果、人物角色以及游戏的背景等。3D图形引擎中渲染器的设计技术按照不同的功能和任务,可以把渲染器整个底层次细分为三维模型、场景管理和特效三个子系统。一般由Direct3D或者 openGL 来实现它们。

关键词:游戏 渲染引擎 发展史 2D图形 3D图形

第一章 2D游戏的发展

1.1游戏机的开拓时代

1.1.1世界上第一款视频游戏\双人网球\

1958年,世界上第一款视频游戏\双人网球\问世。物理学家威利.希金博特姆(Willy Higginbotham)被认为发明了第一个“视频”形式游戏。他为了提 高参观纽约布鲁克海文国家实验室游客的兴趣,在一台示波器上展示着一款\双人网球交互式游戏。这是世界上第一款视频游戏。一年后,他改进了这一发明,将其用15英寸监视器显示。希金博特姆的成绩是显而易见的,那个游戏成为实验室受欢迎的引力所在,但是希金博特姆从来没有为他的设备申请专利(因为他在工作时发明了它,所以专利属于美国政府)。所以在公众眼中他把发明视频游戏的荣誉留给了别人。

双人网球游戏在一个模拟计算机上开发,可模拟示波器上的游戏网球或乒乓球。作为第一个使用的图形显示的电子游戏,希格恩博瑟姆了解到布鲁克海文国家实验室的其中一台计算机可以计算出弹道导弹轨迹,他用这种能力,形成了这

4

一游戏的基础。这一游戏采用模拟示波器上的图形显示网球场的球道。 所设计的电路显示球的路径,当它撞到地面改变其路径。 该电路还模拟球击中的感觉和模拟速度与净阻力。用户可以交互点击一个按钮来击出球模拟球路控制器,用一个旋钮来控制角度。击球也发出声音。

双人网球被称为第一个视觉显示器视频游戏。为了解释这个词“视频游戏”,审查委员会还审议了其他游戏的早期电子产品如OXO游戏和一个未命名的类似导弹的游戏,该游戏在 1948年申请了专利,成为游戏代表,不同于后两者是通过轻击光操纵柄用图片来显示目标被打击。双人网球于系统内展示运动轨迹,并显示图形。 此外,希格恩博瑟姆没有看到现有能力的计算机做出游戏是一个很大的区别。

但是,由于双人网球使用了示波器 ,而不是传统的CRT显示器或电视的显示设置为它的视频。 这主要是由于是希格恩博瑟姆只是组建一个临时搭建的技术演示来招待游客,而不是生产适销对路的商业产品。双人网球输出采用一个矢量示波器,因而无光栅视频信号,通过使用标准的电视和电脑显示器 (但是,游戏产生一个向量视频信号一样被用在一些后来的视频游戏,小行星,和战斗机飞机 HUDs),并且不包含播放器直接控制的对象,球员们,控制看不见的“拍子”,将改变一些“球”的轨迹,双人网球立即被拿来作为视频游戏技术的例。

双人网球游戏

开发商(s)威廉·希金伯丹 出版商威廉·希(s) 威廉·希金伯丹设计师(s)

5

模拟计算机平台(s)/示波器

发布日期(s)- 1958年10月18日,[1] 类型(s)网球/乒乓球

1.1.2第一款交互式游戏太空大战

1961年,麻省理工学院(MIT)学生史蒂夫.拉塞尔(Steve Russell)设计出了\太空大战,它才是真正在电脑运行上的第一款交互式游戏。这款游戏运行在PDP-1(编成数据处理器-1)上,当时电脑技术还相当有限,空间大战必须使用新阴极射线管显示器来显示画面。太空大战是一个简单的游戏,它通过示波镜产生图像,在上面2个玩家可以互相用激光击毁对方的太空船。这个 游戏在PDP-1小型机上运行,这是一种非常大非常昂贵仅仅被商家选择使用的主机。但是那个时候,电子游戏只属于少数精英,只有极少数的经过挑选有权使用那昂贵的电脑主机的人才可能玩到它。 太空大战的是一种已知的最早数码电脑游戏。

史蒂夫拉塞尔,马丁格雷尔特斯和韦恩。为特纳姆海格海姆学院 在1961年构思出这个游戏,其意图12月在麻省理工学院实现。艾伦.可图可用后正弦、余弦程序计算了几个月得到,拉塞尔开始从1962年2月编码,并且产生了他的第一个版本。它花了大约200个小时的工作来创建初始版本。附加功能由丹·爱德华兹和彼得参孙.格雷尔特斯开发。

基本的游戏操作包括两个武装的太空船,被称为“针”和“楔形”试图在彼此的重力下操纵一颗恒星。船舶消防导弹的不受重力(由于缺乏处理时间)。每条船都有一定数量的导弹和供应有限的燃料。每个玩家控制船舶,必须试图同时射击另一艘船、避免碰到那颗星。在超空间特征可作最后一搏,意味着逃避敌人的导弹,但从超空间返回会产生在一个随机的位置和有一个递增的船炸响的概率。分别以顺时针和逆时针方向控制角色包括旋转、推力、消防、超空间。最初这些受到控制,利用前翼测试开关, 每个球员有四个交换机,但这些被证明让正常运行的游戏方式磨损得很快, 留下一个队员控制开关的位置的一个方面,CRT显示器,而且在视觉上处于弱势地位。大多数网站使用自定义控件控制同一有线开关盒,虽然操纵杆和其它控件也被投入使用。

6

控制开关在控制台上的感觉:没有星星(因此没有重力),使角动量,禁用背景星的区域,“风”——一种扭曲的空间因素对轨迹,要求飞行员仔细调整他们每次动。

后续发展和变异:两个球员以PDP-12玩, 在老式计算机的节日运作第一个版本的游戏,1962年2月完成的星区域包含着一种随机生成的背景。然而由于游戏的不精确性、缺乏生气,于是他写了一本参孙星图程序,依据真实场景缓慢的滚动:在任何一个时间,45%的夜晚的天空是可见的,每一颗星星到第5级落下来。该项目被称为“昂贵”(指天文馆PDP-1电脑的价格),很快就被纳入主要代码。恒星的重力和超空间特征也还未出现在那一个可写的版本;它们是爱德华和罗素,分别添加元素的策略是最初射击游戏的纯的反应能力。完成时间基本上是1962年4月下旬。

游戏迅速传播开来,在其他的研究中心的其他程序员开始编码,包括他们自己的变异特征,比如隐形装置、空间矿山、甚至是第一人称视角的版本,玩过两个屏幕,每个飞行员的观点,模拟出驾驶舱的出现,是一种相当好的全面对计算机和类型的PDP-1 CRT显示器的诊断,所以12月将它应用在工厂测试和付运,可为客户提供PDP-1电脑。已装入程序的核心内存;这使得现场完全建立PDP测试照,还做了最后的PDP的测试。

开发商(s)史蒂夫·拉塞尔孙俐。 pdp-1平台 发布日期1962年 流派:空间战斗, 电磁模拟射击

7

模式:两名球员,同时

1963年,任天堂有限公司转型进入游戏市场。

1967年,第一款用枪的视频互动游戏诞生。1967年拉尔夫.贝尔与设计小组成功研究出第一款可以在电视机上玩的视频互动游戏。他们先开发了一款追逐游戏,紧接着又开发了一个电视网球游戏。他们还改装了一把玩具枪,使其能够辨别屏幕上的光点。

1.1.3第一款街机游戏“电脑空间”发布

1971年,第一款街机游戏“电脑空间”发布。1971年诺兰.布什内尔(Nolan Bushnell)和特德.达布尼(Ted Dabney)在拉塞尔的空间大战的基础上设计出第一款街机游戏,取名为“Computer Space\脑空间”就是前面提到的“太空大战”的变种,可惜的是他并没有被公众接受。发行这个游戏的Nutting Associates公司的老板说“电子游戏是个赔钱的东西,这绝对不是个好主意。”在《电脑空间》推出的次年,Nolan和他的朋友Ted abney 用500美金注册成立了自己的公司,这个公司就是电子游戏的始祖——Atari(雅达利)。

“电脑空间” 是在11月份雅达利公司发布的视频街机游戏机。

一个大市场的核心是大学校园的小型计算机范围内——它起源计算机中心软件各种远程终端的分配。——这一个专门的计算机装置建造只为进行一场比赛。

计算机空间是第一个可以广泛应用的视频游戏,虽然它不是一个成功者。对许多人来说,这个游戏很复杂,不太好迅速掌握。当它落户在大学校园,不是很受欢迎。在酒吧和其他场所后来轰动一时的更容易掌握的pong游戏仿照的是奥德赛家拉尔夫·巴尔开发系统的网球比赛。

8

设计师:特德.达布尼.诺蓝布什内尔 发布日期:1971年11月 类型:全方位射击游戏 模式:单人或2人

显示:光栅,标准的分辨率,十五英寸屏幕

玩家控制一个火箭船使用推进器和一双旋转按钮。在游戏中,玩家必须避开敌方炮火同一双飞碟步调一致。这名球员用他们的火箭船发射导弹破坏飞碟。今天,打赢这场比赛将被认为是一种全方位的射手。

打飞碟结束时如果这名球员的得分高于90,玩家将得到另一个90秒的打球时间,且颜色的画面就会切换到“多维空间”(这开关像照片是负面的,从黑色到黑色,白色和白色)。如果最终90秒球员的得分仍高于90,玩家会获得另一90秒,而且颜色将恢复正常。这是无限重复序列。得分保持为一个单一的数字从0到9,因为分数为10 到15,一旦得分15达成共识,接下来的袭击将会返回得分为0。

电脑空间利用微处理器、ram或rom。整个计算机系统是一个状态机74-series TTL芯片做成的。图形元素被保留在二极管阵列。机体形态由3个多氯联苯互联,渲染显示器是通用电气的15个黑白便携式电视真空软管套特别改良的。

1972年,Magnavox公司的“Odyssey\,被拉尔夫.贝尔设计而出,

9

成为第一款家庭游戏主机。其实他最早拥有视频游戏的想法是在1951年,当时他正在一家名叫 Loral的早期电视制造工厂工作。他被分派建造这个世界最好的电视系统,他提交了电视应该具有革新概念的想法,其中之一就是要有可以玩游戏的功能。这个想法立刻被他的经理罐装了。

1975年,艾尔.奥尔康(Al Alcorn)贡献出电视游戏“Pong\Atari的第一个家庭电视游戏产品。Atari的“Pong\它是第一款可以四人同时参与的游戏。这个游戏最后被命名为“Pong\2个理由:球撞在物体上就发出这个声音(在字典里pong\被定义为空旷响亮的声音),而现实中“Ping-Pong\也已经有了版权。

第二章 图形的显示和图形引擎的处理

说到视频游戏,就要说到图形的显示和图形引擎的处理。

2.1图形引擎系统的处理过程

游戏图形引擎的处理过程是这样的:首先是需要设置游戏的运行环境,对 图形背景、精灵物体、动画属性、层次关系和位置坐标等进行初始化。然后对 用户的输入进行检测以便根据玩家的意图来改变游戏的运行状态,并且通过游 戏的管理控制界面对用户的输入请求进行处理。处理完后通过游戏的屏幕渲染 机制更新屏幕的显示。当退出游戏时,清除初始化时载入的所有图形、声音以 及各种数据,并且释放内存。 处理过程如图2.1所示:

10

测与反馈模块。

空间划分与排序模块的目的是为可见性判断和碰撞检测模块提供支持。这个模块最终会构建出场景树, 使可视性问题和碰撞检测问题都最终归结为场景树的遍历与下溯。

可见性判断与裁剪模块利用场景树判断物体是否在视野中可见, 剔除被遮挡或者视野外的物体, 再对局部物体采用缓存算法进行排序和隐藏面消除工作。 碰撞检测与反馈模块负责 游戏中各物体之间的碰撞检测以及物体与场景之间的碰撞检测。碰撞检测的过程是重要的。如果没有它, 游戏中的人物就会毫无遮拦地移动 — —如果考虑重力的话, 则会一直不停地往下掉, 直到符点数溢出(或受不了这一漫长的过程而离开游戏) 为止。

7.1.3特效子系统

特效子系统包括粒子系统、 公告牌、 雾效等模块, 负责在游戏世界中实时模拟各类自然现象, 通过特效子系统处理的场景将会变得十分逼真和生动。粒子系统模块模拟大量的自然现象, 如火焰、喷泉、爆炸、鱼群、气体、星空等,它们的原理相似。一个粒子系统由带有不同属性的物体对象与其必须遵守的行为规则组成, 确切地说这些属性和规则依赖于想模拟的现象。一些粒子系统可能需要大量的属性和复杂的规则, 然而有些可能极为简单。公告牌, 在游戏中有着广泛的应用。它的本质就是用预先做好的几幅位图来代替物体,极大地节省了资源和提高了速度。仔细观察 “魔法门” 系列游戏, 它的精灵,树木,物品都是二维图像, 但由于它始终朝向观察者, 你根本看不到它 “扁” 的一面, 所以给人一种立体的感觉。

46

图:魔法门之英雄无敌

雾是一种自然现象, 在大部分地方并不算常见, 但是在现在的游戏中, 却是必不可少的一个元素。使用雾除了增加天气系统的效果外,主要原因是受限于硬件的能力, 游戏并不能把游戏中的整个场景渲染出来, 只能绘制到一定的距离。在这个距离之外, 即裁剪空间的后平面之后是一片空白。为了弥补这个空白, 很多游戏就使用雾的效果来掩盖。

7.2渲染内核核心模块和技术

上节中我们分析 游戏引擎渲染内核的构架, 对其中的子系统进行了介绍。下面, 我们将详细剖析其中的几个模块和实现它们的常用技术。

7.2.1光照和表面性质

光影贴图技术是游戏引擎中最流行的光照处理方法,尤其在第一人称射击游戏中。光影贴图是一种简单而非常有效的光照处理方式。简单来说, 在每个多边形上贴两个纹理,第一个是常规的纹理, 第二个是光照图, 第二纹理用来表

47

达光强度的分布。

图 5显示了纹理与光影贴图的结合, 使其多边形看起来具有阴影效果。在程序实现上, 可以采用多重纹理或多通道渲染来实现光影贴图。多重纹理通过采用两个纹理进行乘法纹理

混合一次渲染多边形; 而多通道渲染通过两次渲染多边形, 每次贴上一个纹理可以达到与多重纹理相近的效果。

在游戏引擎的设计中, 通常采用多重纹理映射。因为它较之多通道渲染有两个好处: 速度快, 多边形无须进行两次光栅化, 而且现今大多的加速卡都可对多重纹理渲染进行硬件优化, 一些3D加速卡甚至可在单通道里应用四个纹理甚至更多。 效果更好。图 ( 6a) 是不支持多重纹理映射的显卡渲染出来的 Quake场景, 而图 ( 6b) 是支持多重纹理映射的显卡绘制出来的场景。值得注意的是, 光影贴图技术多重纹理映射本质上是在渲染之前预先生成的一种罐装效果。在游戏的场景中灯光或物体都是运动的, 必须在每一帧渲染之前生成相应的光照贴图 (光照纹理) , 按照动态灯光或物体运动的方式修改光照纹理。虽然光影贴图可以快速地渲染, 但是存储这些灯光纹理所需的内存消耗非常昂贵。而且如果场景中有多个灯光,对所有的物体重新生成光照纹理将极为耗费 CPU时间。

许多游戏使用混合照明方式。以 QuakeIII为例,

48

场景使用光影贴图, 动画模型使用顶点照明。预先处理的灯光不会对动画模型产生正确的效果— — 整个多边形模型得到灯光的全部光照值, 而动态照明将被用来产生正确的效果。镜头控制镜头的位置和方向定义在世界坐标系里面。在投影时, 先要用一个矩阵把三维模型从本地空间转换到世界空间, 这个矩阵叫本地空间到世界空间转换矩阵。然后再根据镜头的位置和方向, 形成另外一个矩阵, 称为投影矩阵。因此, 镜头的旋转, 体现在投影矩阵上, 而物体在三维空间的内旋转体现在本地空间到世界空间转换矩阵上。矩阵运算很难直接表达与空间镜头的变换。如果要算出中间位置, 需要插值计算, 但对矩阵进行插值是非常困难的。

在3d 游戏中, 一般采用 Euler角或四元数法控制镜头的旋转。 Euler角表达旋转比矩阵直观,但是 角在插值方面的效果不是很好, 会出现很生硬的效果, 更为严重的是, 它会导致万向节锁定。而四元数法被大量地使用在第三视角的游戏中, 通过四元数法可以避免矩阵相乘, 易于插值, 并且插值的效果好, 形成的动画效果非常平滑柔和。 《极品飞车》 系列中的镜头控制便采用了四元数法, 如图 所示。

49

7.2.2房间和地形

7.2.2.1房间

入口技术对于解决游戏中室内场景的生成问题提供了一个较好的解决途径, 主要优点是快速并且易于实现。所谓入口, 实际上就是引擎中连接小区的一类特殊多边形。通常它不需要纹理映射 (除非它是半透明的) , 而是将小区中其他部分映射到该入口上。小区则用来描述游戏世界中房间的概念。

从理论上来说, 利用入口和小区可以描述游戏虚拟世界中任意不包含绝对曲面的三维世界。然而入口技术要求三维对象的剖分多边形是凸的, 这样入口才可以正确进行。同时, 由于入口本身是用于解决多边形排序并进一步进行隐藏面消除问题的, 因而对于相互重叠的多边形渲染它将无能为力。

小区、 入口和物体对象是引擎中构造游戏世界空间的基本对象, 引擎中分别定义了 Sector, Portal 和 Thing 类来对应于以上三个概念。下面将分别加以说明:

对于引擎来说, 虚拟世界中房间并没有一个真实的定义, 引擎只处理小区。小区由凸多边形组成, 且必须是封闭的。小区可以使用二叉 树定义, 不同的小区有自己的二叉树, 小区之间通过入口相连。

(1)Portal入口实际上是小区中一种特殊的多边形, 它通常不需要纹理映射, 而是要将小区中的其他部分映射到该入口上。需要注意的是, 如果有从 2 小区到 0 小区的入口, 那么也同样要定义从 0 小区到 2 小区的入口。不同小区的多边形并非是共享的, 必须分别定义。这样, 对于给定的世界空间坐标就可能不止属于一个小区。

(3)Thing物体对象是对小区的一种扩充。虽然从理论上来说可以用小区创建几乎所有的虚拟世界对象, 但实际上为了更有效, 引擎用物体对象来描述诸如

50

以同样的顺序绘制第二行和以后各行。下图4.8是一个例子:

不过在实际游戏场景中,可能会出现有些地方远,有些地方近的情况,事实上,这样就会造成无法判断场景位图的远近顺序,从而无法正确的处理物体和精灵的遮挡问题。图4-9是一个“画家演算法\无法解决的情形:

“画家演算法”还有一个缺点,就是它会花费很多时间去画一些根本就会被遮住的部分,而且每次判断遮挡关系时都需要重新绘制,这样会使游戏的运行效率变差。因此本文对传统的“画家演算法\进行了改进,应用视景深度算法来处理游戏中物体和精灵间的遮挡问题。

2.视景深度算法原理 视景深度算法可以很好的避免“画家算法”的不足,解决物体和精灵间的遮挡问题。视景深度算法的原理是创建一个深度缓冲堆栈,为每个需要绘制的物体和精灵对象定义一个深度系数Z值,用于记录每个对象观察者的距离。把Z值的取值范围设定在0~1之间。用两个和投影平面平行的平面把所有超出这两个平面范围的空间都切掉。

这两个平面称为Znear面和Zfar面,分别表示较近的平面和较远的平面,Znear平面的Z值为0,Zfar平面的Z值为1。在游戏中就可以把Znear和Zfar平面分别作为游戏场景中的背景图案和前景图案,如图4.10所示。

21

在开始绘制场景时,首先把屏幕缓冲区设置为Znear面的背景色,然后在绘制对象时,对每个对象的Z值进行核算,并存储于深度缓冲器中。后绘制的图像和已经绘制于屏幕中的对象深度Z值相比较,如果当前对象的Z值大于深度缓冲器中对象的Z值,则证明目前要画的对象是比较近的。所以应该画在对比对象的上面。如果当前对象的Z值较小,那就表示目前要画的对象是比较远的,会被目前深度缓冲器中的对比对象所遮盖住。依此类推,在深度缓冲器中可以得到一个从当前Z值最大的外表面到当前绘制对象的有序列表,这也就是由于遮挡关系而需要更改图像绘制顺序的次序表。因此在游戏循环中只需要按照这个次序表依次重新绘制各个图像对象,其余没有发生遮挡的对象不需要进行更改,就可以得到满意的游戏遮挡效果。图4.11为正确处理游戏遮挡效果的实例对比图。

22

3.视景深度算法的优点 视景深度算法相对于“画家算法”而言,其不仅可以处理如图4.9所示的多物体和精灵间相互遮挡的问题,而且它只需要绘制由于遮挡关系而更改绘制顺序的图像对象。对于处于遮挡关系以下,没有产生遮挡改变的图像就可不需要重绘。由于在实际游戏中,通常同一时刻因遮挡关系而改变绘图顺序的操作不会很大面积的发生,大部分的画面都不需要重新修改,所以这种方法可以减少游戏频繁的大量绘制图像所耗费的资源,提高游戏的运行效率。

3.4.3渲染状态管理

1.渲染状态管理的设计原则 在一个典型的游戏场景中,包含人、动物、植物、建筑、交通工具、武器等。稍微分析一下就会发现,实际上场景里很多对象的渲染状态是一样的,比如所有的人和动物的渲染状态一般都一样,所有的植物渲染状态也一样,同样建筑、交通工具、武器也是如此。我们可以把具有相同的渲染状态的对象归为一组,然后分组渲染,对每组对象只需要在渲染前设置一次渲染状态,并且还可以保存当前的渲染状态,设置渲染状态时只需改变和当前状态不一样的状态。这样可以大大减少多余的状态切换。

2.渲染状态分析 实际场景中,往往会出现这样的情况,一类对象其它渲染状态都一样,只是纹理外观、动画状态不同。比如场景中可划分成人物、动物等不同的类型,在每一个类型内部只是外观不同,而其它如遮挡顺序、深度测试等渲染状态都是一样的。可以把纹理外观、动画状态数据不归入到渲染着色器中,而首先由场景管理程序按照遮挡顺序、深度测试等渲染状态由低到高的顺序划分场景中的不同类型,把场景中所有同一类型的对象用一个渲染着色器来渲染,然后在这个渲染着色器下对纹理外观进行分组排序,相同纹理外观的对象放在一起

23

渲染。

3.5特效处理系统模块的设计

3.5.1混合特效技术

在2D图形游戏中,经常会看到图像的淡入、淡出、两个或多个图像重叠显示等现象,这些特殊效果使用到的技术就是图像的混合技术,也叫图像的混合技术。混合是像素融合算法之一,就是按照“alpha\混合向量的值来混合源像素和目标像素,具体的说就是将源像素和目标像素加权相加的组合(混合)两个图像(源图像和目标图像)。源像素的权值通常被称为alpha值,目标像素的权值是(1-alpha),l是最大的颜色值。alpha混合是按颜色通道定义,而不是按位定义的。在游戏中通常需要把Alpha-Blending混合技术与Subtractive·Blending饱和相减技术配合使用,以达到最佳的逼真显示效果。比如火光、烟雾、阴影、动态光源等半透明效果。

3.5.1.1 Alpha Blending混合技术

256色的Alpha Blending要用到调色板。首先,假设已经有了一个调色板,将根据这个调色板来计算和创建一个Alpha Map的二维整形数组,这个数组用来存放混合后的颜色对应于(或近似)这个调色板中的索引值。 3.5.1.2 Alpha混合特效技术的应用

下面运用Alpha混合特效技术实现眩目的光源半透明的特殊效果。这种效果是事先做好一个光源图和一个alpha通道图,应用Subtractive Blending饱和相减技术计算每个像素点,得到单独的光源效果图,最后把所得到的效果图通过Alpha像素混合,就是游戏场景中的火光掩映朦胧效果。

第一步,直接应用Alpha混合将一张图像按一定程度的比例与另一张图像进行混合,直接这样Alpha混合后的效果(图6.1所示)可以发现图型混合的边缘呈现阴影。可见普通的Alpha混合并不适合游戏中的技能特效的显示。

24

第二步,应用Subtractive Blending饱和相减技术,首先取得光源图和一个alpha通道图,如图6—2所示。加入通道数据后,把两图R(红色),G(绿色),B(蓝色)三原色相减后得到场景中需要显示的图像效果图,再根据通道数据来进行混合。这样就过滤掉了原有普通Alpha混合图的阴影部分。

第三步,将普通整图与通道数据混合后的火焰效果图直接绘制在游戏场景中,就可以得到需要的特殊效果了,如图6.3所示。

25

5.1.3.顶点变换(Vertex Transformation):

顶点变换是图形硬件渲染管线中的第一个处理阶段。顶点变换在每个顶点上执行一系列的数学操作。这些操作包括把顶点位置变换到屏幕位置以便光栅器使用,为贴图产生纹理坐标,以及照亮顶点以决定它的颜色。 顶点变换中的一些坐标: 坐标系统:

图4:用于顶点处理的坐标系统和变换 物体空间:

应用程序在一个被称为物体空间(也叫模型空间)的坐标系统里指定顶点位置。当一个美工人员创建了一个物体的三维模型的时候,他选择了一个方便的方向、比例和位置来放置模型的组成顶点。一个物体的物体空间可以与其它物体的物体

36

空间没有任何关系。 世界空间:

一个物体的物体空间和其它对象没有空间上的关系。世界空间的目的是为在你的场景中的所有物体提供一个绝对的参考。一个世界空间坐标系如何建立可以任意选择。例如:你可以决定世界空间的原点是你房间的中心。然后,房间里的物体就可以相对房间的中心和某个比例和某个方向放置了。 建模变换:

在物体空间中指定的物体被放置到世界空间的方法要依靠建模变换。例如:你也许需要旋转、平移和缩放一个椅子的三维模型,以使椅子可以正确地放置在你的房间的世界坐标系统里。在同一个房间中的两把椅子可以使用同样的三维椅子模型,但使用不同的建模变换,以使每把椅子放在房间中不同的位置。 眼空间:

最后,你要从一个特殊的视点(“眼睛”)观看你的场景。在称为眼空间(或视觉空间)的坐标系统里,眼睛位于坐标系统的原点。朝“上”的方向通常是轴正方向。遵循标准惯例,你可以确定场景的方向使眼睛是从z轴向下看。 视变换:

从世界空间位置到眼空间位置的变换时视变换。典型的视变换结合了一个平移把眼睛在世界空间的位置移到眼空间的原点,然后适当地旋转眼睛。通过这样做,视变换定义了视点的位置和方向。

我们通常把分别代表建模和视变换的两个矩阵结合在一起,组成一个单独的被称为model view的矩阵。你可以通过简单地用建模矩阵乘以视矩阵把它们结合在一起。 剪裁空间:

当位置在眼空间以后,下一步是决定什么位置是在你最终要渲染的图像中可见的。在眼空间之后的坐标系统被称为剪裁空间,在这个空间中的坐标系统称为剪裁坐标。 投影变换:

从眼空间坐标到剪裁空间的变换被称为投影变换。投影变换定义了一个事先平截体(view frustum),代表了眼空间中物体的可见区域。只有在视线平截体中

37

的多边形、线段和点背光栅化到一幅图形中时,才潜在的有可能被看得见。 标准化的设备坐标:

剪裁坐标是齐次形式的,但我们需要计算一个二维位置(一对x和y)和一个深度值(深度值是为了进行深度缓冲,一种硬件加速的渲染可见表面的方法)。 透视除法:

用w除x, y和z能完成这项工作。生成的结果坐标被称为标准化的设备坐标。现在所有的几何数据都标准化为[-1,1]之间。 窗口坐标:

最后一步是取每个顶点的标准化的设备坐标,然后把它们转换为使用像素度量x和x的最后的坐标系统。这一步骤命名为视图变换,它为图形处理器的光栅器提供数据。然后光栅器从顶点组成点、线段或多边形,并生成决定最后图像的片段。另一个被称为深度范围变换的变换,缩放顶点的z值到在深度缓冲中使用的深度缓存的范围内。

5.1.4.图元装配(Primitive Assembly)和光栅化(Rasterization)

经过变换的顶点流按照顺序被送到下一个被称为图元装配和光栅化的阶段。首先,在图元装配阶段根据伴随顶点序列的几何图元分类信息把顶点装配成几何图元。这将产生一序列的三角形、线段和点。这些图元需要经过裁剪到可视平截体(三维空间中一个可见的区域)和任何有效地应用程序指定的裁剪平面。光栅器还可以根据多边形的朝前或朝后来丢弃一些多边形。这个过程被称为挑选(culling)。

经过裁剪和挑选剩下的多边形必须被光栅化。光栅化是一个决定哪些像素被几何图元覆盖的过程。多边形、线段和点根据为每种图元指定的规则分别被光栅化。光栅化的结果是像素位置的集合和片段的集合。当光栅化后,一个图元拥有的顶点数目和产生的片段之间没有任何关系。例如,一个由三个顶点组成的三角形占据整个屏幕,因此需要生成上百万的片段。

38

片段和像素之间的区别变得非常重要。术语像素(Pixel)是图像元素的简称。一个像素代表帧缓存中某个指定位置的内容,例如颜色,深度和其它与这个位置相关联的值。一个片段(Fragment)是更新一个特定像素潜在需要的一个状态。

之所以术语片段是因为光栅化会把每个几何图元(例如三角形)所覆盖的像素分解成像素大小的片段。一个片段有一个与之相关联的像素位置、深度值和经过插值的参数,例如颜色,第二(反射)颜色和一个或多个纹理坐标集。这些各种各样的经过插值的参数是来自变换过的顶点,这些顶点组成了某个用来生成片段的几何图元。你可以把片段看成是潜在的像素。如果一个片段通过了各种各样的光栅化测试(在光栅操作将做讨论),这个片段将被用于更新帧缓存中的像素。

5.1.5.插值、贴图和着色

当一个图元被光栅化为一堆零个或多个片段的时候,插值、贴图和着色阶段就在片段属性需要的时候插值,执行一系列的贴图和数学操作,然后为每个片段确定一个最终的颜色。除了确定片段的最终颜色,这个阶段还确定一个新的深度,或者甚至丢弃这个片段以避免更新帧缓存对应的像素。允许这个阶段可能丢弃片段,这个阶段为它接收到的每个输入片段产生一个或不产生着过色的片段。

5.1.6.光栅操作(Raster Operations)

光栅操作阶段在最后更新帧缓存之前,执行最后一系列的针对每个片段的操作。这些操作是OpenGL和Direct3D的一个标准组成部分。在这个阶段,隐藏面通过一个被称为深度测试的过程而消除。其它一些效果,例如混合和基于模板的阴影也发生在这个阶段。

光栅操作阶段根据许多测试来检查每个片段,这些测试包括剪切、alpha、模板和深度等测试。这些测试涉及了片段最后的颜色或深度,像素的位置和一些像素值(像素的深度值和模板值)。如果任何一项测试失败了,片段就会在这个阶段被丢弃,而更新像素的颜色值(虽然一个模板写入的操作也许会发生)。通过了深度测试就可以用片段的深度值代替像素深度值了。在这些测试之后,一个混合操作将把片段的最后颜色和对应像素的颜色结合在一起。最后,一个帧缓存写

39

操作用混合的颜色代替像素的颜色。

图5显示了光栅操作阶段本身实际上也是一个流水线。实际上,所有之前介绍的阶段都可以被进一步分解成子过程。

图5:标准OpenGL和Direct3D光栅操作

5.1.7.形象化图形流水线

图6描写了图形流水线的各个阶段。在本图中,两个三角形被光栅化了。整个过程从顶点的变换和着色开始。下一步,图元装配解读那从顶点创建三角形,如虚线所示。之后,光栅用片段填充三角形。最后,从顶点得到的值被用来插值,然后用于贴图和着色。注意仅仅从几个顶点就产生了许多片段。

可编程图形流水线

当今图形硬件设计上最明显的趋势是在图形处理器内提供更多的可编程性。图7显示了一个可编程图形处理器的流水线中的顶点处理器和片元(像素)处理器。

40

图7比图2展示了更多的细节,更重要的是它显示了顶点和片段处理被分离成可编程单元。可编程顶点处理器和片段处理器是图形硬件中执行Vertex Shade和Pixel Shade的硬件单元。

图七:可编程图形流水线

第六章 3D游戏图形引擎设计

作为游戏引擎中最重要的核心系统,3D图形渲染引擎只有一个功能.就是将3D世界渲染到屏幕上。

6.1 3D游戏图形引擎的要素

1)坐标变换模块

3D图形在屏幕上的显示。实际上是一个将离散的模型和关卡放置到适当的空间位置.再从人眼所观察到的角度将它们投影到正确的平面位置、最后填充像素点的过程。

41

2)物体剔除

物体剔除是指将不在相机坐标内的物体从主多边形列表中删除。 3)背面消除

背面消除是指将背对相机的物体表面从主多边形列表中清除,因为背对相机就是背对观察者。那些表面是看不到的.所以要将其清除。 4)3D裁剪

3D裁剪是流水线中一个非常重要的内容.目的在于防止绘制那些不必要绘制的多边形。提高图形引擎的速度。3D裁剪可以分为两种,物体空间裁剪和图像空间裁剪。 5)渲染

3D世界的真实感是靠光照和纹理效果表现的,而光照和纹理指的是给物体表面即多边形加上光照和纹理贴图.但是效果最终是靠渲染器渲染出来的。 6)光栅化 经过3D流水线光栅化前面的步骤后,多边形面的3D空间信息,纹理信息,光照信息都已经对应到屏幕上的像素点.光栅化就 是把这些存储在内存中的信息显示在计算机显示设备上。

6.2 游戏图形引擎实现过程

6.2.1坐标变换

3D图形在屏幕上的显示。实际上是一个将离散的模型和关卡放置到适当的空间位置.再从人眼所观察到的角度将它们投影到正确的平面位置、最后填充像素点的过程。整个图形需要多次坐标变换,分别是局部坐标到世界坐标的变换、

42

世界坐标到相机坐标的变换、相机坐标到透视坐标的变换和透视坐标到屏幕坐标的变换。

6.2.2物体剔除

物体剔除采用包围球测矿的原理:对世界坐标中的每个物体.创建一个将其包围起来的球体。然后只对球心(单个点)执行世界坐标到相机坐标变换.并判断球体是否位于视景体内.如果不在视景体内则丢弃它包围的整个物体。如果球体的一部分在视景体内,再进行其他的测试。物体剔除的函数原形:int Culleses 0BJECT();

6.2.3.背面消除

背面测试的工作原理:以统一的方式.顺时针或逆时针都可以.对构成每个物体的所有多边形进行标记,然后计算每个多边形的面法线n.并根据观察向量v对这条法线进行测试,观察向量是在初始化相机的时候定义的。如果面法线和观察向量之间的夹角不超过90度.则多边形对观察者而言是可见的。背面消除的处理函数。其原形如下:void Remove.Back faces一0BJECT();

6.2.4 3D物体空间裁剪

首先物体或多边形从局部坐标转换为世界坐标后,存入主多边形列表.网形引擎会调用cull object()函数,cull object()方法分别用视景体的前后、左右、上下面测试物体的包围球.如果物体不在视景体内.就将其从多边形列表中删除.结果存入主多边彤列表.这样就完成了物体的剔除;紧接着调用is Facing()函数方法,判断物体表面是否面向观察者,如果面向则保留。否则清除多边形,将结果存入主多边形列表,完成背面消除;这两个步骤郁是在ttc界坐标空间中进行。经过这两步后,主多边形列表中的多边形数量会减少大约一半。

在完成世界坐标到相机坐标的转换后,图形引擎调用clip()函数,这个方法只

43

用视景体的近裁面进行裁剪,裁剪掉所有穿过近裁面的多边形部分,然后将结果存入主多边形列表,完成物体空间裁剪;这一步可能去掉的多边形并不多,但是却去掉了影响图形引擎正常显示的多边形。

6.2.5渲染和光栅化

光栅化该术语通常指目前流行的计算机三维成像渲染算法,就是指把景物模型的数学描述及其色彩信息转换至计算机屏幕上象素的过程。在光栅化之前光照和着色、纹理映

射已经完成.这些信息都存储在渲染列表中。

先进行纹理贴图.包括创建纹理、建立表面和多边形贴图,然后再进行光栅。使用光栅化,我们可以将几何图形转化成屏幕上的像素。Direct3D使用扫描线(scan line)的渲染来产生像素。 当顶点处理结束之后,所有的图元( primitives)将被转化到屏幕空间(screen space),在屏幕空间一个单位就是像素。点,线,三角形通过一组光栅规则被转化成像素。光栅规则定义了一套统一的法则来产生像素。光栅得到的像素一般会携带深度值,一个RGBA diffuse 颜色,一个RGB

specular颜色,一个雾化系数和一组或者多组 纹理坐标。这些值都会被传给流

水线的下一个阶段像素的处理,然后注入到渲染目标(render target)。 以上过程是在相机坐标环境中完成.完成后就将数据存入主多边形列表,等到光栅化阶段由渲染器来将其绘制到屏幕上。这样就完成了流水线的最后一步,游戏者看到了3D图形引擎最终的成果。

第七章 3D图形引擎中渲染器的设计技术

按照不同的功能和任务,可以把渲染器整个底层次细分为三维模型、场景管理和特效三个子系统。一般由Direct3D或者 openGL 来实现它们。

7.1渲染器低层次细分

44

7.1.1三维模型子系统

三维模型子系统负责游戏场景中三维物体的创建和渲染,它包含如图所示的三维建模、光照和表面性质、镜头控制、房间和地形渲染四个子模块。

三维建模子模块是制作3D 游戏模型的基础,3D游戏场景中的模型往往是3D MAX 或是MAYA 做出来的3D 模型,模型中存储了顶点的位置、面的组成、顶点的纹理坐标、材质和贴图等需要的信息。

光照和表面性质子模块主要负责物体真实感的绘制。3D游戏中,必须在三维空间设置光源,照射到三维物体上,才能使得物体表面有明暗的效果。表面性质也是物体一类重要的参数,比如颜色、反光度、凹凸性等,在游戏引擎中,一般采用材质贴图来模拟物体的表面性质。

镜头控制子模块定义了游戏世界中视点的位置和方向等参数。在3D射击和飞行模拟游戏中,镜头要随着玩家的操纵而不断地变化。如何简单有效地定义并控制镜头,对三维游戏的总体效果起到很大的作用。除了镜头的拉近拉远之外,最重要的效果就是镜头的旋转。在3D游戏中,一般采用Euler角或四元数法控制镜头的旋转。

房间和地形渲染子模块是为了加快房间和地形两种特殊场景的绘制而独立出来的渲染子模块。对于房间和地形采取与其他场景物体不同的渲染方法会大大提高游戏画面绘制的速度和效果。

7.1.2 场景管理子系统

3D 引擎最核心的部分是场景管理。场景管理负责空间的划分和排序、 可见性判断和裁剪、 碰撞检测与反馈, 与这三个功能相对应, 场景管理子系统可划分为三个模块, 即空间划分与排序模块、 可见性判断与裁剪模块、 碰撞检

45

3.6粒子特效在游戏中的应用

目前,应用粒子系统制作的PC游戏以其优美的画面、逼真的效果受到越来越多的人们的喜爱。随着粒子系统在PC游戏等高性能平台上的日益广泛应用,其在游戏开发中的地位也日益重要,游戏玩家们已经可以在这个虚拟的世界体验到真实世界的景象,如:狂风、暴雨、燃烧的火焰、涓涓的流水、宏伟的瀑布、震撼的爆破等等。 3.6.1粒子系统简介

粒子系统(Particle System)是由Reeves在80年代初提出的一种方法,主要用来解决由大量按一定规则运动(变化)的微小物质组成的大物质在计算机上的生成与显示的问题。Particle System的应用相当广泛,大的可以模拟原子弹爆炸,星云演化,小的则可以模拟水波、火焰、烟火、云雾等等,而这些自然现象用常规的图像算法,如调色板动画、动画贴图、基于多边形的渲染、光线跟踪渲染等是很难逼真再现的。

粒子系统(particle System)是一种物理模型,Particle System的核心不在如何显示图形,而是在于对某个物理模型的理解和分析。只有基于物理模型的方法,才能模拟出随机而逼真的自然景象。粒子的运动(变化)规律可以很简单也可以很复杂,这取决于模拟的物理模型的复杂程度。对于每一个粒子,它应具有以下属性:坐标、速度、加速度、生命值和衰减。实现粒子模拟,就是要对客观对象建立一个相应的模型。

3.6.2粒子的属性

一个粒子系统由拥有这种属性的对象所组成,它们必须遵循一定的行为规范。因此现在比较通用的实现粒子特效的方法就是对粒子的属性进行建模。粒子的属性包括坐标,速度,加速度,生命值和衰减。这些属性在实现中的意义如表6.1所示。

在实现粒子模拟时,如何定义粒子的这些属性和行为规范,取决于要实现的粒子模拟。从上面的介绍了解到实现粒子特效就是要根据实现的特效,分别定义粒子的位置、速度、加速度、生命值和衰减。在程序实现中,更关心的是这些属性是如何变化的,粒子以什么方式运动,位置如何改变等等。因此在确定了粒子的属性表示以后,需要总结出粒子系统对所要模拟对象的描述处理步骤。

26

3.6.3粒子系统对模拟对象的描述处理

粒子系统是用基本粒子群来描述物体的属性及其变化,这些基本粒子可以是一个象素,也可以是一些简单的绘图图元,它们的集合确定了物体的基本形态。粒子系统不是一个静态的整体,而是随时间的推移处在不断运动中的粒子集合体。

其中粒子群的分布结构可以改变,各个粒子的位置可以移动,新的粒子可以不断产生,同时旧的粒子可以“湮灭”。也就是说,用粒子系统表示的物体是不确定的,它的外形和结构可以复杂多样,形态各异,可以处在一定规律的运动变化中,并且在一定程度上还具有一定的随机性。可按照如下的步骤用粒子系统来描述一个复杂的自然景物:

(1)深入分析对象的形体,即物体的静态特性;

(2)深入分析对象的运动状态和运动规律,即物体的动态特性; (3)确定用粒子系统描述的基本目标; (4)对粒子目标进行粒子系统绘制;

(5)将用各种方法绘制的图形或图像进行融合; 3.6.4粒子特效实现方案

应用粒子特效实现方案的主要流程如图6.4所示。

27

1.粒子的初始化 在粒子初始化阶段,主要了解所要实现的粒子效果的特征,外观看起来的形式如何,是不是可以用具有一些特有属性的粒子来描述,比如:什么颜色、如何运动、什么形状等。

粒子初始化时,新的粒子就被创建出来,它们即将运动起来构成所需要的效果。一般来说,要对粒子的所有属性进行初始化设置,比如:粒子的初始位置,粒子的水平速度、垂直速度以及相应的加速度,粒子的颜色,生命周期等等。

在初始化粒子的位置时,通常要用到随机数。粒子的初始化除了初始化粒子的属性之外,还要初始化绘制粒子特效所需的调色板。调色板决定了效果的外在颜色,是效果实现的非常关键的一个环节。

效果的颜色决定了绘制时所需要的调色板,一种特效所需要的基本颜色一般不会很多,像火焰需要黄色、红色;瀑布需要白色,蓝色等等。一般抽象出2至3种基本颜色即可,然后根据调色板的生成原理来生成其他的过渡颜色;如何运动决定了粒子在各个方向的速度,以及他们的生命周期,也就是取决于最核心的算法部分;什么形状决定了如何对最终的效果进行剪裁,使得效果更加有真实感。

2.粒子的渲染绘制 粒子系统渲染绘制可以产生一系列运动进化的画面,使得模拟动态的二维复杂自然景物成为可能。生成粒子系统某瞬间画面的基本过程为:

步骤1:在系统中产生新的粒子:

步骤2:赋予每一新粒子一定的静态属性;

步骤3:删除系统中已存在且超过其预先描述的生存期的所有粒子;

28

步骤4:更新剩余粒子的动态属性对粒子进行移动和变换; 步骤5:显示由有生命的粒子组成的图像。 3.6.5火焰粒子特效在2D游戏图形引擎中的实现

火焰效果是游戏中最常用的效果之一,在游戏中很难用图片的形式来真实的模拟火焰燃烧的效果。为了实现火焰动态变化的特殊效果,可以构造一个粒子系统来表示。火焰粒子系统可以用大量的简单图元来表示某个火焰和火焰的多个特征,如:大小、颜色、位置以及粒子本身的生命周期并可以随机地改变。

火焰粒子调色板的设置火焰的颜色主要由红色和黄色两种基本颜色构成,由于火焰特效的颜色比较简单,用程序生成调色板更合适。在实现过程中通过不断的对比、调整,通过获取随机数,可以按照一定的算法进行换算得到了64种颜色,己经完全可以满足火焰效果的要求,该调色板实现了从黄到红,再到黑的过渡。

由于要显示出发光粒子拖着一条长尾巴的火焰效果,因此需要对图像进行一些模糊的处理,这样得到的效果才会更加真实。这样在颜色处理方面,就用到了模糊技术,即Blur算法。Blur算法的原理是把屏幕上的每一个点用它周围的四个点的平均值代替。其公式为:

pixel(x,y):=[ pixel(x,y-1)+pixel(x-1,y)+pixel(x+1,y)+pixel(x,y+1) ]/4

这个公式也可以这样理解,每一点都是由周围的四个点所产生的,而火焰源在最下面,那么新产生的颜色一定比下面的平均颜色浅,渐渐变成黑色而消失。而火焰源是在不断的变化的,那么看起来就像火焰在燃烧的效果。火焰粒子特效的渲染模拟一个火焰的渲染整体思路是:将粒子群的出生地定于一个小范围区域中。让粒子按照自然规律由下而上自由升腾。在上升到一定高度时能量衰减为零,火焰消失。根据以上的思路,渲染一个火焰的效果可以分为三个步骤:放置热源、火焰上升、粒子衰减。

(1)放置热源:

放置热源很好理解,也很好实现,只需要在屏幕的适当位置即想升起火焰的地方放上一些明亮光点就可以了。

29

(2)火焰上升:

有了热源以后,火焰就应该上升起来。这就需要用到Blur算法了。由于火焰是要向上升的,所以我们不能简单的选择要处理像素点的上、下、左、右四个相临像素,而是要选择它本身和它下面的三个像素。 (3)粒子衰减:

在火焰粒子不断上升获得新坐标的同时粒子的生命值也在逐渐的降低。如果粒子生命值>0,则根据当前粒子生命值的大小来设置粒子在调色板中的值,以此作为新坐标象素中的颜色。如果粒子生命值小于0,表明粒子已经死亡,不予显示,这样,就能够模拟出大量粒子从运动到逐渐死亡的过程。 根据以上的实现过程,最后得到了如图6.5所示的模拟火焰效果图。

这样就可以真实地模拟出火焰了。

第四章 从2D到3D游戏的过渡

4.1 2.5D游戏的形成

同时具备了2D游戏与3D游戏特点的游戏我们称之为2.5D游戏。

一种是3D的地图,2D的精灵(角色、NPC等),例如《仙境传说》;一种是2D地图,3D精灵,例如《征服》。但在地图设计制作上,目前还没有2.5D之说,至多为伪3D。以《最终幻想7》为例,该作的地图制作采用了3D与伪3D技术的结合。在世界地图上行动时,使用的是真3D技术,所以该地图具备了3D技术的几大特点:物体立体占有空间,视角可变换,光照会随视角移动而

30

本文来源:https://www.bwwdw.com/article/pwrf.html

Top