挑战游戏画质极限——Shader Model深度分析

技术空间

Shader Model在PC游戏和显卡的发展史上扮演了非常关键的一个角色,它彻底解放了显示芯片,使得技术人员可以用它去创造接近真实环境的3D世界。换句话说,逼真的场景、细节的毫发毕现、像看电影那样玩游戏已成为现实。无怪乎人们开始把Shader Model版本的高低当作衡量显示芯片价值的重要指标之一。

在Shader Model发展史上,从SM 1.0进化到SM 2.0称得上是真正意义上的技术革命,后者赋予了显示芯片强大的能力,人们在游戏中也领略到前所未有的视觉体验,例如水面光影和雾化等特效的出现使游戏场景更真实。相对而言,SM 2.0到SM 3.0的改进不如SM 1.0到SM 2.0的变化大,SM 3.0除了支持32bit浮点运算是亮点外,其他特效用SM 2.0也可以完成。例如,GeForce 6系列显卡上市时曾大力宣传SM 3.0和HDR(高动态范围)技术,这无形之中就给人一种SM 2.0不能实现HDR或者HDR效果差的错觉。其实在《半条命2∶失落的海滩》中,我们发现使用SM 2.0b的Radeon X800显卡对HDR的支持就很好,只不过SM 2.0的先天不足限制了这些特效的应用罢了。

我们不可否认,SM 3.0的诞生让微软彻底统治了娱乐图形领域。尤其是它更新了统一的渲染语言——全新的HLSL高级程序语言,这大大简化了3D程序的编写工作,同时公正的态度使得程序员不必为NVIDIA或ATI单独考虑优化措施。微软通过DirectX和HLSL从根本上控制了图形技术未来的发展方向,而NVDIA和ATI为了取得更大的市场份额,不得不全力支持。因此从某种意义上来说,真正统治娱乐图形领域的霸主不是NVIDIA,也不是ATI,而是微软。小编这里建议现阶段想购买显卡的游戏爱好者,最好选择支持SM 3.0的产品,因为采用SM 3.0特性的游戏会越来越多。

毋庸置疑,游戏永远是以显卡为首的电脑硬件更新换代的“催化剂”。随着《分裂细胞3》、《孤岛惊魂》(即FarCry)、《帝国时代3》、《使命召唤2》等支持Shader Model 3.0游戏的陆续问世,GeForce FX系列或Radeon 9500系列之前的显卡也面临着“下岗”的命运。究竟什么是Shader Model?它给游戏带来了哪些变化呢?

Shader Model带来可编程革命

经历过S3 Trio64时代的DIYer一定还记得,当时所有的游戏都运行在DOS实模式下,3D游戏要调用这些特效必须借助显卡厂商特制的API(应用程序接口)才行。为了在竞争中取胜,显卡制造商开始疯狂地为产品增加各种硬件特效,如Alpha混合、平面着色、透明化处理等等。

这样的特效竞赛持续没多久,人们便发现,无论怎么增加特效都不能满足游戏开发者的需求。而且由于缺乏统一的API,无法充分利用纷繁复杂的特效。当时的游戏为了尽量支持市场上的各种硬件,不得不同时为每一块显卡准备相应的执行程序,这对游戏开发商来说无疑是个噩梦。为了使显卡发展摆脱特效竞赛的怪圈,设计一款能自由编程的显示芯片便成了研发人员迫在眉睫的任务。不过,在实现可编程之前需要统一的API。好在微软的DirectX开始逐步成熟,OpenGL也已相当完善。显卡制造商们只要直接使用这两种API就能实现所有的硬件功能。

GeForce 256的诞生拉开了GPU时代的序幕。由于在GPU内部首次引入T&L(几何转换和光照处理)引擎,因此使得显示核心能够更快地实现各种复杂的运算,而相应的DirectX 7也在3D应用中开始扮演越来越重要的角色。既然摆脱了CPU的依赖,显卡就有了实现可编程的基础,伴随着DirectX 8的发布,GeForce 3系列产品首次向世人展示了GPU的可编程能力,吃力不讨好的固定特效时代一去不复返。

什么是Shader Model

在3D图形领域,Shader被称为“渲染引擎”或“着色器”,Shader Model(以下简称SM)就是“渲染引擎模式”了。事实上,Shader是一段能够针对3D对象进行操作、并被GPU所执行的程序。通过这些程序,程序员就能够获得绝大部分想要的3D图形效果。在一个3D场景中,一般包含多个Shader。这些Shader中有的负责对3D对象表面进行处理,有的负责对3D对象的纹理进行处理。

早在微软发布DirectX 8时,Shader Model的概念就出现在其中了,并根据操作对象的不同被分为对顶点进行各种操作的Vertex Shader(顶点渲染引擎)和对像素进行各种操作的Pixel Shader(像素渲染引擎)。

小知识

Vertex Shader(以下简称VS)

三角形是构成3D世界的基本图形单位,而每个三角形都是由若干线段连接而成。在两条线段的交界处就会形成一个顶点(Vertex)。VS的作用就是定义这些顶点的属性,比如颜色、光照、贴图纹理等。开发者通过指令来控制这些顶点属性值的大小,从而得到变换无穷的效果。

