请问下图中间的画面最好的游戏是什么游戏

专注IOS平台 C++语言 cocos2d-x引擎 lua脚本
游戏中的图像资源(位图与矢量图比较)
当今游戏早已不再是黑白机的时代,游戏都由色彩丰富、精致的图像,流畅的动画构成。游戏也不例外,既支持矢量图又支持位图,他们各有优缺点。本文的目的即是介绍何时使用矢量图,何时使用位图,如何在两者之间权衡?
首先让我们了解一下何谓矢量图,何谓位图,及各自的优缺点。这些内容与游戏无直接关系,但是了解他们的差异有助于我们在游戏中如何选择。
矢量图(摘自:)使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。
l文件小,图像中保存的是线条和图块的信息,所以矢量图形文件与分辨率和图像大小无关,只与图像的复杂程度有关,图像文件所占的存储空间较小。
l图像可以无级缩放,对图形进行缩放,旋转或变形操作时,图形不会产生锯齿效果。
l可采取高分辨率印刷,矢量图形文件可以在任何输出设备打印机上以打印或印刷的最高分辨率进行打印输出。
l最大的缺点是难以表现色彩层次丰富的逼真图像效果。
l矢量图与位图的效果是天壤之别,矢量图无限放大不模糊,大部分位图都是由矢量导出来的,也可以说矢量图就是位图的源码,源码是可以编辑的。
位图(摘自:)(),又称栅格图(),是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。
:位图颜色的一种编码方法,用红、绿、蓝三原色的光学强度来表示一种颜色。这是最常见的位图编码方法,可以直接用于屏幕显示。
:位图颜色的一种编码方法,用青、品红、黄、黑四种颜料含量来表示一种颜色。常用的位图编码方法之一,可以直接用于彩色印刷。
l索引颜色颜色表
位图常用的一种压缩方法。从位图图片中选择最有代表性的若干种颜色(通常不超过种)编制成颜色表,然后将图片中原有颜色用颜色表的索引来表示。这样原图片可以被大幅度有损压缩。适合于压缩网页图形等颜色数较少的图形,不适合压缩照片等色彩丰富的图形。
在原有的图片编码方法基础上,增加像素的透明度信息。图形处理中,通常把三种颜色信息称为红通道、绿通道和蓝通道,相应的把透明度称为通道。多数使用颜色表的位图格式都支持通道。
色彩深度又叫色彩位数,即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标。常用有位(单色),位(色,),位(色,),位(色),位(增强色),位和位(真彩色)等。色深位以上的位图还可以根据其中分别表示三原色或四原色(有的还包括通道)的位数进一步分类,如位位图图片还可分为,(有位不携带信息),,等等。
处理位图时,输出图像的质量决定于处理过程开始时设置的分辨率高低。分辨率是一个笼统的术语,它指一个图像文件中包含的细节和信息的大小,以及输入、输出、或显示设备能够产生的细节程度。操作位图时,分辨率既会影响最后输出的质量也会影响文件的大小。处理位图需要三思而后行,因为给图像选择的分辨率通常在整个过程中都伴随着文件。无论是在一个的打印机还是在一个的照排设备上印刷位图文件,文件总是以创建图像时所设的分辨率大小印刷,除非打印机的分辨率低于图像的分辨率。如果希望最终输出看起来和屏幕上显示的一样,那么在开始工作前,就需要了解图像的分辨率和不同设备分辨率之间的关系。显然矢量图就不必考虑这么多。
l矢量数据的优缺点:
优点为数据结构紧凑、冗余度低,有利于网络和检索分析,图形显示质量好、精度高;
缺点为数据结构复杂,多边形叠加分析比较困难。
l位图数据的优缺点:
优点为数据结构简单,便于空间分析和地表模拟,表现力较强;
缺点为数据量大,投影转换比较复杂。
表:位图与比较
常用制作工具
只要有足够多的不同色彩的像素,就可以制作出色彩丰富的图象,逼真地表现自然界的景象
缩放和旋转容易失真,同时文件容量较大
Photoshop、画图等
文件容量较小,在进行放大、缩小或旋转等操作时图象不会失真
不易制作色彩变化太多的图象
Flash、CorelDraw等
游戏中权衡
上面了解了矢量与位图各自优缺点,下面介绍在游戏中如何权衡使用。
矢量图能够调整大小,而不会造成任何质量损失,文件大小也比位图要小得多,然而大量的矢量图会对造成沉重的负担。使用矢量图需要注意:虽然可以通过来创建矢量图,但是最好直接在中创建矢量图像,因为会自动在绘制矢量图中使用尽量少的点来对其进行优化。构成矢量图的点缺少,渲染速度就会越快,文件尺寸也会越小。这是因为矢量图通过数学公式计算获得的,点越多越复杂,计算多耗。
位图能够提供照片级别的真实感,而这得需要非常复杂的矢量图才能办到。许多不同的图像设计软件(包括多数软件)都位图,然后只有几个软件能够生成为兼容的矢量图像。另外将光栅图像渲染到屏幕上所需要的运算量也要少得多,因为会将其与一个矢量长方形以等同复杂度对待。但是当像素增加时,光栅图像的大小会呈指数级增加,并在中不可做到质量无损地调整位图的大小。另外,在中渲染透明图像要比渲染不透明图像更耗费运算资源。对透明图像渲染时还需要对图像下面的像素颜色进行采样,才能和信的颜色进行混合,这些计算是比较耗时的。如果图像完全不透明,那么这些计算就可以被避免了。
矢量图:文件小、缩放不失真、CPU消耗大
位图:文件大、缩放失真、CPU消耗小
在游戏中,两者之间的选择即与内存之间的权衡,我更偏重于使用位图,牺牲内存来换。这样才能在屏幕上快速渲染出游戏对象,保证畅快的游戏体验。有大量细节的矢量图,如复杂的矢量动画,会因为太耗渲染太慢会感觉到游戏卡。
二八原则也同样适用于游戏中的矢量图、位图,80%的图像使用位图来实现,只有20%的图像使用矢量图。例如游戏角色、背景、粒子效果等全部使用位图来实现,而菜单、游戏内各种显示界面与文本则使用矢量图来实现。
为了验证上面所述,下面通过实际测试来验证矢量图与位图的、内存消耗情况。引用《矢量图与位图性能对比》()一文的结论:
常用位图格式
这里不介绍支持的所有图像格式,也不深入介绍、、的原理,但会介绍他们的优缺点及适用场景,注意事项。
中常用的位图格式有、。对于格式的图片是保留了透明通道的图片,所以一般来说它的尺寸会比大,即使用上了格式你也可以根据使用需要选择图片压缩的类型()。
是(联合图像专家小组)的缩写,是第一个国际图像压缩标准。图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。
是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。但是压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。而且是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在:到:之间,压缩比越大,品质就越低;相反地,品质就越高。
l摄影作品或写实作品支持高级压缩。
l利用可变的压缩比可以控制文件大小。
l支持交错(对于渐近式文件)。
缺点:有损耗压缩会使原始图片数据质量下降。
便携式网络图形(,)是一种无损压缩的位图图形格式,支持索引、灰度、三种颜色方案以及通道等特性。根据色彩深度分为:、、:
:位的最多支持(的次方)种颜色,位的其实支持不透明、索引透明、透明。
:支持的次方种颜色,表现为不透明(中表现为不透明,并不是说这种格式不支持)。
:支持的次方种颜色,位是我们最常使用的格式,它是在在位的基础上增加了位的透明信息,支持不同程度的半透效果。
通常,位和位之间的视觉差异很小,但是位文件大小是位文件大小的倍,所以在视觉要求不是特别精细的地方建议使用。
总结(与的选择)
当图像不需要任何透明部分时,用,因为你可以通过外部程序,如来处理凸显,而这要比在内部处理具有更低的压缩率及更好的图像质量。由于它们缺少透明通道,所以也会降低渲染器的开销。而当你需要图像的透明通道时,格式则是不二之选,但是文件尺寸及所占用的运算能力也会变大。
多数项目会混合使用这两种格式。任何资源,只要其可以作为一个矩形形状来使用,并且不包含任何透明通道,那么就对其使用格式吧。这样的资源包含以下几种:
l游戏与菜单界面背景
l在位图填充中被用作材质的图像
l遮罩形状所覆盖的图像
l在游戏中用作某种图像特性额覆盖层
便携式网络图像()是表现空白透明效果的不二之选,且更适用于表现较小的游戏元素,这些元素包含以下几种:
l游戏角色,特别是那些运动角色
l需要与背景分离的游戏内元素
l用户界面元素,比如按钮及其他不规则形状
l有着细致边线的图像,这种图像需要达到像素完美的精确性(有变模糊的倾向,或者说图像像素细节很模糊)
开始支持,是一款可以实现高动态范围图像编码,而且在压缩与解压时只需要整数运算的图像编解码器。它支持单色、、、甚至支持位无符号整数或者位定点或者浮点数表示的多通道彩色,并且它还支持。它可以选择嵌入彩色以实现不同设备上的色彩一致性。通道可以表示透明,同时支持、元数据格式。这种格式还支持在一个文件中包含多幅图像。
l与相比,它能够大大减少图片的大小,同时保证质量和支持透明度;
l与相比,这种格式支持透明通道。
一句话,结合了与的优点。
当你导入一个已经用另一个程序优化过的文件时,默认情况下会照其原样来使用它,图像却不一样。如果图像是色或更少的颜色,会自动将其降低为位的文件,文件尺寸会立刻降低,然而其品质无损(也称无损压缩)。如果图像包含的颜色超出了色,就会在编译该文件时将其转为所自有的压缩格式。
压缩率可以通过在文档中通过“发布设置”来进行控制,默认是,并且这是针对每个图像进行压缩的。对于一段时间内在屏幕上保持静止的图像来说,我建议将其设置为,这样可以保证其品质不会降低太多。而对于用在快速运动的动画序列中的图像,比如角色动画,我建议将其压缩率降低为,因为你根本注意不到由此产生的品质下降。事实上,当每秒帧时,人眼是察觉不到足够多细节的,经压缩后形成的自然模糊效果就会带来良好的运动模糊感觉。
默认情况下,当你在舞台上对图像施加任何方式的变形是(包括倾斜、缩放甚至旋转——一任何不能被90整除的角度进行旋转),Flash都不会重新渲染它们。由此导致在运动较慢的图像上产生锯齿效果。如果游戏是需要时不时地旋转一些图像或者调整其尺寸,那么你可以考在“位图属性”面板中选中“允许平滑”选项。尽管这样做后图像看上去边缘更为平滑,但却是会更耗费CPU,所以要少用这个选项。
一张图像占用多少内存只取决于图像的尺寸,二与图像文件的类型和图像压缩无关。通用尺寸下,一个压缩比很大的文件盒一个细节丰富的文件,被调取后所占用的内存是一样的。占用内存大小计算公式如下:
位图所占内存(字节)位图宽度位图高度
例如像素的图片占用内存大小为字节,除以转换成则是。注意,内存占用不等于你需要下载的文件大小,如下载像素的图片文件大小可能只有几十。
性能比较(、、)
有人在不考虑文件的情况下面(文件会直接影响到网络加载时间),(),得出以下结论(数据不一定非常准确,测试数据取决于图片,但具有指导意义):
解压缩时间
PNG(fastCompression)
JPEG(q = 1时)
JPEG(Q = 50)
JPEG(Q = 100)
JPEG-XR(q = 1时)
JPEG-XR(Q = 50)
JPEG-XR(Q = 100)
l格式是最快的装载解压缩。速度为的三倍以上,比超过倍的速度。
l设置标志为,压缩速度提高倍!
l设置提高品质轻微减慢压缩速度。与品质为相比,品质为只慢了约%。
l设置增加失真比稍微加快了压缩速度。与失真比相比,失真比它的速度提高约%。
l压缩(设置为)和使用大约相同的时间,而压缩需要的倍的时间。
l解压或图像实际上比或图像(设置设置为)慢。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!在游戏设计里负责图像的职称叫做什么?_百度知道
在游戏设计里负责图像的职称叫做什么?
在游戏设计团队里里主要负责图像设计画面渲染的工作人员职称叫做什么?有劳各位前辈了!
我有更好的答案
为您推荐:
其他类似问题
您可能关注的内容
游戏设计的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。图6-1& 二维木质纹理映射
纹理映射大体上可分为两类:一类用于改变物体表面的图案和颜色;一类用来改变物体表面的几何属性(如利用法向量扰动以产生凹凸不平的效果)。例如,在室内游戏中,墙壁的花纹、地面凹凸不平的几何形状都可以利用纹理映射实现。与基于多边形的场景绘制方式相比,
纹理映射的基本原理
纹理映射的过程中,物体和图像是纹理映射的两个操作对象,映射函数建立物体和图像的逐点对应关系,而纹理映射的基本功能则是根据映射函数将物体上每个点找
到图像上对应点,并将对应点的颜色值赋给物体上的点。简单的一维纹理可以用来模拟等高线或轮廓线;二维纹理最为常用,其坐标一般用(u, v)表示;三维纹理坐标(u, v, w)既可以体纹理,也可以用第三
个分量表示沿投射方向的深度。
1.纹理映射的基本步骤
纹理映射可分为5个步骤。首先,物体上的某个点是纹理映射的起点。一般来讲,这个点定义在
物体局部空间,使得当物体方位改变时,纹理相应发生改变。由于纹理是一个规则的图像,因此从不规则的三维物体空间变换到纹理所在的规一化空间需要一个映
射。这个映射称为参数化,即纹理映射的第二个步骤。例如,二维纹理的规一化空间是[1,
0]×[1, 0],纹理上任意一点在规一化空间中的坐标就叫纹理坐标。第三步,从参数化空
间变换到图像对应点的位置,并取出对应点的颜色值。第四步是可选的,即取出的值可能会经过某些变换计算。最后是将取出的值根据给定的纹理融合函数,修改曲
面的颜色属性。下面将详细描述纹理映射技术在游戏编程中需要注意的原理性知识。
2.纹理映射函数生成
纹理映射的区域通常是三维空间的平面或曲面,计算任意空间曲面与纹理域的对应关系本质上是一个参数化的过程。纹理映射函数的选取,或者说物体表面纹理坐标的生成,是纹理映射的一个最基本的问题。如果选择了不好的纹理映射函数,纹理在物体表面上会出现扭曲、变形的效果。从数学的角度看,良好的映射
函数通常是保角映射或保面积映射。
① 平面:平面情形相对简单,可将其旋转至与某个坐标平面重合,于是与图像
域的对应关系变得相当简单。
② 数学曲面:对于具有数学表达式的曲面,可以直接选取映射函数。在3ds
MAX等造型软件中,常用的映射函数有球面映射、圆柱映射、
平面映射、立方体等,分别对应某个参数化方法,具体映射方法将在6.1.4节中重点描述。
③ 利用物体表面属性:物体表面的法向、参数曲面自身参数、视线方向等任何
与物体表面有关的属性都可以用来计算物体的纹理坐标。
④ 过程式纹理:另外一类纹理坐标生成方式,好采用噪声函数等技术,自动合
成出三维纹理和对应的纹理坐标,详见6.3节。
3.纹理坐标插值模式
如上所述,游戏编程一般只在顶点上设置纹理坐标。从顶点纹理坐标计算出每
个像素的纹理坐标的最常用方式是在每个三角形的扫描线上线性插值,即纹理坐标u、v的生成和Gouraud渲染插值颜色的生成方式一样。由于实现简单(只需要逐扫描线相加delta-u和delta-v),因此在图形加速器中被
广泛采用。然而,认为纹理坐标u和v在扫描线上是线性变化则是不正确的,当多边形的法向与视线接近于垂直时这个问题更为严重。解决的办法是认为u/z、v/z和1/z在扫描线上线性变化,这就是纹理映射中的透视映射模式。软件实现逐个像素
的除法(除以z)是一个非常耗时的操作,因此大多数游戏编程中使用了一些小技巧。例如,Quake游戏中每16个像素做一次除法,在这之间则直接对纹理坐标做线性插值。当前的主流显卡
都支持透视纹理映射模式。
4.纹理取址方式
在纹理映射的第三步中,从规一化的参数空间映射到纹理的图像空间,提高了
纹理映射的自由度。例如,可以将参数空间映射到纹理的某一部分,也可以应用矩阵变换对纹理图像实现旋转、平移、缩放等操作。另外一个重要的操作是考虑纹理
在物体表面的重复模式,即纹理坐标超出 [1,0] 范围时可采取的操作。一个简单的例子是墙壁上的砖块纹理。在OpenGL中这种情形叫纹理弯曲方式,而Direct3D中则称之为纹理取址方式。通常,物体表面的纹理坐标位于[0,1]区间。但是为了获得某些特效,纹理坐标可能会超出这个范围。图形引擎中
常用的4类纹理取址模式是:重复(wrap)、镜像(mirror)、截断(clamp)和重复边界颜色(border
color),如图6-2所示。
① 重复:纹理对超出范围部分进行重复。如果指定的纹理坐标是u,那么重复后的纹理坐标是u=u±1.0。例如,
纹理坐标 (1.3, &#) 将采样
(0.3, 0.6) 处的值。
② 镜像:位于边界外的部分沿边界做镜像。例如,纹理坐标
&#) 将采样
(0.7, 0.4)处的值。
③ 截断:将超越
边界的值截断到最近的边界。例如,纹理坐标
(1.3, &#) 将采样 (1.0, 0.0)处的值。
④ 重复边界颜
色:设置所有超越边界的纹素的值为给定的边界颜色。
(a)重复&&&&&&&&&&&&&&&
(b)镜像&&&&&&&&&&&&&
(c)截断&&&&&&&&
(d)重复边界颜色
图6-2& 纹理取址模式示意图(图片来源:DirectX 9.0 SDK)
5.纹理融合模式
取出的纹理值可以经过任意的数值计算,并与物体经过光照明计算的颜色,或
保存在帧缓冲器中的颜色进行融合计算。常用的融合函数有以下3类。
¤替代:纹理值替代目标值。
¤渐变:与替代的区别在于,如果打开alpha通道,那么将纹理颜色与目标颜色值进行融合,但alpha值保持不变。
¤相乘:颜色纹理与目标颜色值相乘。
6.纹理映射中的反走样技术
纹理映射中经常碰到的问题是纹理走样问题,一般包括:Moire效果、锯齿、斑块、模糊、水纹、亮点等。MIP(Multum In Parvo,意思是在一个小的地方有很多东西)映射技术是图形学中最常用的纹理反走样技术。它试图解决当相机远离纹理所在位置时出现的走
样现象,基本思路是保证像素尺寸和纹素尺寸大致相等。因此,MIP映射技术在内存中保存纹理的一系列不同分辨率的版本,最高版本是原始纹理,后续版本的尺寸是前一版本的四分之一。例如,原始纹理精度是256×256,那么接下来的MIP纹理的尺寸分别是128×128,64×64,…,1×1,如图6-3所示。纹理的MIP层次是在Direct3D设备创建纹理(CreateTexture()函数)时自动完成。如果参数为1,则仅创建原始纹理,如果为0,则生成直到1×1的全部层次。
图6-3 &MIPMAP纹理(图片来源:DirectX 9.0 SDK)
7.纹理坐标变换
纹理坐标变换是指在纹理映射之前,对纹理坐标进行投影或矩阵变换。在OpenGL或Direct3D中,每个纹理阶段都可以定义一个4×4的纹理变换矩阵。最常用的纹理变换就是投影纹理(projective
texture),另外一个例子是绘制平移运动的水波纹理。
若每帧在u方
向移动du,
那么纹理变换矩阵可设置为
当纹理坐标超过了有效范围时,可以根据指定的纹理重复模式,将纹理坐标变
到有效范围后,再实行纹理坐标变换。
6.1.2 &凹凸纹理映射
纹理映射中,除了在相机距离物体很远时产生走样外(可采用MIPMAP技术解决),当相机非常靠近物体时也会发生问题,即由于纹理采样本身的不足,一个纹素投影到多个像素。如果纹理滤波是点采样模
式,结果将非常古怪和丑陋。如果采用双线性滤波或者三线性滤波,则造成严重的模糊。几乎在所有的第一人称视角游戏中,地面的纹理在视点很近时就会产生这种
现象。从图形学的角度看,现在几乎没有办法解决这个问题。
一个很直观的办法是使用更精细、尺寸更大的纹理。这既带来了显存的负担,也没有从根本上解决问题,即当视点更靠近物体时,方法
仍将失效。从信号处理的角度看,大多数纹理保存的是低频信号,其有效范围不高。但是,真实世界中还存在高频信息,即当视点靠近人眼时注意到的细节,如凹凸
纹理、裂缝、粗砂状、颗粒状纹理等。很明显,利用纯几何方式对它们进行建模将既费事,也得不偿失。它们实际上可以被看做某种纹理模式,重复地贴在物体表
面,将它们与低频的基纹理结合,就可以消除视点靠近时产生的模糊效应。本节和6.1.3节将介绍这类模拟物体表面细节的技术,即凹凸纹理映射和位移映射技术。
凸纹理记录了物体表面小尺度的高度场变化,即物体表面相邻点的高度的差分。每个点的差分在绘制时改变了曲面的法向,采用多步纹理映射模式进行光照明计算。
凹凸映射通常在每个像素层次上扰动法向向量,并用纹理作为输入,记录扰动
值。在图形引擎中,出于对效率的考虑,也可以在顶点基础上扰动法向量。图6-5是一个简单的凹凸映射例子。
图6-5& 凹凸纹理映射示意图
1.浮雕型凹凸映射
浮雕型凹凸映射与最早的凹凸映射类似,所不同的在于浮雕型凹凸映射直接计
算光亮度,而不是得到用于像素级光照计算中的扰动过的法向向量。因此,浮雕型凹凸映射不允许运用任何光照明模型。进行浮雕型凹凸映射的第一步是预处理高度
图,生成两个辅助图像。其中,第一个图像的光亮度是高度图的一半,第二个图像的光亮度是高度图的反色图的一半。绘制时综合3个图像,利用多步纹理技术完成。其中,第一步绘制半亮度图,第二步绘制反
色半亮度图,但是纹理坐标朝光源方向稍微扰动,第一步和第二步的融合操作是加法。第三步将结果和顶点光照明计算结果与纹理映射做乘积型融合操作。图6-6显示了前两步的绘制过程。
图6-6& 浮雕型凹凸纹理映射示意图
不难发现,由于没有使用扰动的法向量,因此浮雕型凹凸映射只能模拟漫射光
效果。它的好处在于不需要任何特殊的硬件支持,在标准的OpenGL
1.1中使用多步纹理映射功能就可以完成。
2.环境凹凸纹理映射
环境凹凸纹理映射(Environment Map
Mapping,EMBM)涉及两个纹理。一个称为环境映射,负责物体表面的颜色,一个称为凹凸映
射,负责产生物体表面凹凸不平的效果。它的基本原理是利用凹凸纹理扰动环境映射的纹理坐标。凹凸纹理的每个纹素有两个分量(du, dv),分别记录了纹理坐标(u,
v)的位移。在应用凹凸纹理后,像素级的环境
映射的纹理坐标从(u,
v)变为(u+du, v+dv)。环境映射既可以是视点相关的,也可以是视点无关的,而且可以用来模拟
漫射和镜面光效果。从视觉上看,应用环境凹凸纹理映射与扰动法向没有大的效果差别。如图6-7(左)所示,上图是凹凸纹理,下图是环境纹理,右图为环境凹凸纹理映射结
同传统的凹凸纹理映射一样,此处的凹凸纹理也是从灰度级的高度图计算而
得。总体而言,高度值越大,记录在凹凸纹理中的纹理坐标位移越大。注意到位移的符号为正、负皆可,因此在图形硬件中实现时必须先将位移的范围从[-1,
1]变到[0, 255]。
图6-7& 环境凹凸纹理映射
环境凹凸纹理映射也可以适用于环境映射最常见的功能,即环境反射。从这个
意义上说,将不同的信息编码在环境纹理中,可以用来模拟不同的效果。
3.法向映射
法向映射(Normal mapping)是凹凸映射系列中最常用的技术。它的输入是一个法向图,记录了扰动后的
曲面法向。本质上法向图的数据来源也是高度图。法向的x、y、z三个分量分别被保存在RGB三个颜色通道中。
图6-8的左图是一帧高度图,右图是计算出来的法向图。法向的x、y、z三个分量从[-1,
1]空间变到[0, 255]。法向由高度图变换而得,因此定义在高度图所在的空间。为了在光照明计算
时正确使用法向量,必须将法向变换到着色点处的局部空间,即切平面空间。与前面介绍的在每个像素上计算局部坐标系不同,一种更为有效的方式是在顶点上预先
计算切向和副法向向量,然后在顶点上将光源向量变换到顶点处的切向空间,光栅化过程将产生每个像素上的光源向量。对这个向量规一化后,它实际上位于切向空
间,结合扰动后的法向量,就可以在切向空间中进行正确的光照明计算。图6-9是一个基于像素级的法向映射技术的游戏场景。
图6-8& 将高度图转换为法向图
图6-9& 基于像素级法向映射技术的游戏场景
环境纹理映射
反射效果能提高游戏场景的真实
感,但是在图形硬件中不能直接支持精确的反射计算,而且比较耗时。环境映射是一个有效地模拟场景的反射现象的加速技术。取景物的中心作为固定视点来观察整个场景,并将周围场景的二维图像记录
在以该点为中心的某种简单可以参数化的几何物体(如球面、立方体和柱面)上,以全景图像的方式提供了其中心视点处的场景描述。在绘制时,环境纹理映射不需要
发出二级反射光线,而是直接从环境纹理中计算,即物体表面各点处的光亮度的决于入射方向对应的环境纹理。
球面环境映射是环境映射的一
种,它所展示的图像等价于以平行投
影方式观察一个全反射球面的效果。由于它将场景图像映射到球面,被映射的物体的每个顶点必须投影到球面参数化的(u, v)坐标上,进而采样球面环境纹理。球面环境纹理的例子如图6-14(左下)所示。反射光线向场景发射后所交的第一个点的光亮度记录在球面环境纹理上。
生成镜面球面环境映射的第一种方法是实拍图像,这种方法的缺点是相机本身也出现在反射纹理中。第二种方法是使用一个鱼眼镜头直接生成360°或180°全
球面环境映射效果图(左上)、球面环境纹理
(左下)、球面环境映射的反射光线计算示意(右)
图6-14 &球面环境映射的反射
除了镜面反射外,球面环境映射还可以模拟与物体表面有关的其他效果,如Phong模型和折射。球面环境映射的理想状况是相机和环境物体位于无穷远处。如果物体具有自身反射性质(它不是凸物体),或者相机与其他物体不在无穷远处时,球面
映射理论上是不正确的,这是因为球面环境纹理在物体中心点上建立却试图模拟物体的整个表面的反射效果。球面环境映射的另一个严重缺陷是视点依
赖性,即只适用于一个方向和一个相机。纹理映射到球面后会产生伸缩或变形效果,当视点移动较大距离时,必须重新计算球面环境纹理,而底层图形API逐帧计算球面环境纹理的效率不高。此外,生成球面纹理坐标采用的球面参数化不
是保面积变换,因此在多边形平面上对球面纹理坐标进行线性插值并不符合球面的特性。由于球面环境映射的这些缺陷,尽管绝大多数显卡支持球面环境映射,它的
实用性仍然大打折扣。
立方体环境映射
使用立方体的六个面作为保存环境纹理的几何体,一个立方体纹理由6张不同纹理组成,每张
纹理对应立方体的一个面,这6个面分别是:+X方向(+Y,
−Z);−X方向(+Y, +Z);+Y方向(−Z, −X);−Y方向(+Z,
−X);+Z方向(+Y,
+X);−Z方向(+Y,
+X)。立方体纹理的生成远
比球面环境映射简单,只需要在立方体的中心设置一个视野为90o的相机,分别朝6个方向绘制场景。这些图像能在底层图形API中实时生成,而且不
会导致变形,当视点绕着物体移动时,它能始终正确地反射出场景的正确位置。此外,立方体纹理允许在各个平面上进行线性插值,因此既没有图像变形,也不会导
致奇异点。图6-15(左)是立方体纹理,而右图是它的6个面的展开。
图6-15& 立方体纹理概念图(左)及展开的六个立方体
立方体环境映射并不限于模拟精确的反射,也可以模拟镜面高光、漫反射和Phong光照明模型。如果使用低分辨率的纹理,可以模拟粗糙的物体表面。它的局
限性来源于它的预处理方式,当光源或场景物体的遮挡关系改变后必须重新生成。
立方体环境映射能解决球面映射的问题,可完全在Direct3D和OpenGL中实现,已经成为业界标准。游戏编程人员们利用立方体环境映射方便地创造
反射和镜面光照效果,生成活泼、有趣的沉浸感强的三维游戏场景,例如赛车游戏的车身上闪亮的环境光效果。
高级纹理映射技术总结
凸纹理映射的主要思想是扰动用于光照明计算的物体表面法向。Blinn提出的早期凹凸纹理映射使用高度图在线计算法向,对图形硬件的处理能力提出了很高的要求。两个改进的算法浮雕型凹凸纹理映射和
环境凹凸纹理映射并没有真正扰动法向,因此适用范围不广。法向映射技术真正给出了扰动的法向计算方式,可通过预计算的方式模拟出任意光照明模型,是游戏引
擎中实现凹凸映射的标准算法。细节纹理技术用较少的几何数据替代高度复杂的物体表面细节,大幅提高了绘制效率。水平线凹凸纹理映射则进一步增加了物体表面
的深度信息。
与凹凸纹理映射不同的是,位移纹理映射既能模拟凹凸的表面细节,还能模拟
微观的几何扰动,缺点是图形硬件不支持逐像素的位移映射,因而只能采用自适应网格剖分的折衷方案。
与凹凸纹理映射和位移纹理映射不同,环境纹理映射的目标是模拟某个物体的
周围环境。球面环境映射是一个非均匀映射,因
而会导致图像扭曲变形现象,这在两极尤为严重。此外,球面投影缺乏一种适合于计算机存储的表示方法。尽管立方体环境映射克服了球面环境映射的一些缺陷,但
对非计算机生成的图像,实拍获得立方体环境映射是非常困难的。这是因为立方体环境映射是由6幅广角为90°的画面构成,它们之间的拼接要求精确的摄像机定位技术。由于平面投影也
是非均匀的,在立方体的边界和角点处仍存在采样过多的问题。
光照映射则模拟光源对物体表面光亮度的影响,极大地节省了在线的光照明计
算,是三维游戏图形引擎中不可或缺的技术。表6-4比较了上述几类高级纹理映射技术的异同。
图6-17比较了常规纹理映射、凹凸纹理映射和位移映射的绘制效果。其中,凹凸纹理
是一幅灰度图,灰度值低对应地球的低海拔地区。应用凹凸纹理映射产生了凹凸不平的表面外观,但是轮廓仍然是光滑的球面。位移映射则产生了真正的物体表面几
何细节和轮廓。
表6-4& 各类纹理映射技术的
图形硬件实现
常规纹理映射
凹凸纹理映射
球面环境映射
立方体环境映射
(a)纹理映射&&&&&&&&&&&&&&&&&&&&&&
(b)凹凸映射&&&&&&&&&&&&&&&&&&
(c)位移映射
(d)纹理映射线框表示&&&&&&&&&&&&&&&
(e)凹凸映射线框表示&&&&&&&&&
(f)位移映射线框表示
(g)常规纹理&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
(h)凹凸纹理
图6-17& 常规纹理映射、凹凸映射、位移映射比较(图
片来源:Direct3D 9.0 SDK)
混合式图像和几何绘制
统的图形绘制技术是面向场景几何的,涉及到场景的建模、消隐和光亮度计算,尽管通过第5章的可见性预计算技术及场景几何简化技术可大大减少需处理的景物面片数
目,但对高度复杂的场景,现有的图形硬件仍无法实时绘制简化后的游戏场景。基于图像的建模与绘制技术(Image based
modeling and rendering,IBMR)就
是为实现这一目标而设计的一系列方法。IBMR基
于一些预置的图像来生成不同视点处的场景画面,有着鲜明的特点:
¤图形绘制的计算量不取决于场景复杂性,而与所需屏幕分辨率有关。
¤预先存储的图像既可以是计算机合成的,也可以是实际拍摄的画面,两者可以混合使用,从而可能获取很高的真实感。
三维游戏引擎中,最为实用的IBMR技术当属混合式图像和几何绘制技术,它综合利用简化的场景几何和图像模拟复杂场景物体的外观与形状。与纯粹基于图像
的建模与绘制技术(如全景图、同心拼图、光场函数等)相比,混合式图像和几何绘制技术存在两个优点:
¤利用图像快速模拟出物体的表面细节和外观,从而比纯几何绘制更高效。
¤利用简化的几何方式模拟不同视点下的物体形状,从而避免纯图像方法的大
节从面向游戏开发的实用性出发,描述三维游戏引擎中的简单然而高效的几类基于图像的建模与绘制技术,包括:光晕、Sprite、Billboard、Impostor。
晕是相机在亮光的直接照射下所引起的现象,通常它由一个光环和淡淡的日冕组成。由于各种光的波长不同,当它们照到透镜上时会发生折射,产生光环。日光的光
环看起来像一枚戒指,它的外边缘是红色的,内边缘是紫色的。日冕在透镜中分布不均匀,从中心点向四周辐射。此外,由于光线在透镜的内部发生反射和折射,所
以会产生二次效应。例如,照相机的隔膜片可以生成六边形的图案。
据光学原理计算多个透镜的光晕效果显然得不偿失。游戏中通常采用一种简单的二维图像技巧,它的基本思路是把光晕分解为两类组成元素,其一是光晕的主要部
分,它控制光晕的形状,可大致分为4类,如图6-18所示。
(a)放射型&&&&&&&&&&&&
(b)环型&&&&&&&&&&&&&
(c)十字型&&&&&&&&&&&
(d)光束型&&&&&&&&&
(e)四者的合成
图6-18& 光晕形状的构成
图6-20是三个典型的光晕例子。
图6-19& 光晕实例
精灵图元的绘制
于图像绘制的最简单图元是Sprite。Sprite的名称来源是早期的二维游戏,当时这种动画技术经常用来模拟神话世界的精
灵(Sprite),其后就用Sprite来命名,中文名是精灵动画技术。在二维游戏中,Sprite是指一幅能
在屏幕上移动的图像。简单的Sprite图像和屏幕上的像素一一对应。Sprite的显示有许多
加速算法,如将它们预编译成一张像素表,可以避免测试每个像素的透明度。稍微复杂的Sprite技术能缩放图像,如一个10×10像素的Sprite通过简单的复制可以转换成20×20或30×30的Sprite。通过添加不同分辨率的Sprites,可以使不同焦距之间的转换更加自然。显示连续运动状态的Sprite可以生成物
体动画效果,这就是精灵动画。对于不同的观察角度,可以使用不同的Sprite。
用模板缓冲器可以完成精灵动画的溶解与清除。它的功能是锁定图像的某块区域,获得幻灯片之间过渡的效果,如从左到右清除老的源图像,显示新的目标图像。算
法首先构建一系列形状逐渐过渡的辅助多边形(从空区域到覆盖整个窗口)。辅助多边形并不产生任何绘制结果(设置alpha为0,alpha测试结果大于0时
则通过),只是将它覆盖像素的模板值变为1。
绘制时,初始化模板缓冲器为0。在模板值为0的区域绘制源图像(即没被辅助多边形覆盖的区域),在模板值为1的地方绘制目标图像。随着辅助多边形的变化,即可完成源图像到目标图像
的溶解效果。
用简单的纹理映射几何绘制手段替代复杂的几何绘制能增加场景真实感和效率。Billboard技术采用一个带有纹理的四边形,其纹理图像为该Billboard所代表的物体的图像,即用带有该物体图像的长方形,代替该物体生成该物
体的图形画面。Billboard放置于所代
表物体的位置中心,并随相机的运动而变化,始终面对用户。将Billboard技术与alpha纹理和动画技术结合,可以模拟很多自然界现象,如树、烟、火、爆炸、云等。图6-21显示了一个用Billboard技术表示的森林场景。
图6-21 &用Billboard技术表示的森林场景(图片来源:Direct3D 9.0 SDK)
早期的Billboard的图像是预先得到的,且只针对具有一定对称性的物体。4种最常用的Billboard几何表示方法如图6-22所示。第1~3种方法允许视点在与物体高度相同的区域内变化。当视点改变时,Billboard四边形绕对称轴旋转,如果存在多个四边形(第2、3种方法),需要融合它们的绘制结果。第4种方法额外生成了顶部和底部的四边形,允许视点位于物体上方或下方,这在
飞行器模拟类游戏中广泛使用。除这4种表示方
法外,对于对称
性不强的物体,可以使用视点依赖的Billboard技术,分为两步进行:第一步是预处理阶
段,对于每个可能的视线方向计算一个物体的图
像;第二步是绘制阶段,当视线方向给定时,选择最近的两个视点,取出它们对应的纹理并它进行插值和纹理融合。
图6-22 &4种常用的Billboard几何表示(虚线代表对称轴)
Billboard四边形法向和向上向量的不同设置方式对应着不同的Billboard技术。
1.平行屏幕的Billboard技术
平行屏幕的Billboard技术是最常用也是最经典的Billboard方法,也就是说,Billboard四边形的法向始终重合于视线方向。而向上的方向就是相机的向上方向。平行
屏幕的Billboard技术可以用来显示注
释文字,这也正是Billboard(公告
牌)技术名称的由来。平行屏幕的Billboard技术经常用于显示圆形物体和粒子。
2.平行物体的Billboard技术
于圆形物体的对称性,当相机绕视线方向旋转时,
Billboard的外观始终保持一致。对于其他形状的物
体,采用平行屏幕的方式并不是很合适。此时可定义物体的向上方向为相机的向上方向,而法向仍平行于视线方向。
3.视点朝向的Billboard技术
前面两种Billboard方法中,法向始终
平行视线方向,即场景所有的Billboard使
用同一个旋转矩阵,这样无法模拟透视投影的变形效果。当相机的视角和真实人眼的视角相一致时,或视角和Billboard都较小的时候,变形的效果可以忽略不计,此时Billboard的法向可以取为平行视线方向。反之,Billboard的法向应该取为从视点到Billboard中心的连线,这就是视点朝向的Billboard技术,如图6-24所示。
图6-24 &平行屏幕的Billboard技术和视点朝向的Billboard技术
Billboard和Sprite技术都采用简单的几何加纹理映射来完成场景的模拟。它们的缺陷在于过于
简单的几何和一成不变的纹理,使得相机靠近物体时出现明显的失真。为了弥补这些缺憾,Impostor(替身图)技术巧妙利用游戏每帧间的连续性,采用二维图像和真实的三维
模型的投影替代真正的物体几何特征。
过程式建模技术
维游戏中对复杂自然场景的模拟有两个终极目标。其一是物体空间上的高度真实感,即以假乱真地绘制蓝天白云、山川河流、花草树木等,使得玩家“身临其境”,在看到游戏画面时如
同置身于真正的大自然;其二是游戏的实时性,这是保证游戏流畅的必要条件。为了获得游戏运行
时的时空一致性,三维游戏引擎中的复杂自然场景特效的生成必须采用许多精致的技巧。本节按照景物的分类重点介绍下面三类技术:植被的构造和绘制技术,雾、火焰的构造和绘制技术,水波的模拟和绘制技术。
子系统(particle
system)是一系列独立个体的集合,这些独立个体就称为
粒子,它们以一定的物理规律和生命周期在场景中运动。从物理上看,粒子可以抽象为空间中的一个点,这个点拥有某些属性,并随时间运动。通常,粒子的属性包
括位置、速度、加速度、能量、方向等。粒子的运动具有随机性,在粒子运动过程中,粒子属性被显示、修改和更新。基于粒子系统的建模方法的基本思想是采用许
多形状简单的微小粒子(如点、小立方体、小球等)作为基本元素,来表示自然界中不规则的模糊景物。粒子的创建、消失和运动轨迹受不同的因素影响,如粒子自身的冲力、重力、粒子与其他物体的碰撞等。
粒子与其他物体的碰撞检测需要耗费大量的时间,一般不予考虑。由粒子系统表示的物体,要么是给定时刻粒子的位置,如火、雪、烟,要么是粒子的一部分运动轨迹,如草和树。通用的模拟粒子系统运行流程见例程6-1。
游戏场景中的很多现象和物体都可以用粒子系统来模拟,包括烟、火焰、爆
炸、血溅等。游戏引擎中,通常都设计一个专门的模块,即粒子系统,以完成对它们的模拟。在著名的星际迷航游戏中,就设计了将近400个粒子系统,总计75万个。由于粒子系统包含大量的运动的小粒子,出于对效率的考虑,必须综合
平衡粒子系统的效率、速度和可扩充性。在设计粒子系统时,必须避免粒子系统生成大量的多边形。
粒子系统的绘制有不同的方式。例如,在游戏场景中存在多个血迹系统,因此需要绘制的粒子状态有血的喷射、血的溅射、血流和血喷
溅到镜头等4种,每种都需要不同的粒子绘制方
式。血的喷射模拟的是血在空气中飞散的过程,当血碰到墙壁和地板时,粒子变成血的溅射效果。当游戏的角色躺在地板上气绝时,地板上的血的粒子系统就采用血
流的模式。
少粒子系统中内存操作(分配和释放)的一个技巧是当一个粒子消亡后,并不从内存中释放它,而是设置一个可重新初始化的标记。当所有的粒子被设置为消亡后,
再一次性释放整个粒子系统的内存。当一个新的粒子进入后,必须自动完成该粒子的初始化过程。除此之外,还将考虑当粒子系统的行为超过了预先设定的模式时,
可能采取的方法。为了支持粒子系统的可配置性,需要生成一个手工的粒子系统,允许应用程序在每帧更新粒子的属性。最后一个必须考虑的特征是如何将粒子系统
和游戏引擎无缝地连接起来。例如,首先需要将烟系统和场景中的雪茄关联,雪茄又将和抽烟的人物关联。
系统与植被的模拟
戏场景中植被的模拟需要考虑两方面,一是植被的形态,二是植被的外观。多边形表示是游戏场景中最常用的方法,对于可以由几何曲面定义的物体,尤
其是它在屏幕上的投影面积比较大(如近距离阔叶树)时,通常可用多边形进行描述。然而,复杂的自然场景通常包含成千上万株植物,一棵树不同形态、不同方向
的枝条上有数以万计的树叶。尽管基于多边形表示的植被绘制可以采用各种成熟的
真实感图形技术,如Z-buffer深度消隐、光线跟踪方法、光能辐射度方法等,但无法达到游戏的实时性要
求,因此,多边形表示的方法适
用于中、低等复杂度的场景。而对于复杂的游戏场景,必须根据植物形态学做适当的简化和仿真,从而获得利于绘制的植被模型。在游戏引擎中,常用的植被模拟技术有Billboard、粒
子系统和分形系统等三类。三者的特点各异,用法不同。基于Billboard技术的植被模型最为简单有效,因此被广泛采用。基于粒子系统的方法能模拟
自然界植被动态的效果。而分形系统主要关注的是植被的形态,由分形系统生成的植被模型最终需要采用多边形绘制、粒子系统或者Billboard方法进
行绘制法。
粒子系统所绘制的森林是早期计算机绘制自然景物的代表,它用
圆台状粒子组成植物的枝条,用小球状或小立方体粒子组成树叶,只要建立了这些粒子组合或排列的模型,就可以实现对植物形态结构的模拟,粒子在生命周期中的
变化就会反映出植物生长、发育到最终消亡的过程。同时在粒子系统中引入随机变量以产生必要的变化,并选取一些决定性的参数来表达植物的大致形态。为了模拟一棵树,通常需要数十
个参数控制分枝的角度和枝干的长度。粒子系统的一个主要优点是由于其基本组成元素是点、线等易于变换和绘制的图元。但是,粒子系统的设计是一个反复试验和
修改的过程,而且粒子系统的树木造型有比较明显的人工痕迹,可提供的真实感有限。
利用分形植物形态结构的分形性质(结构自相似性)产生植物图形或图像的方
法有IFS(迭代函数系统)法、DLA(受限扩散凝聚)模型法和L系统等。由于L系统最为实用,所以我们将在后面重点介绍L系统。
(1)迭代函数系统
IFS(Iterated Function System,迭代函数系统)由一组能满足一定条件的映射函数Wi(如收缩的仿射变换)及一组变换发生的概率Pi定义:IFSi={(wi,
i=1, 2, …, n}。利用IFS生成植物图像的过程是对初始植物图像按照已知概率选择函数而实施的一种迭
(2)受限扩散凝聚模型
DLA(Diffusion-Limited
Aggregation,受限扩散凝聚)模型的基本思路是:
在一个平面网格上选定一个静止的微粒作为种子,然后在距种子较远的格点上产生一个微粒,令微粒沿网格上下左右诸方向随机行走。如果该微粒在行走过程中与种
子相碰,就凝聚到种子上;如果微粒走到边界上,就被边界吸收而消失。如此重复上述步骤,就会以种子为中心形成一个不断增长的凝聚集团。利用DLA和其修改的模型,可以对部分植物的形态结构进行计算机模拟,如植物根系
的生长过程模拟和海藻类植物的形态结构模拟等。
(3)L系统
植被以树枝为基本元素,植被模型的空间结构分为拓扑结构和几何描述两部
分,拓扑结构表示树枝之间的层次关系。通过层次关系把树枝组织在一起形成一棵完整的植物,其中每一树枝都可以有多个子树枝,也可以没有子树枝。除根树枝
外,每一树枝都有唯一的母树枝。植物的几何结构则定义树枝的空间形状。从宏观上看,植物在其形态结构的组成上有一个共同点,即植物都是由主干、分枝、树叶
这些基元组成的。每个基元的形成又遵守着一个同样的方式,即由主干上分出第一层分枝,再由第一层分枝上生出第二层分枝,这样一层层地分下去,直至树叶。对
植被的生长模拟可提供母树枝生长子树枝的方法,由参数控制植物子树枝的生长,这些参数包括子树枝与母树枝的夹角、子树枝长度收缩比例、子树枝半径收缩比
例、子树枝相对母树枝的空间旋转角以及子树枝的生长模式。对子树枝的生长还需要引入随机控制变量,使子树枝不显得呆板。
在采用“龟解释”文法
串时,可根据不同植物的特点构造其枝与叶的基本几何造型。对于枝的具体构造可按照两条准则进行:分枝的粗细是随分枝节点到主枝节点的距离的增加而减少;分
枝的长度相对于主枝的长度按一定的比例关系缩放。叶的构造可根据植物特点用少量多边形加以模拟。
场景光影特效模拟
6.4.1 &阴影
影是增加场景真实感的一种重要手段,它能暗示
用户场景中物体的遮挡关系、深度提示和光源的数目及位置,如图6-29所示。产生阴影的
物体叫遮挡体,表面不被光源照射的物体称为被遮挡体。阴影可分为全阴影区域
和软影(伪影)区域两部分。全阴影区域是不能被任何光源照见的区域,伪影是被部分光源照射的区域。伪影形成了全阴影区域和全光照区域的光滑过渡,它实际上
反应了光源几何和被光照物体的函数关系。不难知道,场景中如果只有一个点光源,就不会产生伪影。由于阴影区域通常有着对比度高的边界,如果阴影绘制时产生
走样现象,会极大地影响场景的逼真程度。注意到图形绘制流程并不直接支持阴影,但是可以采用一些技巧实现不同质量的阴影。阴影的质量由两个因素控制,其一
是阴影物体的复杂性,其二是被遮挡物体的复杂性。由于软件实现阴影无法达到游戏的实时性要求,因此本节只考虑结合图形硬件加速的阴影生成方法。
图6-29& 阴影带来深度提示
1.平面投影法
面投影法是最简单的阴影生成算法,其主要思想是将遮挡物体沿光源方向投影变形到被遮
挡的平面上,在平面上作为二维物体绘制,绘制结果直接产生了遮挡物体的阴影。图6-30是算法示意图(图片来源:NVidia公司)。
图6-30& 平面投影法示意(左);平面投影法效果图
在图形绘制引擎如OpenGL中,实现阴影的方式是将平行或透视投影矩阵设置到建模和相机矩阵,然后使用需要的阴影颜色绘制这
个物体。下面给出从一个方向光源沿z轴将一个物体的阴影投影到xy平面的过程。
① 正常绘制场景,包括产生阴影的物体。
② 将建模和相机矩
阵设置为单位矩阵后,再乘以一个缩放矩阵,该
矩阵在x、y、z轴的缩放因子分别是(1.0,
0.0, 1.0)。
③ 设置产生阴影物体的其他位置信息。
④ 设置阴影颜色。
⑤ 绘制产生阴影的
在第⑤步,产生阴影的物体被重复绘制了一次,而第②步设置的矩阵将物体压
平成一个平面阴影。这个方法可以扩充到在平坦的物体上投影阴影,只需要在第二步的矩阵中再添加额外的变换。本质上,这种基于投影的方法在被投影面上融合了
一个共面的阴影多边形。而共面多边形的绘制由于精度的原因,会产生走样。解决办法是将阴影多边形稍微沿被投影面的法向方向平移。而光源的方向可以在第②步
之后调用一个剪切变换进行改变。如果在变换中再加一个透视变换,方向光源就可以变成点光源。
平面投影法存在两个严重的局限性。首先,它无法在非平坦曲面上生成阴影,
也不能在凹平面上生成阴影。对于有多边形组成的物体,尽管可以对每个多边形分别进行阴影计算,但是需要对结果进行多边形裁剪操作。部分情况下可以采用模板
缓冲技术辅助完成裁剪操作,因此可以在比较简单的场景,如房间的一角上利用这个方法计算阴影。第二个问题是如何控制阴影的颜色。由于阴影是产生阴影的物体
的投影,而这些物体的法向已经被投影操作扭曲,因此无法正确地计算阴影的颜色。
由于阴影的生成十分耗费计算资源,因此很多游戏引擎中使用简化的阴影生
成。为达到快速的阴影绘制,在计算阴影区域时,根据物体的包围盒来计算。最简单的阴影生成可使用固定大小的阴影区域来模拟,然后根据物体的三维位置直接进
行垂直投影,从而在二维水平面上快速地生成阴影,如图6-31所示。
图6-31& 快速平面投影法示意图
快速阴影生成法虽然速度快,实现简单,但效果比较呆板。为了更真实地模拟阴影视觉效果,在阴影生成中还要考虑:一,阴
影随光源的高度变化,产生缩放;二,阴影的位置随光源的照射角度产生变化。
2.阴影图算法
阴影图是一个预计算的纹理,它保留了光源的各发射方向上与场景物体的最近
距离。在绘制时,计算当前视点下的可见部分与光源的距离,并与相应方向上阴影图保留的距离进行比较,如果前者大于后者,则说明可见点与光源之间存在一个遮
挡点,因而位于阴影之中。阴影图技术分为两个步骤。第一步建立光源局部坐标系,并以光源为中心生成立方体,然后以光源为视点,分别以立方体的6个面为成像平面绘制场景。每次绘制时打开深度缓冲功能,以计算各个方向
上最近点的距离。距离越小,说明场景与光源越近。深度缓冲器中记录的值可以保留在立方体纹理中,从而完成阴影图的构造。第二步以视点为中心绘制场景。对于
成像屏幕的每个可见点,将它投影到立方体表面上,并将阴影图的对应位置保留的值与它到光源的距离(称为光源深度)进行比较,判断出它与光源之间的可见性。
图6-33显示了阴影图算法的大致思想,其中
遮挡物体A比被遮挡物体B更靠近光源,因此在阴影图上保留的是A到光源的距离。在场景绘制时,比较B到光源的距离与阴影图保留的值,从而判断出B位于A的阴影区域。在OpenGL中,可以利用投影纹理和OpenGL扩展函数SGIX_shadow()实现阴影图与场景物体的深度比较。Direct3D也提供了类似的函数。
图6-33& 阴影图算法示意(点画部分表示阴影图)
阴影图算法本质上是一个图像空间的算法,它将场景物体的三维遮挡关系转化
为二维离散的深度比较。阴影图算法的效率由阴影图的分辨率决定,与遮挡物体的场景复杂度无关。静态光源和静态场景的阴影图可以预先计算,并在视点改变时反
复使用。同样,阴影图的分辨率决定了算法的精度,由于图像的离散实质,不可避免地带来走样现象。
3.阴影体算法
阴影体方法的核心思想是将阴影看成阴影体与场景中被遮挡物体的交集。所谓
阴影体,是一个虚拟的物体,即连接光源与遮挡物体的顶点向场景延伸所生成的有限或半无穷锥体,如图6-34所示。不同类型的光源生成的阴影体是不同的。对于点光源,边的延伸是点对点
的。对于无限远处的方向光源,所有的轮廓边延伸为无穷远处的一个点。
图6-34& 阴影体算法示意图(虚线部分为阴影体表面)
(左)、茶壶生成的阴影体(右)
注意到问题的实质是近平面裁剪造成了阴影体不封闭,一种实用的解决办法是
将阴影体中被裁剪掉的朝向视点的面投影,在近裁剪平面中形成替代的封闭阴影体。下面分两种情分析。第一种情况是遮挡体轮廓的所有顶点都位于视域四棱锥内
部,此时对遮挡体轮廓的所有朝向视点的面生成一个四边形包围盒,然后将该四边形作为阴影体的前向面投影到近裁剪平面。第二种情况是阴影体的部分顶点位于视
域四棱锥内部,这时需要计算出视域四棱锥与阴影体的交点,获得封闭的阴影体的朝向视点的顶点。这个方法的缺点仍然是深度值的精度问题,也就是说,由于深度
缓冲的精度误差,近裁剪平面仍然有可能裁剪掉那些用来形成封闭阴影体的新顶点。为了解决这一问题,人们又提出了一种方法,即在视点和近裁剪平面上建立一个
深度差。通常,场景的远、近裁剪距离设置为1.0、0.1,如果在
绘制阴影体时设置深度范围为[0.0,1.0],
并将新形成的阴影体顶点投影在深度值为0.05的
平面上,这样就不会造成深度判断误差。然而,这种方法经常会出现裂缝或“洞”的错误。到目前为止,近裁剪平面的问题还没有完美的解决方案。
是由大气中的不同尺寸的灰尘和水珠等不纯净杂质,反射、散射和吸收等作用引起的自然现象,反映在游戏画面中的结果是光亮度衰减。游戏中的雾是一种特效,它
能够将场景与某种预先设置的颜色融合,给出一种朦胧的雾感。物体距离相机越远,雾的效果越明显。图6-40(图片来源:Direct3D 9.0 SDK)为一个无雾和有雾的场景对比。在几乎所有的三维游戏中都会用到雾化效果来增强场景的纵深感和距离感,给游戏营造气氛。雾的另一
个用途是减少场景复杂度,图6-40左图中的
除前面4根柱子外的其他柱子在雾化影响下是不
可见的,因而不需要被绘制。因此,在游戏中采用雾化效果可以提高效率,引擎只需要绘制一定距离内的场景,在给定距离之外的场景或用环境映射技术进行模拟,
或者用雾来掩饰没有处理的部分,提高逼真度。
图6-40 &一个简单的场景(左)及加雾后的场景效果
雾化效果的基本原理是随着距离的变远,逐渐地体现雾的颜色,直到物体完全
被雾所掩盖。雾化效果的画面颜色生成的公式为Cfinal=f(d)Ccurrent+(1-f(d))Cfog,其中d是雾的厚度,f(d)是雾的计算函数,Ccurrent、Cfinal分
别是雾化前和雾化后的颜色,fogdensity为雾的浓度。描述雾的衰减快慢的4种模式如表6-8所示。
表6-8 &4种实用的雾化模式
与距离成指数关系,具体公式是:
与距离的平方成指数关系,具体公式是:
雾化效果在指定的起点和终点之间成线性关系。比起点更近的地方没有雾化效果,比终点更远的地方完全被雾化。具体计算
距离d的计算有两种模式:基于成像平面的雾和基于距离的雾。
运动模糊和域深
动模糊模拟了相机在场景中快速运动时朦胧的效果,如图6-43(左)所示。它可以在一个高速的动画序列中极大地提高真实感。运动模糊的模拟非常简单,采用的方法是多次绘制欲产生运动模糊效果的物体,每次绘制时递增改变它的位置或旋转角度,并在累积缓冲器中加权平均每次的绘制结果。朦胧的程度与绘制的次数和累积方式有关。
游戏引擎中采用的相机模型是针孔模型,即透视投影模型。由于真实世界的透
镜的成像面积有限,因此只能聚焦场景中有限深度范围的物体。在这个范围之外的物体会逐渐变得模糊,这就是域深效果,如图6-43(右)所示。域深能用来提示玩家与物体的远近关系,因此在第一人称视角
游戏中经常会用到。为了模拟域深效果,可以将相机的位置和视角方向进行多次微小的抖动,每次绘制的结果在累积缓冲器中加权平均。两者的抖动保持步调一致,使得相机的聚焦点保持不变。
图6-43 &运动模糊效果(左)及域深效果(右)
章主要介绍三维游戏的高级图形技术,主要包括高级纹理映射技术、Billboard和Impostor技术、过程式建模与粒子系统,以及阴影、雾、域深等特效的生成技术。游戏编程者可以结合基本的三维图形引擎实现这些效果。最佳的学习方法是打开Doom3、Half Life、QuakeⅢ等游戏,实景体会游戏场景中所使用的各种技术。对于每个小的片断,还可以尝试使用OpenGL
Shading Language或Direct3D
HLSL等高级图形渲染语言给予实现。未来的游戏引擎设计将
会引入可编程图形加速技术。
现环境凹凸纹理映射、法向映射和光照映射技术,比较三者效果的异同。
2. 学习OGRE中可编程
图形硬件中的用法,实现可编程的多重纹理映射算法。
3. 试玩Half Life和CS游戏,总结它们所使用的高级纹理映射技术。
面映射实现OGRE中的天
空盒特效,并添加动态的云层生成特效。
参 考 文 献
[1]& Wolfgang F.
Engel. Amir Geva
LaMothe. Beginning Direct3D
Programming. Prima Publishing, 2001
[2]& Daniel Sánchez-Crespo
Dalmau. Core Techniques and Algorithms in Game Programming. New Riders
Publishing, 2003
[3]& Peter Walsh.
Advanced 3D Game Programming with DirectX 9.0. Wordware Publishing, 2003
[4]& Tomas
Akenine-Möller and Eric Haines.
Real-time rendering(2nd edition). A.K. Peters Ltd., 2003
[5]& DirectX
Microsoft Coperation, 2003
[6]& http://www.ati.com
[7]& http://www.nvidia.com
[8]& http://www.gameres.com
[9]& http://www.gamedev.net
[10]& http://www.gamasutra.com/
[11]& http://www.flipcode.com
[12]& McReynolds,
Tom, David
Blythe, Brad
Grantham, and Scott Nelson.
SIGGRAPH 99 Advanced Graphics
Programming Techniques
Using OpenGL
course notes, 1999
[13]& Harris,
Lastra. Real-Time Cloud
Rendering.
Proceedings of Eurographics, 2001(Vol. 20, No. 3): 76~84
[14]& Meyer,
Alexandre, Fabrice
Neyret, and Pierre Poulin.
Interactive Rendering of Trees with Shading and Shadows. 12th
Eurographics
Workshop on Rendering, June ~195
[15]& Reeves,
T. Particle
Systems A Technique for Modeling a Class of Fuzzy Objects. Computer
Vol. 17, No. 3 (1983): 359~376
[16]& Reeves,
Approximate and Probabilistic Algorithms for Shading and Rendering
Structured
Particles Systems. Computer Graphics, Vol. 19, No. 3 (1985): 313-322
[17]& Oliveira
M., Bishop G.,
and McAllister D. Relief Texture Mapping. ACM Transactions on Graphics,
19, Issue3, July 2000
[18]& Lifeng
Wang, Xi Wang, Xin Tong, Stephen
Lin, Shimin
Hu, Baining
Guo, Heung-Yeung Shum. View
Displacement Mapping.
ACM Transactions
on Graphics, Volume 22, Issue 3, July 2003
[19]& Peter-Pike
Michael F.
Cohen. Interactive Horizon
Mapping. Eurographics Rendering Workshop, June, 2000
[20]& Terry
Welsh. Parallax Mapping with Offset Limiting: A Per-Pixel Approximation
Uneven Surfaces. Infiscape
Corporation, January
[21]& Cass
Everitt and Mark Kilgard.
http://developer.nvidia.com/docs/IO/2585/ATT/RobustShadow Volumes.pdf
[转]&[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 画面最好的游戏 的文章

 

随机推荐