● 序言:这个世界的铁则
RISC(Reduced Instruction Set Computing)。精简指令集,一种指令数目少、执行周期短、以流水线优化优先的高效能CPU指令集。但他并不支持受众面最广的操作
RISC与CISC
GeForce FX系列,NVIDIA的首款DirectX 9显卡,曾被抱以厚望。一度人们认为配合nVIDIA同步发布的革命性Cg
“一台完整的计算机是由软件部分与硬件部分所组成”,大概在每种
显卡以及算机图形产业的历史并不长,不过从诞生那天开始它便是发展速度最快的领域之一。伴随着不断涌现的新技术与新需求,我们也走过了10余年的时间。各式各样的图形技术与应用软件之间不断的
从用途上来讲,计算机图形技术所涉及的软件无非是两种:一种用来提供基本的软件环境与运行平台。另一种则是直接应用去处理各种终端事物。像是DirectX、OpenGL、各种驱动可以归为前者,后者又可以进而分为专业软件与民用软件。在民用软件之中,目前分量最重的无疑是各种
在我们还沉浸在漫长的DirectX 9
● 未来的基石 -
Microsoft DirectX已经有12年的历史,相继推出了9个版本,凭借着极强的适用性DirectX当仁不让的成为被使用最广的
但DirectX 8.0的出改变了这一切,随着Shader(着色器)的引入,程序员就可以摆脱桎梏,自由的进行创作。不过自由也是需要付出代价的,Shader与Shader间地位也有不同,用来用于衡量它强弱的Shader Model同时被提出。
● DirectX 8.0
Shader的本质是一段可以编译的小程序,程序员可以像挥动画笔一样通过编译一段Shader来执行各种操作。而Shader Model则是Shader的行业标准,就像画笔有不同功能级别那样,不同版本的Shader Model所对应的功能也不同。根据职能不同,Shader又分为Pixel Shader(像素着色器)、Vertex Shader(顶点着色器)。在最新的Shader Model 4.0中Microsoft又开发出Unified Shader(统一着色器)来代替前两者,并引入了Geometry Shader(几何着色器?)的概念。
对于像Shader一样的程序,只有对其进行编译它才能发挥作用。能够决定其优劣的重要标准之一是它所支持的指令长度,某种意义上讲,Shader Model的革新的最核心内容是更高的编译自由度与不断提升与指令长度。
列举一下各版本的DirectX的在世
这就验证了一个观点:至少在本世纪初的一段时间内,编程的自由度将是衡量显卡技术的一个极重要的参数,我们甚至可以片面的认为所有现代显卡技术的产生都是为了配合编程自由度的提高,不断延展的指令长度也不断的造就着新的功能与
● 寂寞与英雄如影随形?
2002年8月,第一款支持DirectX 9的CPU:
2004年4月,第一款支持DirectX 9.0C以及Shader Model 3.0的显卡:NVIDIA GeForce 6800发布。2004年7月,首款DirectX 9.0C游戏《孤岛惊魂》(FarCry) 1.2
2006年11月,第一款支持DirectX 10以及Shader Model 4.0的显卡*:nVIDIA GeForce 8800发布。2007年
注1:2006年7月S3就已经暴光了代号为“Destination 1”的DirectX 10 GPU,但第一款正式发布并
注2:对于一款
注3:FarCry的发行时间为2004年3月,使用它在同年7月推出的1.2补丁后才能支持DirectX 9.0C,使用1.3补丁后才能开启HDR。
● 王者都难逃寂寞的宿命?
我们发现一个有趣的现象,近几代有着重要意义的显卡型号上市后都会面临一段
在今天我们经常能够看到“DirectX 10无用论”与“Shader Model 4.0无用论”,这与两年前常见的“Shader Model 3.0/HDR无用论”如出一辙。在这些说辞中,如果把有可能的厂商因素与个人喜好排除掉,剩下最多的理由便是“没有软件能够支持它的应用”。类似于“硬件、软件发展脱节”、“只要画面不要游戏性”的话题已是老生长谈。我们暂且将这个话题放在一边,转而从
CS,非DirectX 7显卡不可?
Counter-Strike(反恐精英),一款极经典的FPS
也许会有人讲“投资‘超前’
● 代沟 - 不同
现在有一种比较多见的说法:“可以等DirectX 10游戏成熟的时候再入手新显卡”。关于这种说法,我们不妨与上面的疑问一起来探讨。关于软、硬件发展不均衡的问题也已经有了长时间的争论,这同样是一个有趣的话题。对于这个话题,不妨分为两部分去考虑。一是“固定管线时代(DirectX 8之前)”,一是“自由
在显卡刚刚诞生的那段时间里,DIY的状况与现在大不相同,当初所谓的DIY只是抛弃了
当显卡业还处在起步阶段时候,因为基本不存在竞争,市面上各种型号显卡的性能差距远没有现在这么大。游戏
随着图形产业的发展,游戏开发商所考虑的问题变成了是否要跟进新的图形技术。在这个问题上,开发商们分为两个派别,一是坚定的追随最新的图形技术,将最好的画面带给游戏
● 还记得玩
在那个年代的游戏爱好者看来,也许游戏开发商与硬件厂商间的确是达到了默契的程度,人们很少需要去考虑自己显卡的规格能不能玩的了更多游戏。但是在厂商的眼里却不一定是这样,随着产业的发展,这种“脱节”的现象也逐渐产生。只是因为当时行业的深度相对较浅,游戏开发的周期也可以控制在较短的
“脱节”一词带有贬低的色彩,用它来形容图形
以笔者的观点,DirectX 9.0C的游戏应该分为“初期”与“成熟期”两个阶段。发行于2005年11月的《
NFS9的HDR
第一次玩到NFS9,有两个记忆深刻的地方:一是暴光过度的bloom贴图技术,二是尽管只支持低精度HDR,但依旧华丽的光源效果。早期的DirectX 9.0C给笔者留下的最深印象居然是一幕幕暴光过度的HDR(高动态光源渲染)画面。也许是被死板的光源效果限制太久,此时诸如《帝国
刨除HDR特效之外,相对于DirectX 9.0b,DirectX 9.0C在画面的细节,精细度等方面已经可以看出差距。使用Shader Model 3.0进行
《英雄连:CompanyofHeroes》发布于2006年9月。笔者认为它可以算的上DirectX 9.0C“成熟运用”的代表作之一。
从去年中末期开始,相继发行了《英雄连》、《细胞分裂4》、《彩虹6号》等几个游戏,制作
DirectX 9.0C游戏的成熟期是从2006年第二季度末开始的,距离它的发布已经有两年的时候。但NVIDIA与Microsoft在去年底相继推出了第一款支持DirectX 10的显卡GeForce 8800与第一款支持DirectX 10的
至此,总结近几代的图形开发套件、
这也许是个令人难以接受的说法,其实只要转换立场去做思考,就可以轻松的解读出其中原由。随着图形领域的不断发展,各种型号的显卡性能差距也逐渐拉开。进入自由编程时代之后,游戏厂商必须要考虑几个
因为对新的编程规则要有一段适应过程,初次使用新技术制作的
这样的循环模式是必然的,自由编程时代的到来加深这个循环的深度,但整体上并不脱轨。反观今天出现的对技术与软件的焦虑,其实并不是哪一方面真的发展太快,更多的原因恐怕是现在弥漫着不纯竞争的行业氛围所带来的浮躁心情吧。
● 再谈G8X:DirectX10已“武装到牙齿”
我们从历史的经验中可以看出DirectX 10的必然性,也许会有很多人想去了解这个3D API究竟有何优势?其实任何一次3D API更迭都会伴随大量新技术的产生与应用,不妨让我们简单的从这些新技术中对它进行窥探。
1、统一着色器架构
此前的显卡都采用象素着色器跟顶点着色器分离的架构,这种架构不允许GPU同时处理象素跟顶点着色。比如说显卡在进行顶点着色的时候象素着色器单元就变成闲置,浪费了资源而且还形成了不必要的性能瓶颈。特别是现在分离式架构的GPU 的PS资源都要远高于VS,在这种状况下瓶颈的负担无疑是雪上加霜。
实际上这种情况我们在游戏里就经常碰到。而在采用了统一着色器架构的GPU以及运行于DX10的系统中,显卡可以同时对顶点、几何以及象素着色进行处理,而不必等待逐个分别进行。这也使得资源得以合理分配,保证整个架构高效运行。
虽然目前只有NVIDIA的G8X采用了统一着色器架构。统一着色器架构还会令GPU更加适合处理通用化任务,这是由于一方面程序员无需再为不同的着色器单元编写不同的执行单元,也不必去顾虑不同着色器之间存在的差异,所对应的接口以及操作方式全部融为一体,从而使负责的开发流程得到一定程度上的简化。
另一方面是由于Shader单元的统一化使得任何通用计算程序都将在统一着色器架构的GPU上发挥它的所有计算资源,不存在我们上面提到的分离架构造成的着色器单元闲置问题。此外,统一架构的带来的执行单元和配套资源上的共享化也让之前分离架构上存在通用化计算问题迎刃而解。因此,游戏里像物理模拟、运动模拟以及其它原本不适合GPU计算的任务如今都可以交给GPU来做。
GPU强大的性能使得那些原本无法达成的任务,比如流体运动模拟,得以在游戏中实现。这也极大了减低了系统对CPU的依赖性,原来给CPU的工作,让GPU执行通用化操作,而现代高速GPU的通用操作性能已经超过了高速CPU的性能,极大提高了系统的整体运算效率。
2、geometry shader(几何着色器)功能
对于DirectX 9和DirectX 10的区别, DirectX 10将利用DirectX 10来克服他们使用DirectX 9所面临的传统限制。例如,geometry shader(几何着色器)功能将使得游戏可以加速游戏的数学运算性能,诸如在GPU上进行物理运算。
在过去的DX9中,Vertex Shader每一次运行只能处理一个顶点的数据,并且每次只能输出一个顶点的结果。在整个游戏场景中,绘制的几何图形的任务量非常庞大,如果仅仅依靠Vertex Shader单一来完成,效率会极其低下。而更致命的是VS无法单独生成或重组多边形,所以在以往只有VS跟PS的GPU中,生成一个模型往往需要CPU的“大力支持”。
DX10中的Geometry Shader改变了这点。它的作用就是对每个Vertex数据临近的数据进行Vertex函数处理。这种函数处理可以快速的把模型类似的顶点结合起来进行运算。虽然其操作不会象Vertex Shader那样的进行完整的几何转换操作,只是处理器单个顶点的相关函数操作,但是这种操作却可以确定整个模型的物理形状,这将大大加速处理器速度。
基于此特性,Geometry Shader可以根据顶点的信息来批量处理几何图形,对Vertex附近的数据进行函数处理,快速绘制出新的多边形。然后再通过steam out将这些结果传递给其他Shader或buffer,使得CPU可以从原本复杂庞大的多边形运算中解放出来。
现在可以让GPU直接处理细微的粒状效果,如烟雾和爆炸效果等(在这之前这一任务通常交由CPU来完成)。而由于GS的性能要比CPU高出许多,同屏下能够渲染的粒子数量也就更多,所以可以预计烟雾跟爆炸的效果会比以往更为震撼。
你可以期待GPU进行更多的游戏运算,这样将产生更多动态的场景,而减少数据交换信息意味着场景具有更复杂的几何和多样性。而游戏将更加漂亮,因为它们将有更加复杂的模型,更加细致的物体,或者说同一屏幕上更多的物体,而由于结合了更加复杂的物理,视觉效果将更加复杂,更加真实。例如流动的水,微风吹拂的叶子,这些都将是互动的。当你在树林中行走时,被碰到的树枝将分到两边,而在战斗场景中穿行将有烟雾弥散效果,所有这些结果将更加真实,并呈现出更加愉悦的游戏体验。
3、运算效率更高
DirectX 10另一个最令人注目的改进就是可以为API节省计算开销(API overhead)。所谓API overhead就是游戏在处理画面上的每一个物体(object)时(比如人物、岩石等等),都需要先将这些Object传送至API,然后再由API传给驱动程序,而这个过程都需要CPU做出处理。
当Object越多(每一帧画面通常超过几百个),对CPU的负担就越重,所需要消耗的处理时间就越长从而构成瓶颈。而之前DirectX 9就存在API Overhead太大造成CPU资源占用率过高的弊病,因为DirectX 9每使用一个object都需要CPU为其做资源确认。
而全新的DirectX 10针对这方面作出了改善,采用了全新设计改良的Validation机制。现在只有在该Object生成时,才需要CPU做确认,此后在使用Object时就不需要再次确认了,从而大幅降低CPU的负担。简而言之就是DirectX 10可以有效减少CPU处理3D物体的时间,所以现在每一帧画面可以拥有更丰富的3D物体(无论是树木、贴图还是人物)。而CPU被释放出来的空余资源还可以让制作者用于其它诸如物理、人物运动以及AI等方面的计算。
DirectX 10还带有一个真正的整数指令集,可以尽可能完成更多的寻址计算,更多的数据打包和解包;当然这些功能并不会创造出一些新的画面特效,但它允许开发人员在GPU中高效的完成更为智能、复杂的渲染工作!
此外,HDR(高动态范围渲染)方面,由于DirectX 10硬件支持RGBE,所以HDR纹理不再需要特别解码处理也能实现,HDRAA也得以轻松实现。另外DX10还支持两种全新的HDR模式,一款是R 11G 11B10,采用11-Bit红色和绿色、10Bit蓝色,另一款是采用5Bit共享加每种颜色以9Bit作尾数运算,以上两款HDR模式在HDR品质上和标准的FP16几乎没有差别,但却能有效减少资源损耗及显存带宽占用率,从而消除了以往HDR的瓶颈。另一方面,DirectX 10还支持更高精度的FP32 HDR(每通道32bit,所以也有人美其名曰:128bit HDR),随时为玩家提供更高质量的HDR效果做好准备。
● G80,纯正的GPGPU血统!
从R300到NV40,再到现在最新的G80,每一代旗舰GPU的晶体管都大大超过了同期的顶级CPU,也在挑战其同时代半导体工艺的极限。随着GPU性能的提升,近年来GPU用于通用计算(General Purpose GPU)及其相关方面的问题成为一个十分热门的话题。GPGPU指的是利用图形卡来进行一般意义上的计算,而不是单纯的绘制。以NV40为代表的可编程GPU发布后,GPGPU进入了一个高速发展的全新时代。
相比固定的流水线,目前硬件的可编程顶点和片段单元不管是运算精度,支持的指令数还是寄存器个数都有了很大提高,更重要的是基于Shader Model 3.0版本顶点和片段着色器版本的硬件开始支持动态流控制的循环和分支还有子函数操作。比如,现在的片段着色程序最多允许同时访问16个独立的纹理,支持长度不受限制的指令数,寄存器个数也大大提高。而且提供了32位浮点精度的运算和存储格式,对于通用计算来说,这就很容易做出更为复杂的运算。尽管GPGPU前途一片光明,但挑战与机遇永远是并存的,目前GPGPU所面临的问题也非常的多。
首先是当前的图形硬件还存在很大的局限性。GPU毕竟是为了图形渲染而生,其通用性离真正的通用处理器还有很大一段距离。比如,在DX9硬件上,Vertex Shader和Pixel Shader总共的指令数被制在1024(512+512)条指令,(片段着色器)Pixel Shader最多只能同时访问16个纹理,进行分支和循环操作的开销也比大。
此外,片段着色程序虽然支持R16F的浮点类型数据格式,但缺乏其他类型的支持,限制了通用运算的多样性,而且R16F这种单精度的IEEE格式对于通常所用的工程计算而言精度还是低了点。由于每个shader程序最多带32个Temp寄存器,指令数也受到限制,所以在很多通用计算程序的编写中不得不采用multi-pass来完成一些复杂的运算,这样就降低了性能。
由于整个GPU只能通过顶点纹理来读取数据,通过渲染到纹理来写入数据,对于显存没有任何间接写指令,输出地址只能由光栅化引擎决定,不能由程序改变,无法进行任意的读写操作,因此必须将计算的中间结果保存以避免多次读写,这又无形中降低了GPU的通用运算性能。另外在硬件上如果采用浮点运算,则不能利用硬件本身的颜色混合操作,也不能进行mipmap的自动运算,这些也妨碍了GPU在通用计算上的应用。不过,支持DirectX 10的G8X系统的的出现,将让这些问题迎刃而解。
NVIDIA方面,新一代G8X图形核心采用了先进的统一渲染架构,拥有多达128个流处理器,引入几何着色器功能……这一切简直就是专为GPGPU运算而生!为了最大程度的发挥几何着色器的威力,G80还专门设置了一个名为流输出层(Stream Output State)的部件来配合它使用。
这个层的功能是将Vertex Shader和Pixel Shader处理完成的数据输出给用户,由用户进行处理后再反馈给流水线继续处理。它可以直接读写本地显存。我们可以通过Stream Out把GPU拆成两段,只利用前面的一段几何运算单元。对某些科学研究,也可以通过stream out来利用GPU的数学运算能力,等于在CPU之外又平白多得了一个数学协处理器。
我们可以这样理解G80图形核心的几何着色器和Stream Out单元:GS提供了改变图形数量的能力,Stream out提供了硬件Multi-pass的支持。可以预见,今后围绕这些全新的功能,又会有一批新的GPU通用计算程序出台。
基于当前的G8X架构,NVIDIA现在已经有了一个针对GPGPU的解决方案,被称作Compute Unified Device Architecture,简称CUDA。CUDA是一个完整的解决方案,包含了API、C编译器等,能够利用G80的片内L1 Cache共享数据,使数据不必经过内存-显存的反复传输,shader之间甚至可以互相通信。
对数据的存储也不再约束于以往GPGPU的纹理方式,存取更加灵活,可以充分利用stream out特性。以上几点都将大大提高GPGPU应用的效率。例如,在游戏中我们可以使用CUDA来让GPU承担整个物理计算,而玩家将会获得另他们感到惊奇的性能和视觉效果。
另外,用于产品开发和巨量数据分析的商业软件也可以通过它来使用一台工作站或者服务器完成以前需要大规模的计算系统才能完成的工作。这一技术突破使得客户可以任何地方进行实时分析与决策。同时,一些以前需要很先进的计算技术来达到的强大计算能力的科学应用程序,也不再受限在计算密度上;使用CUDA的计算可以在现有的空间里为平台提供更强大的计算性能。
在正式发布了基于G80核心的Quadro专业3D显卡之后,目前NVIDIA正在酝酿一款全新的流处理加速卡,主攻图像加速、科学计算等GPGPU运算领域……
● 总结:DirectX 10—在无定则世界中必然的进化标志
Shader Model的革新本身是可以将程序员从繁杂的劳动中解脱出来,但有竞争的存在,就会有人背离它的实质,不惜几倍的辛劳去在Shader Model 2.0下
DirectX 8之后的革新对自由
DirectX 10行业发展的必然,却经常可以听到“DirectX 10根本不适合
游历于行业中,经常可以看到如同像上面所提到的“怪事”。其实就像开始所提到的“计算机是个多元的领域,无论是性能、应用、价格亦或是各种错综复杂的金钱
在这个多元化的世界,每条看似无法侵犯的规则在多种因素的影响下都有可能变成柔性的存在。我们该做的也许是静下心来重新审视这浮躁的一切。只有这样才能创造出新的游戏规则,引领进步的
在以前雾化是被当作令人惊叹的“特效”所对待,到了今天它已经变成了随处可见的“效果”。就像我们今天将HDR称为“特效”,是因为它的效果绚丽,因为它在DirectX 9.0C下开启将占用大量资源。但是到了DirectX 10,要实现HDR“效果”则轻松的多。特效与效果两个看似区分严格的词汇,虽只差一字,内涵却相差甚远,随着行业进步却它们却可以融会变通,在不同的
曾经有个关于进化的观点:“
DirectX 10是行业进步的必然,保守的坚持着DirectX 9的终将成为行业进步的拖累,被未来淘汰。至于具体到DirectX 10软件/硬件环境的发展,我们可以通过编程