通吃游戏:画质速度通吃 浅谈为游戏而生的SM3技术(Dx9的一些技术) -ok

DX9发布已经相当长一段时间了,由于DX9对游戏开发的好处显而易见,因此现在有越来越多的游戏支持DX9,不过DX9在这一期间并非一层不变。

在NVIDIA从GeForce3时代引入硬件可编程概念以来,正在吸引着大量的程序开发人员投身到顶点和像素着色器的编写中。到DX9时期,多顶点的概念已经变得越来越深入人心,而且采用多顶点能够描绘出更加逼真的游戏画卷

而就在开发人员的进一步深入挖掘多顶点编程的潜力时,其不足之处也悄然浮现,那就是指令数的局限。在拥有更复杂语句和更多功能的shader程序往往受限于最大指令数的限制,从而不得不让更多激动人心的特效胎死腹中,因此微软公司在其后发布的DX9C中具体对此问题作了解决。

 

从上表中我们可以看到,DX9的shader model 2.0仅支持最大vertex shader指令数为256个,pixel shader指令数为96个。在最新的shader model 3.0中指令数都上升至65535个。另外shader model 2.0最低shader精度为FP24,而shader model 3.0为FP32。在某种程度来说,采用SM3对于程序编写的长度限制已经完全取消。

游戏开发人员能够利用这一优势开发出更加复杂的shader程序。在游戏《孤岛惊魂》中就表现得相当突出。毋庸置疑,《孤岛惊魂》在图像效果上达到了现在 PC 游戏的最高成就。游戏中的所有事物看上去都令人惊叹,拟真程度达到空前水平。丛林场景是由高大的乔木、灌木和高的草本植物组成,显得错落有致,其间散布着美丽的小鸟和昆虫。还有漂亮的白沙覆盖的海滩,海浪温柔的在沙滩上徘徊。

角色的模型也是我们见过游戏中最为出色的,刻画细腻而且非常生动。游戏还加入了以前游戏少有的实时光影特效,当你在丛林中漫步的时候,可以看到头顶上的树叶在你的步枪上实时投下斑驳的阴影;在一些宏大的室内场景里,身型巨大的怪物的影子投射在你身边的墙上,预示着它的到来;熔岩场景中熔岩口上方的腾腾的热气模糊和扭曲了后方的影像。

虽然该游戏运用了当今最先进的DX9技术,能够给玩家最精致的图片质量,但游戏应该改进的地方还有很多,特别是游戏对计算机硬件的高要求上,更是让绝大多数的低端用户望而却步。由于游戏频繁地使用到像素着色引擎和顶点着色引擎,因此没有一款性能强劲的高频显卡是难以流畅运行游戏的。

总的来说,GeForce FX系列显卡在孤岛惊魂中表现较差,而相比之下RADEON系列显卡则有更好的发挥,但在GeForce 6800发布之后,率先支持SM 3.0的特性,让GeForce 6800成为此款游戏的最佳搭配。但游戏过高的入门门槛让此款游戏很难大规模推广,能不能够找到一种在不降低游戏画面质量的前提下,提高游戏的运行速度呢?这就是我们这篇文章讨论的主题,SM3中的性能改进特效。


在很多人眼中,游戏质量和游戏运行速度是永远成反比的。如果游戏质量越高,那么受限于计算机硬件水平,因此游戏运行的速度也就越慢。

在以前来说,这一观点是完全正确的,不过在如今的SM3却给我们提供了两全其美的解决方案,能够在不降低游戏画面质量的前提下,提高游戏的运行速度。不过在进一步探讨SM3怎样对游戏性能提升问题前,先让我们来了解相比于SM2,SM3究竟给我们带来了那些激动人心的功能,以及哪些功能对我们今后的游戏会产生影响。

SM3.0

取消指令数限制

从像素着色1.x开始,每一个版本的提升,都会对指令数量作出新的规定。面对日益复杂的shader程序,从PS2开始,所支持的指令数量就开始有较大幅度地提升。不过这并不能够完全满足开发人员的需求,于是在DX9B中出现了PS2的扩展版。

不过扩展版除了在原有的PS2规格基础上将最大指令数上限提升到了512条指令外,并没有增加其它的功能,因此人们多认为PS2扩展版仅仅是为X800系列产品所准备的,对于整个业界来说影响微乎其微。不过这似乎预示着从PS2开始,游戏开发就将进入到复杂shader程序时代,就DOOM3所展示的demo来看,简单的shader程序几乎难以完成如此眩目的光影效果。

