一些游戏用到的渲染技术
DirectX不直观,教您认识游戏图形技术
泡泡网显卡频道2月19日 近年来3D图形技术的发展势头非常迅猛,软件方面游戏的画面和逼真度有了长足进步,硬件方面显卡的更新换代越来越频繁。但始终存在这样一个现象,无论显卡的性能翻多少倍,游戏玩家们总感觉还是不够强大,GPU庞大的运算能力到底被谁吃掉了呢?
答案很简单,游戏为了提高画面质量、更加接近于真实世界,使用了诸多先进的图形技术,特效的“滥用”大幅提升了游戏画面水平,但也抵消掉了GPU性能的增长。
那么最新的图形技术到底能给游戏带来多少的画面改进,对于显卡的需求会有多夸张呢?今天笔者就将主流游戏中使用最广泛的技术提取出来,对其原理和需求进行详细的分析,以飨读者。
其实很多最先进的游戏高级图形技术都包括在了新版本的DirectX API当中,或者说是通过DirectX中的Shader Model新指令集来实现。但这些东西并不容易理解,也不够直观,所以本文反其道而行之,通过肉眼可以看得出来的差别来分析DirectX版本更新对于图形技术的改进到底有多大?
● 游戏中为什么需要模糊处理?清晰一点不是更好吗?
首先请大家思考一个问题:为什么每秒24帧的速度对于电影来说已经足以获得很流畅的视觉效果,而对于游戏来说却会显得磕磕碰碰呢?
原因很简单,摄像机在工作的时候并非一帧一帧绝对静止的拍摄,它所摄下的每一帧图像已经包含了1/24秒以内的所有视觉信息,包括物体在这1/24秒内的位移。如果在看电影的时候按下暂停键,我们所得到的并不是一幅清晰的静止画面,而是一张模糊的图像,问题就出在这里!
传统的电脑3D图像做不到这一点,游戏里的每一帧就是一幅静止画面,如果你在运动的过程中截一张图片下来,得到的肯定是一幅清晰的静态图。
所以,运动模糊技术的目的有二:一是增强快速移动场景的真实感,二是在FPS并不高的时候让游戏显得不是很卡。运动模糊技术并不是在两帧之间插入更多的位移信息,而是将当前帧同前一帧混合在一起所获得的一种效果。
● 基于DX10技术的运动模糊更真实
之前已经有很多DX9游戏采用了运动模糊技术,效果最显著、最夸张的非《极品飞车》系列莫属,很多玩家表示不太适应这种效果,原因就在于打开特效之后画面模糊的太夸张了,时间一长容易头晕——显然,这不是我们想要的运动模糊!
传统的运动模糊技术,游戏只是简单虚化了环境,而对高速运动的物体则仅仅保留运行轨迹而已,这样的前景和背景融合在一起自然效果很差,完全就是拖影和残影,影响视觉体验。
而在DX10模式下,有了全新的几何着色技术,这样就可以使用流处理器资源来计算运动物体的几何坐标变换,然后配合高精度的顶点纹理拾取技术,达到了完美监控整个运动过程的目的。如此一来进行模糊处理的话,就杜绝了不分青红皂白的现象——该模糊的依然模糊,该清晰的照样清晰!
● 代表游戏:《失落星球》、《孤岛危机》、《战争机器》、《生化危机5》
● 为什么要加入景深——模拟镜头和人眼的视觉效果
使用单反数码相机拍照的朋友应该知道,大光圈镜头所带来的背景虚化效果非常好,能够凸出人物和景物,主次分明。其实人眼在注意观察物体时,也会将焦距拉近,主体清晰可见但远景一片模糊,这就是通常所说的景深效果。
3D游戏为了模拟真实,更接近镜头/人眼的成像原理,也将景深引入渲染过程之中。由于3D游戏只是将图像投影在了平面的显示器上,不会有深度,因此想要实现景深效果必须在图像输出之前就进行预处理,把游戏主角以外的远景全部虚化。
● DX10带来更好的景深处理
DX9时代,是通过投机取巧的方式来实现景深效果的,它自动判定距离,将远处景物的纹理、阴影、光照等特效全面缩水,然后再辅以模糊处理,而只对近景做正常渲染输出,这样就会让玩家注意到主角而忽视远景。
而DX10则没有任何的偷工减料,它通过几何着色器,将深度帖图中的纹理信息按照距离拆分到缓冲,然后分为几个不同的视角进行渲染,最后合成完整的图像。因此最终实现的景深效果在特效方面不会有任何缩水,远景完全符合正常的虚化模式,如果仔细观察的话,光影等细节依然得到保留。
● DX11带来更快的景深处理
DX10的景深处理能够实现近乎完美的景深效果,但通过不同视觉渲染的方法还是不够灵活,而且会大大增加GPU后端处理(光栅单元)的负担,产生负载不均的情况,导致性能损失较大。
而DX11则通过DirectCompute中新增的Gather4数据采集指令,使得计算着色器能够以四倍的纹理采集速度,帮助减少GPU纹理单元和光栅单元的负担,从而在进行景深处理时消除了瓶颈,提升渲染效率。
● 代表游戏:《古墓丽影》、《失落星球》、《孤岛危机》、《潜行者》、《战争机器》
● 光栅化渲染的极限——环境光遮蔽
在GPU和CPU有能力进行实时光线追踪(Ray Tracing,按照真实世界光线投射原理反向渲染的技术)之前,环境光遮蔽是当今光栅化渲染模式中最好、最高效的替代方案。环境光遮蔽通过计算光线在物体上的折射、衍射、散射和吸收,在受影响位置上渲染出适当的阴影,进一步丰富标准光照渲染器的效果。
屏幕空间环境光遮蔽(Screen Space Ambient Occlusion,SSAO)是AO的一个变种,它通过对屏幕内进行简单的空间划分,然后进行计算。SSAO的工作原理是:通过采样象素周围的信息,进行简单的深度值对比来计算物体身上环境光照无法到达的范围,从而可以近似地表现出物体身上在环境光照下产生的轮廓阴影。虽然只是模拟实现,但确实能增强场景的层次感,让画面更细腻,让场景细节更加明显。
● DX10.1大大提升SSAO效率
SSAO可以利用“逐象素场景深度计算”技术计算得出的深度值直接参与运算,也可以利用DX10.1当中的Gather4函数实现更快速纹理采样及过滤。DX10模式下开启SSAO性能损失非常大,因此SSAO技术多出现在DX10.1游戏中。通过实际测试来看,DX10.1显卡在DX10.1模式下(如果该游戏支持的话)的性能相比DX10会提升20%-30%之多,从而使得SSAO成为真正实用的技术,而不再是花瓶。
● DX11带来更高清晰度的HDAO
在DX11中,SSAO被进一步升级至HDAO(高清晰),因为DX11中的Gather4函数更加强大,它可针对特定的颜色分别采样,能自动识别能做阴影映射的值,从而实现更快更好的阴影过滤。HDAO和SSAO都能向下兼容旧硬件,但运行速度会打折扣。换句话说,DX11和DX10.1是在改进算法、优化性能的基础上,使得显卡有能力渲染出更复杂、更完美的特效,而DX10虽然在也能达到同样的画面效果,但速度会很慢,实用性不大。
● 代表游戏:《孤岛危机》、《潜行者》、《火爆狂飙》、《鹰击长空》、《帝国:全面战争》、《尘埃2》
● 媲美电影CG画质——镶嵌式细分曲面技术
游戏和电影CG动画,其实都是由计算机渲染出来的,那为什么画质差别那么大呢?这是因为CG动画的模型要比3D游戏复杂成千上万倍,所以CG也要成千上万倍与电脑的性能才能渲染出来,而且还无法实现实时渲染。
3D游戏考虑到家用电脑的机能,模型不可能设计得太复杂,否则就不具备可玩性。但为了让游戏变得更加逼真、达到更高画质,太简单的模型的确拿不出手,那么有什么方法既能大幅提升模型复杂度、又不至于给显卡造成太大负担呢?Tessellation技术就是为此而生的。
简单来说,Tessellation是一种能够在图形芯片内部自动创造顶点,使模型细化,从而获得更好画面效果的技术。Tessellation能自动创造出数百倍与原始模型的顶点,这些不是虚拟的顶点,而是实实在在的顶点,效果是等同于建模的时候直接设计出来的。
实现相同的模型细节,Tessellation显然比直接建模更快更高效
除了大幅提升模型细节和画质外,Tessellation最吸引程序员的地方就是:他们无需手动设计上百万个三角形的复杂模型,只需简单勾绘一个轮廓,剩下的就可以交给Tessellation技术自动镶嵌,大大提高开发效率;而且简单的模型在GPU处理时也能大幅节约显存开销,同时大幅提升渲染速度!
● Tessellation的妙用
Tessellation技术的原理很简单,就是把简单的模型智能的镶嵌成为复杂模型,使得游戏中的景物变得更加细腻真实。实际上除此之外Tessellation还能实现一些令人意想不到的功效:
DX11代表作《DiRT2》就大量使用了Tessellation技术,它用Tessellation构建了动态水面、动态布料旗帜和观众人物模型,其中加强人物模型不难理解,而动态水面和布料效果足以媲美物理加速,让人惊讶不已!
Tessellation(细分曲面)水面效果对比
Tessellation(细分曲面)布料效果对比
虽然XBOX360和ATI的全线DX10显卡都支持Tessellation技术,但支持Tessellation游戏并不多,随着DX11将Tessellation作为一项重要技术纳入API规范之后,未来DX11游戏都将会支持这一技术,但由于DX11中的Tessellation和DX10/DX9版本有很大的区别,因此并不会向下兼容,Tessellation只能通过DX11显卡在DX11游戏中才能实现。
● 代表游戏:《潜行者:普里皮亚季的呼唤》、《科林麦克雷:尘埃2》、《异形大战铁血战士》(即将发布)
● 动态逼真——物理效果的实现
3D游戏中“物理”指的是什么呢?简言之就是模拟真实世界中的物理定律,使得运动物体产生一些复杂的交互性干涉,从而改变形状、轨迹或状态的一种技术。比如:流体(水、烟、雾)、碰撞、变形、爆炸、毁坏、布料、碎片……物理技术虽然属于图形技术的一种,但所涉及到的运算并非是图形渲染,而是大量的并行计算,等结果算出来之后才会进行后续的渲染操作。
这里为什么要强调GPU物理加速呢,因为CPU物理加速其实早就进入实际应用阶段,但由于CPU性能有限(或者说CPU并不擅长做物理运算),大多数游戏仅采用了少许简单的物理效果作为点缀,未能给玩家带来视觉上的震撼力,也就容易被大家所忽视。比如《半条命2》系列游戏都使用了物理技术,在击穿木板或爆炸时会有一定的破坏效果,但如果不特别指出的话您可能注意不到。
Crysis爆炸时的物理效果不错(CPU加速),但在场景毁坏与交互方面略有不足
● 物理引擎并不是只有PhysX一种,但只有PhysX支持GPU加速
除了CPU外,还有专用的PPU(即物理加速卡)来进行物理运算,但随着GPU进入DX10时代,并行架构的流处理器拥有比PPU和CPU更强大的浮点运算能力,GPU物理加速技术被提上日程。终于,在NVIDIA收购Ageia公司之后,通过CUDA技术将PhysX物理引擎重新编译了一遍,使得GeForce 8以上的N卡都能够支持物理运算,通过大量的测试来看,即便是低端N卡的物理加速能力也要比专用的物理加速卡强,CPU跟它根本不是一个级别。
就拿最近比较热门的《蝙蝠侠:阿卡姆疯人院》这款游戏来说,是否开启PhysX有着天壤之别,PhysX能够让蝙蝠侠的披风更拉风、地洞中的雾气在人经过时产生互动、地面上的碎片和纸屑在打斗过程中飞舞、地板砖桌椅墙壁都有可能被打碎、布料和旗帜随风而动……
物理引擎也不是只有PhysX一种,已经被Intel收购的Havok也提供了很不错的物理解决方案,但目前支持GPU加速的还只有PhysX这一种,由于GPU拥有很强的运算能力,因此PhysX引擎所实现的物理效果最为出色,但对显卡的要求也很高。
开启PhysX之后是十分消耗资源的,GTS250以下级别的显卡性能损失特别大,最好是能安装一块额外的显卡做专门的物理加速运算,而GTX260+以上级别的显卡则可以同时处理图形渲染和物理加速运算,能够保证不低于30帧的速度。至于A卡则不支持PhysX加速,强行开启的话只能使用CPU进行运算,效率自然非常低下,不过使用A卡做渲染N卡做物理加速也是个临时解决方案。
● 代表游戏:《虚幻竞技场3》、《镜之边缘》、《雪域危机》、《蝙蝠侠:阿卡姆疯人院》
● 大名鼎鼎的HDR技术再次缩水
HDR(High Dynamic Range,高动态范围光照)技术相信很多人并不陌生,想当年DX9C SM3.0面世时,正是凭借HDR技术一举成名,HDR所带来的绚丽光影效果给玩家极强的视觉震撼,但却产生了很多负面效果,这些历史遗留问题时至今日都没有得到完美解决。
几乎所有的图形技术都是随着时间的推移来进一步增强效果,只有HDR被一而再再而三的“缩水”,这是为什么呢?
● DX9C时代HDR与AA水火不容
HDR技术通过采用浮点格式的颜色代码来为纹理、光照等计算提供极大的精度和颜色范围(以前的纹理一般都是采用整数型的颜色格式)。尽管最后显示到屏幕上还是每个颜色通道8位的整数格式,但是以前的材质、光照计算中纹理也是用每通道8位的格式来参与计算,所以在显示到画面之前,很多细节就在低精度的运算中丢失了。
HDR效果虽然很美,但在DX9C模式下进行16位浮点(FP16)运算时,会占用到原本属于多重采样抗锯齿(MSAA)的缓冲区域,使得游戏开启HDR后无法进行FSAA处理。当年的一大批DX9C游戏都是如此,比如《孤岛惊魂》、《细胞分裂》、《虚幻3》引擎的全系列游戏。
● ATI X1000和XBOX360是个例外
ATI的DX9C显卡发布较晚,因此在设计之初就考虑到了HDR+AA的需要,整合了额外的缓存,只要通过游戏或者驱动重新指定另外的缓冲区,就能完美支持HDR+AA效果,所以X1000系列和XBOX360主机都能支持HDR+AA。
不过ATI的HDR+AA方案并不是业界标准,还是有不少游戏无法同时开启HDR和AA,通过驱动强行更改缓冲区的方式和一些游戏有兼容性问题,ATI官方都不认可这种做法。
● DX10时代,新增两种HDR颜色格式
为了解决困扰业界已久的HDR+AA问题,微软在DX10当中加入了两种新的HDR格式,对每个颜色通道16位浮点数的格式进行删减,第一种是R11G11B10(红色绿色各11位,蓝色10位,总计32位),另一种是红绿蓝各9位共享5位指数(计算机中浮点数是尾数附加指数的形式来表示)。
新增的两种HDR格式都只有32位,而并非DX9C时代的48位(FP16x3),所以动态范围精度有些下降,但好处就是新的HDR不会与MSAA抢占缓冲区,所消耗的显存也大大减少,效率和兼容性提高,至于光影效果的缩水其实很难看出来。
● DX11时代,新增HDR纹理压缩技术
HDR除了不支持抗锯齿外,还不支持纹理压缩技术,因为HDR在设计之初的要求就是光照和纹理都必须保持高精度。随着时代的发展,游戏的分辨率越来越高,纹理贴图越来越精细,而纹理贴图如果不经压缩就放在显存里面的话,容量是相当恐怖的,因此新一代的游戏显存消耗成倍增加,这其中罪魁祸首其实还是HDR技术。
为了解决这个显存消耗大户,在DX11当中又新增了一种专为HDR设计的纹理压缩格式:BC6H,压缩比高达6:1。
上图展示的是图像通过BC6H压缩模式进行压缩的前后效果对比图。其中左边的图像为原始图像,中间的是在压缩过程中损失的一些细节,而右边的就是压缩后的图像。可以看出,从画质上来看几乎没有损失(肉眼看不出),但是却可以大幅度降低显存的占用。
经过了DX9C、DX10和DX11三代API,HDR技术在神不知鬼不觉的情况下被两次“缩水”之后,才真正走向成熟,由此可见好的图形技术不光是要效果出色,更重要的是拥有高效率和实用性,才能被更多的游戏所接受,被更多的显卡所支持。
● 代表游戏:几乎所有主流游戏都有使用HDR效果,时至今日依然有一些采用虚幻3引擎的游戏无法同时开启HDR和AA,需要通过修改的方式实现
● 传统纹理贴图的弊端
纹理贴图大家都明白,就是往建好的3D模型上“贴”一些二维的画面,让人物显得更真实一些,比如常见的砖墙、凹凸不平的地面等,这些如果全部用三角形来实现的话,那么模型就会非常复杂,GPU将会不堪重负,但如果用“一张已经画好砖纹的纸”贴上去的话,那么渲染起来就会轻松好多。
但是这么做也有很大的缺点,贴图毕竟是2D的,如果在游戏中换个角度看的话,很容易就会发现墙面没有任何立体感,砖纹看上去非常假!为了让2D贴图看上去也有3D立体效果,就诞生了多种贴图技术,比如凹凸贴图、法线贴图、位移贴图、视察映射贴图等。
● 凹凸贴图
凹凸贴图技术简单说起来是一种在3D场景中模拟粗糙表面的技术,将带有深度变化的凹凸材质贴图赋予3D物体,经过光线渲染处理后,这个物体的表面就会呈现出凹凸不平的感觉,而无需改变物体的几何结构或增加额外的点面。例如,把一张碎石的贴图赋予一个平面,经过处理后这个平面就会变成一片铺满碎石、高低不平的荒原。当然,使用凹凸贴图产生的凹凸效果其光影的方向角度是不会改变的,而且不可能产生物理上的起伏效果。
凹凸贴图在今天看来已经是老的不能再老的一种技术了,虽然能够获得凹凸的效果,但是凹凸的程度非常受限制,基本上只能做出一些简单的浮雕效果来。这种技术通常用在一些观察视角变化很小的情况上,例如地面,墙壁,远处的一些模型等等,如果角度稍微一大,你就会发现那些凹坑其实是根本不存在的。
● 法线贴图
法线贴图就是把一个表面的凹凸情况用每个点的法线向量记录下来,在贴图的时候根据法线贴图做光影的变换,从而实现凹凸效果。
法线贴图比起凹凸贴图而言,能够实现的效果更好了,相对的就是运算量更大了,需要大量的纹理材质,每个象素的光照情况都需要计算这个点的法线向量和光照情况的夹角计算该点的亮度和颜色。为了节约GPU资源,ATI曾开发了3DC+纹理压缩技术,这对于法线贴图有莫大的帮助。
当然,法线贴图技术同样不是完美的,它也有着自己的不足,凹凸贴图没有能够解决的切向效果问题肯定是仍然不能够得到解决。此外,就是法线贴图技术不能够解决解决更大的凹凸情况的效果。大家如果去观察的话,法线贴图效果能实现的通常是一些内凹或者外凸不是很严重的表面效果。
● 视差映射贴图
为了解决法线贴图在处理较深内凹之时不能够达到的弊端,诞生了新的视差映射贴图技术。该技术其实称之为视差遮蔽贴图似乎更容易理解一些,因为它会对纹理的坐标做变换,一些凸出的纹理会遮蔽到其他的纹理,这样就会看起来具备更好的凹凸的感觉了。
ATI X1000 Demo中就包含了视察映射技术
正如我们在上图看到的情况一样,地面上的石块的凹凸感觉非常好,前面的石块已经对后面的石块进行了局部的遮蔽。虽然这个Demo中的砖块依然很假,但砖块之间凹凸的效果已经得到了完美体现,非常遗憾的是,没有任何一款DX9游戏使用过这种视差贴图技术。
● 直到DX10时代才大量使用视差映射贴图技术
视差贴图技术的实现原理,其实和法线贴图是一样的,都是根据法线贴图进行的处理,所以我们可以把它当作是法线贴图的一种衍生技术。视差贴图技术的实现是和硬件没有必然联系的,这个技术概念的诞生其实也非常早,只是未能得到大量使用,这是因为视差贴图技术的运算量要比法线贴图大了不少,原来的显示芯片因为性能有限基本都运行不了。
最早使用视差映射贴图技术的游戏叫做《狂野西部》,首批DX10游戏之一,DX9版本不支持。由于DX10显卡都采用了统一渲染架构,可以方便的集中利用Shader资源,来渲染出复杂的特效。再加上有全新的几何着色器辅助,因此特效的运用方面可以更加灵活,游戏开发商可以很容易的自定义一些特效渲染方式,所以将先进的技术都安置在DX10模式之中也是无可厚非。
● 代表游戏:《狂野西部》、《孤岛危机》、《潜行者》
游戏中所使用的图形技术动辄数以百计,即便是像3DMark这样简短的测试程序中,也包含了数十项先进的、甚至是独创的渲染技术,有些技术甚至连一个像样的名字都没有,而真正能得到广泛使用、被3D游戏爱好这所熟知的技术,确实是屈指可数。
Crysis的画面之所以如此完美,是因为几乎所有的高级图形技术它都有所使用
所以,本文只是有选择性的介绍了一些知名的、肉眼看得出差别、能明显提升游戏画质的图形技术,其实在这些风光无限技术的背后,还有很多默默无闻的、用以提升渲染效率的辅助技术。
而且,这些图形技术也不是一朝一夕就能得到程序员的青睐、并获得游戏玩家的认可,比如HDR技术时至今日依然存在兼容性问题、动态模糊和景深经过三代API的改良效果才令人满意、Tessellation技术更是经过六代七年的发展才修成正果!
每一代图形API的革新,一方面是加入新的特效、让画面变得更完美,另一方面是通过新的指令提升运算效率。显卡进入DX10时代后,画面已经达到了巅峰,很难再有较大的突破,因此后续的DX10.1和DX11都主要是为了优化算法,使得游戏运行更加流畅,也有利于游戏开发者使用更多、更强的图形技术,营造出更逼真的3D画面!