Pixel Shader(以下简称PS)

尽管顶点是3D世界中的基本构成元素,但是要将图形显示在2D屏幕上,最终所有的顶点都将会变成像素。而PS正是为了控制屏幕上所有的像素而产生的。通过PS,程序员能够随意定义画面中单像素的光照、阴影、颜色等参数。

07-d15-01.jpg
用VS实现的图形效果

对于游戏程序员来说,SM简直就是他们的救星。由于SM统一了各种函数的使用和变量等参数,因此程序员再也不需要根据每一款显卡编写不同的程序,也不用担心各款显卡由于硬件支持特效的差异而出现运行错误。更让他们振奋的是,在编写Shader时甚至可以不借助任何厂商提供的开发工具,也不必为每款产品学习相应的编程方法。SM允许程序员用标准的汇编语言,甚至是HLSL(High Level Shader Language,高级着色语言)来编写Shader程序,这样不仅大大地加快了游戏开发速度,还明显减少了游戏调试时间。

Shader Model的进化

1.稚嫩的SM 1.0

微软在DirectX中定义了Shader的最大指令长度、指令槽数目、指令操作的精度等内容。这是一套显卡制造商和游戏开发商都要共同遵守的规范。支持新的SM往往意味着可以使用更新、更好的软件编程方法,得到更多的特效。这点在本质上和升级Windows系统是一样的。不同的是,SM更依赖于GPU/VPU,离开硬件的支持,它将英雄无用武之地。

在DirectX 8中,微软首次引入了PS和VS,而且DirectX 8中所包含的Shader定义就被称作SM 1.x。第一代SM尽管实现了对GPU灵活编程的目标,但由于一些细节的不合理和开发难度较大,导致了当时许多新游戏并没有提供对SM 1.0的支持。另一方面,初期的SM还有着很多无法克服的缺陷,例如SM1.0顶点渲染指令最多不超过128条,像素渲染指令不超过96条,而且只能提供整数精度的操作、执行效率低下等。

2.成功但不完善的SM 2.0

经过两年多的研发,微软终于推出了DirectX 9。而SM也随之升级到了SM 2.0。SM 2.0的VS提供了256条指令(SM 2.0b中,这个长度进一步提高到512条),而静态流控制等功能的引入,也让程序员在开发Shader时有更多的自由。而在PS部分,SM 2.0也顺应要求提供了96条可执行指令。更为重要的是SM 2.0中还引入了循环语句,使得各种纹理和像素操作能够嵌套运行,从而获得更复杂的效果。毫不夸张地说,SM发展到2.0才真正趋于成熟。尽管SM 2.0给予了GPU/VPU足够的自由,但也限制了程序员的能力,即它的编程环境并不好,复杂的程序严重影响了程序执行的效率。

3.日趋完美的SM 3.0

针对SM 2.0在实际应用中的不足,伴随DirectX 9.0c诞生的SM 3.0进行了相应的改进,如将数据精度提升到了32bit全浮点运算(FP32),加入了全新动态程序流控制、位移贴图、多渲染目标、柔和阴影等特性。在顶点处理上,最显著的改进就是加入了顶点纹理(Vertex Texturing)拾取功能和顶点复用流分频器,前者主要通过位移贴图增加物体表面的凹凸感觉,强调了物体立体感;后者通过得到许多相似但状态各异的物体,使得“万人交战”的盛大3D场面成为可能。

在PS方面,SM 3.0的改进侧重于为开发者提供动态分支执行。在Shader中程序员就可以使用诸如if-then的条件判断语句,让PS的执行更加灵活。与此同时,PS 3.0还增加了隐面寄存器(Back-face Register),这实际上是个浮点标量寄存器,用来存储当前像素的三角形和视点之间的位置关系,如果寄存器内存放的值大于零,就表示这个视点所在的三角形面向视点,否则就是背向视点。通过判断寄存器内的值和SM 3.0的动态分支功能,程序员可以快速确定一个场景所要绘制的三角形,从而减免无效渲染,大幅提升游戏性能。

07-d15-05.jpg
VS3.0提供的Vertex Texturing能够建立真正的凹凸3D对象
07-d15-06.jpg
有了VS3.0,无须借助贴图就能创建富有质感的3D对象
07-d15-07.jpg
SM 2.0(右)与SM 3.0(左)画面效果对比

写在最后

微软下一代操作系统Vista将会带来全新的DirectX 10,新的API将支持SM 4.0。据悉SM 4.0最大的进步在于PS和VS这两部分内容将合二为一。PS和VS融合将给3D世界带来一场新的变革。对于游戏开发者来说根本不需要考虑Vertex和Pixel的限制,同时也避免了VS和PS单独执行带来的性能下降。

而在指令运算精度方面,SM 4.0也将提供高达64bit的浮点精度(FP64)。这样在各种纹理操作中所产生的误差和细节损耗将会显著降低。在FP64的帮助下,程序员能够创建出更为华丽的3D世界。当然,FP64对GPU/VPU有着极高的要求。SM 4.0的实际表现究竟如何?让我们拭目以待吧。