同时复杂的shader程序也让早期产品的GPU/VPU处理性能受到较严峻的挑战。为了满足未来游戏开发的总总需要,微软在最新发布的DX9c规格中,明确定义了PS3的最大指令数为65535,而最小指令数也为512个,最小指令数意味着GPU/VPU所必须能够处理的指令数,这样对显卡速度提升有了新要求,同时也保证了复杂shader程序能够流畅的被执行。

开发出高级语言HLSL

除了取消上限指令数对shader程序的影响外,越来越复杂的shader程序编写本身也是对开发人员的一种考验。由于shader程序类似于枯燥无味的汇编语言,而且在PS3之前,shader程序编写没有循环或分支等其它编程语言中非常常见的功能,也让shader程序的复杂性和可读性受到了较大的抑制。

因此微软在发布SM3时,还推出了一款类似于C++的针对shader程序编写的高级编程语言HLSL,众所周知汇编语言晦涩难以理解,因此如果采用微软的HLSL语言,可以极大地提高开发人员在编辑shader程序的工作效率。其实这一问题早已存在,因此NVIDIA在早些时候就已经针对此问题推出了自己开发的Cg/C for Graphics高级语言,以及OpenGL推出的OpenGL shader language,叫做GLSL或者叫做GLSlang。

这些高级语言的推出都是为了提高开发人员的工作效率,而微软在DX9中加入HLSL语言对整个业界来说无疑意义重大,因为HLSL可能在今后作为标准shader程序开发语言,让无论是采用GeForce还是RADEON的开发人员都能够利用这一优势。

Dynamic branching(动态分支技术)

另外DX9C带给我们的还有一项动态分支技术。微软的一篇技术文档对此项技术大加赞赏,认为此技术的合理利用能够极大地提高游戏的执行速度。听起来似乎不错,让我们来看看其具体是怎样操作的。在动态分支技术中,允许程序员在自己的shader程序中加入循环和条件语句,让一条简单的程序具有更高的灵活性。

这适用于控制操作执行的控制类语句,普通的循环语句如for,while和do,普通的分支语句如:if,then。在程序中当条件为真,循环部分的代码被重复执行;当条件为假,循环停止,程序继续循环下面的语句。而分支语句就像是一个“跳出命令”。在通常情况下,计算机都是顺序执行程序,但有了分支语句后,程序员就能够控制程序的运行了。

能够控制程序的执行这一点非常重要,例如用循环分支语句编写一束顶点光源的程序,首先决定在这一束顶点光源中,有哪些特定的光源能够被利用到,然后将这些光源传送到像素着色器中,用既定的光源参数进行渲染。采用动态分支能够让像素着色器有选择地处理有用的光源,而不是像以前一样,将所有的光源全部处理,这样将大大节省处理时间。

再如同大多数场景下物体可见部分都是面向光的那一部分。因此程序员可以使用分支语句跳过处理那些远离光源或者背向光源的部分,从而有效地节约了处理时间,并且在游戏的画质上面并不会因此而降低。


另外由于受限于PS2对于程序段长度的限制,因此程序人员在创建游戏引擎时都将一段复杂的程序分解成多个顶点shader程序或象素shader程序。这样游戏在执行时就会处理多个shader程序段,而降低其效率。而在SM3中,采用易于理解执行的循环/分支语句能够让开发人员将所有的小段shader程序都写入一个单个的顶点shader程序或象素shader程序中,在其中适当的采用静态和动态分支语句,在计算机在条件满足时刻执行指定的操作,能够大大提升游戏的运行速度。当然这也是在不牺牲游戏画质的前提下。

判别技术

判别技术应该说是前面介绍的动态分支的有效补充,能够进一步降低shader的处理时间。是否采用判别技术的前提是,是否遇到错误数据和正确数据并存的数据流。如果触发判别技术,计算机会自动将所需要的正确数据发送到流水线上,而拒绝其他错误数据的请求。

应该说此项技术和以前的预测技术有所类似,不过预测技术是将数据流发送到GPU内,由GPU推测执行,但整个数据流都会被处理(不管是正确的数据还是错误的数据),而判别技术只发送正确的数据到流水线,不用处理整个数据流。虽然在进行判别过程需要花费较多的GPU运算资源,但理论上来说这种技术比预测技术更有效率。

几何实例技术

当前,游戏说面临的主要局限就是显示场景内数量众多的相似对象。这不单纯是显卡处理能力的问题,而且要求处理器在短时间内处理大量的只在小地方上有些许不同的对象的确有些苛刻。例如要用树构建一片森林,每一棵树大体上都是相似的,但是树与树之间位置不同,高度不同,枝干的长度不同,树叶的颜色不同等等。

在以前,开发人员为了达到逼真的游戏画面,通常采用独自拷贝所有的树木,即使两者之间仅有些微的差别。然后为了达到不同的位置感,高度和颜色,需要重新渲染,旋转,对比等等手段,就是为了来营造逼真的场景。这样一来对系统的要求无疑非常高。

