开启显卡新时代Shader Model 4.0
熟悉显卡的朋友应该知道,显卡的重大升级都是以支持新的DirectX和Shader Model版本为标志。这是因为,与常见的增加着色器数量和提升核心/显存频率不同,DirectX和Shader Model的升级能让显卡带给我们更加真实华丽的视觉效果,显卡的性能也能突破原有瓶颈而继续提升。因此,这种升级是用户区分显卡档次的重要标志,这也导致了一年前ATI 由于Radeon X800系列显卡不支持SM3.0而与NVIDIA大打口水仗。而随着DirectX 10一同登台的SM4.0又将带来什么样的突破呢?
一、日渐成熟的Shader Model
目前在市场上,NVIDIA的GeForce 7系列和ATI的Radeon X1000系列显卡正打得难解难分,它们都支持SM3.0。细心的朋友可以发现,相对于显卡和DirectX都历经了数代升级,Shader Model目前还处于第三代(SM3.0)的阶段,这是因为Shader Model并不是在显卡诞生之初就存在的。
最初显卡的功能很简单,只能完成固定功能的运算,处理基本的2D图像。即使随后显卡支持3D T&L(变换和光照,主要负责计算3D物体的空间位置和表面颜色),那也只是增加了一些预先设定好的加法和乘法而已。但伴随着DirectX 8.1的横空出世,SM1.0为显卡提供了可编程功能,程序员可以更灵活、高效地实现前所未有的特效。接下来,着色模型走过一段日臻强大而且令人兴奋的路程,它让显卡的可编程功能从早期的整数运算提升到现在的32位浮点运算,也让显卡从CPU那里分担了越来越多的工作,从而使PC的整体性能不断提高。现在,Shader Model已经在DirectX中占有举足轻重的地位,其版本和着色器配置也成为了决定显卡高下的关键因素。
当然,谈到Shader Model的时候,我们不应该忘记其历史功臣。和大家想像不同的是,最早真正提出着色器(Shader)概念并加以实际应用的,并非大名鼎鼎的微软公司。著名的好莱坞动画公司PIXAR早在上世纪80年代就开发了Renderman系统,用于动画特技的制作,而着色器就是在Renderman中首先提出的概念,只不过当时的着色器是由CPU来运算的。此后在上世纪90年代,美国UNC大学的高性能图形研究人员在PixelPlanes/PixelFlow系列图形工作站中使用了由显卡运算的着色器。最后微软在DirectX 8.1中也采用着色器概念,这才让Shader Model逐渐为我们所熟知。因此,当我们现在享受着SM3.0带来的美妙画面时,也不应忘记这些技术先驱的贡献。
二、SM4.0:突破性的技术优势
随着DirectX 10显卡的即将到来,Shader Model也发展到了第四代。在表1中我们可以看到历代Shader Model的规格变化(注意,即使是同一代Shader Model,不同的版本在特性上也有差别。这里选择每一代中最有代表性的版本:SM1.1、SM2.0、SM3.0和SM4.0)。
从SM1.0到SM2.0,再到SM3.0,都是一个不断强化显卡的可编程能力、解除程序指令槽容量限制的过程,从而让程序员可以更自由、更轻松地设计出各种特效。不过,SM4.0的革新还远远不止于此。
1.更灵活的动态流控制
学过编程的朋友都知道,如果一个程序中没有跳转指令(如分支/循环指令),那么它就只能从头到尾顺序执行。这种顺序执行的方式不但让程序开发非常复杂,也会造成程序执行的效率非常低下。而在SM1.0中就没有任何跳转指令,无论是顶点着色器程序还是像素着色器程序,都只能顺序执行。因此尽管SM1.0赋予了显卡可编程的能力,但是其效率并不高。
到了SM2.0,流控制的概念被引入,包括各式各样的跳转指令。在SM2.0中,顶点着色器可以执行静态流控制(像素着色器仍然没有流控制能力)。静态流控制不能在程序执行的过程中动态地改变跳转指令的目标,只能按照预先设定好的路线前进,尽管它和顺序执行一样缺乏灵活性,但它提高了程序中相同代码的利用率。举个简单的例子,程序中要运算“3+5”和“6+9”,在顺序执行中就要为这两个运算分别编写代码;而采用流控制后,程序员只需要编写“A+B”进行替代,然后在原代码位置分别赋予A和B相应的数值即可。这种重复性的代码越复杂,使用频率越高,流控制的作用就越大。此外,借助静态流控制,程序在开发时还能够绕过指令槽容量的限制,这是由于部分跳转指令会被重复执行,因此实际执行的指令条数可能会远远大于Shader Model的指令槽容量限制。
当然,静态流指令毕竟还是不够灵活,真正给显卡带来更大灵活性的,还是SM3.0中动态流控制的加入。有了动态流控制,代码的重复利用能力得到了很大程度的扩展。比较典型的例子就是在多光照环境中对于光线的运算,在SM2.0中,程序员必须为每一条编写独立的代码;而在SM3.0中,程序员只需要编写一次光线运算的代码,然后赋予不同的数值就可以得到不同的光线。很显然,动态流控制进一步降低了程序开发的难度,提高了程序的执行效率。
SM4.0进一步提高了动态流控制的处理能力,完善了对跳转指令和函数嵌套的支持。可以说,SM4.0的流控制在功能上已经不亚于现在的CPU,只是在执行性能上相比CPU还是有不小的差距。也正是由于具有越来越强大的功能,显卡才有能力从CPU那里“分担”越来越多的处理任务。
小知识:
什么是指令槽?
大家知道,程序运算的过程实际上就是执行各种指令的过程,指令槽的容量大小(即数量)就决定了一个程序中能够使用多少条指令。指令槽容量通常被俗称为“指令长度”,但这并不准确,因为部分指令需要占用多个指令槽,所以一个程序中的指令条数往往小于指令槽容量。
首款DirectX 10游戏《Crysis》高度真实和精美的画面给大家留下了深刻的印象
2.近乎无限的资源利用能力
从程序员的角度来看,SM4.0的最大好处就是编写程序时不再受到资源利用上的限制。这种限制在早期的Shader Model上表现尤其明显,就指令槽容量而言,SM1.1中的顶点着色器有128条指令槽,像素着色器只有少得可怜的4条纹理指令槽和8条算术指令槽;发展到了SM3.0,顶点着色器和像素着色器也只分别达到了512条指令槽。
为什么指令槽容量这么重要呢?例如某个程序一共要用到1000条指令,那么由于SM3.0中512条指令槽的限制,程序员在编写程序时就只能把它“拆分”成两个500条指令的子程序,显卡实际运算时先处理第一个子程序,再把它的输出结果作为第二个子程序的数据源输入,然后处理第二个子程序并完成整个运算。采用这种化整为零的方式,程序员才能绕过Shader Model的指令槽容量限制,编写更为复杂的程序。不过这种方式的缺点显而易见,它不但增加了编程的难度,还极大地影响了显卡的执行效率和性能。
从SM1.0到SM3.0,尽管指令槽容量不断增加,但面对将来DirectX 10,为了实现更复杂的特效,程序员在编写着色程序时还是不免捉襟见肘。而一旦进入SM4.0时代,这个问题就会迎刃而解,因为它支持6万多条的指令槽容量,一般情况下在一个着色程序中,程序员几乎不可能使用到如此庞大的指令数量,编程时被迫“拆分”程序将会成为历史。
除了指令槽容量急剧扩大,SM4.0的常量寄存器和临时寄存器相比SM3.0也增加了几个数量级!程序员不必再为程序运算时产生的数据存放在哪里而伤透脑筋了。
此外,SM4.0还大大增强了着色器的纹理访问能力。SM3.0的顶点着色器只能访问4个纹理,像素着色器只能访问16个纹理,而SM4.0一下子就把两者的纹理访问数量均提高到了128个。这意味着顶点着色器能够绘制更加细致真实的3D模型,而像素着色器也能更好地完成像素的渲染。
总之,在SM4.0中,程序员在编写程序时的资源限制已经缩小到可以被忽略的程度,资源限制相关的底层细节都会被优化和隐藏。这就像以前个人电脑的内存容量很小时,系统经常警告“内存容量不足”,玩家不得不思考如何更好地设置虚拟内存;而现在使用2GB内存时,几乎可以把虚拟内存抛在脑后了。同样的,SM4.0在各种资源上近乎无限的访问能力,将让程序员摆脱种种烦人的限制,从而更自由地设计出梦想中的特效。
主板
显卡
显示器
CPU
内存|存储
光存储
机箱|电源
键鼠|摄像
音频
笔记本
台式机
数码相机
手机
MP3|MP4
势在必行的革新!5D Mark II上市
专业品质 蓝宝FireGLV3600昆明热卖
价格正规 双敏9800GTX终上1399元
英特儿45纳米迅驰移动高清芯世界
英特尔45纳米酷睿 高清"芯"视界
西部全覆盖 雷柏新品键鼠专题报道
影驰 GF9600GT中将限量版 Crysis
Lazeska 天空战记官方游戏壁纸
佐佐木希清纯秋季写真2
佐佐木希清纯秋季写真1
冒险岛Online官方游戏壁纸