在SM3中,采用几何实例技术,能够让程序员只存储一棵树和一些定义不同模型之间颜色、高度、分枝长度的顶点数据流,就可以达到以往需要非常复杂手段才能够创建的场景。例如存储一棵其中包含了它的顶点位置和默认信息,具有1000个顶点的树模型,以及具有它位置,颜色,高度和分支长度值的200个顶点数据流。

开发人员只需要建立一棵树的模型,然后渲染出200棵树,由于此时采用了基本树模型的数据,因此每一棵树都是一模一样的,然后再将储存在其中的定义不同树状态的顶点数据流应用在上面,就成功的建立了森林的场景。这对于提升游戏执行速度具有非常重要的意义。

置换贴图

顶点材质查找(Vertex Texture Lookups)是Shader Model 3.0的主要进步之一,通过它可以实现置换贴图这样的功能。Shader Model 3.0和Shader Model 2.0之间可能存在的画质差异主要是由置换贴图的使用造成的。目前被广泛应用的凹凸贴图能够给人以物体材质高低不平的幻觉,但是材质本身仍然是平的,如果贴近物体观看就会显得很假。

由于材质本身是平的,这也造成光线和阴影不能准确反射。通过处理材质的高度,置换贴图实际上增加了物体表面的细节程度;置换贴图甚至能够自行创建模型。置换贴图能够大幅度提高游戏画面的拟真程度,如果开发人员熟悉了该技术的使用,我们将从使用Shader Model 3.0的游戏和使用Shader Model 2.0的游戏画面中看出明显的区别。

孤岛惊魂(FarCry)中的应用

可以看出SM3的推出主要是为了改善游戏的执行速度,过度依赖于计算机硬件的发展,而忽略了软件的优化的确是以往SM发展过程中的缺陷,因为这将导致游戏的入门门槛过高,而对游戏的推广产生不利的影响,毕竟不是每一位玩家都愿意为了一款游戏去升级自己的设备吧。

而有着精美画面的孤岛惊魂则是其中的“佼佼者”,但很幸运,此款游戏的开发公司CryTek已经看到这这一点,而且推出了1.2游戏加速补丁来改善游戏的执行速度,这个基于SM3的游戏加速补丁这是利用了我们上面所介绍了SM3的种种新功能来实现不降低画质的游戏提速。现在就让我们来看看,1.2补丁中运用到了哪些功能。

几何实例的运用

在前文中介绍几何实例的时候所举的例子是森林场景的创建,而在孤岛惊魂中则是草地渲染的运用,原理和前面介绍的一样。而且草地中单一物体草的数量也要比200棵数多得多,因此用以前PS2的方式创建一个草地则对性能的要求相当高,而FPS(第一人称视角射击游戏)游戏是对帧率稳定要求很高的游戏,如果在草地上的帧率远低于平常场景的帧率的话,玩家就会觉得此场景不具备游戏性而舍弃它。因此提高游戏执行速度的同时,也是在提高游戏的可玩性哦。

渲染方式的改变

在孤岛惊魂中,用单通道渲染代替了在PS2中所用到的多通道渲染。这样一来就节约出了宝贵的渲染通道。在PS2中,每一个光源的渲染都是用到一个渲染通道,虽然能够取得不错的效果,但是却大大加重了渲染通道的工作,也让具备更多渲染管线的显卡(X800XT)在测试中得分较高,但对于目前普遍采用4根渲染通道的中端显卡来说无疑是一个巨大的挑战。
正由于渲染通道在游戏中日益重要的地位,也就成为显卡生产商区分不同市场区段产品的标准之一。因此改变渲染方式对于大量中低端显卡用户来说无疑是一个好消息,使得他们也能够体验到光影俱佳的游戏效果,再显卡推陈出新速度如此快速的今天显得更有意义。

结语

不过孤岛惊魂的游戏优化工作显然还有空间,因为SM3中提供的很多优化功能如动态分支和判别技术等等,都还没有使用。而CryTek对于游戏速度的大幅优化,同时也对其他如毁灭公爵3和半条命2等即将登台亮相的高配置游戏提供了更多的借鉴的地方,同时也让玩家明白游戏品质和游戏速度原来是可以兼得的。

SM3可以说是在SM发展历程中的重要转折点,让纯粹追求画质转变到同时重视游戏速度。可以看到在SM3中,取消指令数限制和置换贴图等新特性之外,更多的特性都是在解决游戏的执行速度上下功夫。这一点不仅能够让更多的玩家接触到新一代的游戏,同时也让人们对软件优化对游戏执行速度的重要性有了更加深刻地了解。

相关推荐

相关文章