微软的DirectX 9.0c距今离它的诞生已经有2年的光景,DX9.0c给我们带来了全新的Shader Model3.0技术,也使得3D画面较以往了有了质的突破,DirectX 9.0c是截至至今微软历史上寿命最长的一代API,而图形技术的发展是不会停下脚步的,2006年微软发布了全新的DirectX 10.0,仅从版本上看比9.0c相差一级,但是DirectX 10.0带给我们的又将是一个全新的概念。
在微软发布DX10.0后,NVIDIA积极响应,发布了完全符合DirectX 10.0的通用Shader架构图形处理器G80,也标志着DX9.0c将会逐步被DX10.0替代。相对DirectX 9.0c中的SM3.0,在Shader Model 4.0中微软引入了统一着色架构,这才是DX10最大的改变。我们都知道,微软在DirectX 9中引入的了2.0/2.X/3.0三个版本的Vertex Shader(顶点着色引擎)以及Pixel Shader(像素着色引擎)。其中支持2.0版的着色引擎是DirectX 9的GPU的最低标准,而当前主流的显卡已经都硬件支持加入了拥有更多高级处理功能的3.0版本着色引擎。
不过,即便是DirectX 9.0c,对于功能相仿Vertex Shader、Pixel Shader来说,目前图形芯片厂商仍需要在GPU中划分两个区域来存放Vertex Shader阵列和Pixel Shader贴图流水线。这无疑是一种资源冗余,而且这也加重GPU的设计难度及成本。当DirectX 10把渲染流程更细分为Vertex Shader、Geometry Shader及Pixel Shader,这个情况将会更为明显。而DX10.0的诞生就将这2种渲染整合在了一起!
SM4.0较SM3.0的改进
而在DirectX 10中引入了统一渲染架,通过一个整合Vertex Shader、 Pixel Shader的可编程整合光影处理器来完成目前Vertex Shader、Pixel Shader所有的工作。所谓统一渲染架构,最轻易的理解方式就是Shader单元不再分离,显示核心不再为Shader类型不同而配置不同类型的Shader单元,对于主流的显示核心,Pixel Shader单元以及vertex Shader单元的概念都应该已经非常熟知了,而在统一渲染架构中这两种Shader单元将不再分离,转而所有的Shader单元都可以为需要处理的数据进行处理,不管和是Pixel Shader数据还是Vertex Shader数据。
而调配哪几组Shader单元负责处理什么数据或者进行什么样子类型的计算,则由一个被称为small sets of instructions(SSI)的部分来控制。这样在硬件上,设计者就无需为不同的着色引擎设计不同的执行单元,只要按照所对应的接口以及操作方式全部融为一体,仅设置一种独立的Shader执行单元。这意味着GPU厂家可以用更小的核心来实现现在需要用8000万甚至更多晶体管才能实现的功能!
相比原先的Shader Model 3.0,Shader Model 4.0最大指令数从512条增加到了64000条;临时暂存器数量也从原先的32个增加到惊人的4096个;答应同时对128个Texture进行操作(Shader Model 3.0只答应16个);材质texture格式变为硬件支持的RGBE格式,其中的"E"是Exponent的省略,是RGB共同的说明,这在HDR的处理上有很大的作用,摒弃了以往需要专门decoding处理HDR渲染的流程。 另外,对于纹理的尺寸Shader Model4.0也有惊人的提升,8192x8192的最高纹理分辩率比原先最高2048x2048的分辩率要高出4倍。G80图形核心对以上规格都给予了完整的硬件支持。
Shader Model4.0新特性
Shader Model 4.0另一个重大变化就是在VS和PS之间引入了一个新的可编程图形层----几何着色器(Geometry Shader)。原来的Vertex Shader和Pixel Shader只是对逐个顶点或像素进行处理,而新的Geometry Shader可以批量进行几何处理,快速的把模型类似的顶点结合起来进行运算。虽然其操作不会象Vertex Shader那样完整,只是处理器单个顶点的相关函数操作,但是这种操作却可以确定整个模型的物理外形。这将大大加速处理器速度,因为其它Shader单元将不再去需要判定数据所存在的位置,而只是需要简单的为特定区域进行操作就可以了。
Geometry Shader可以把点、线、三角等多边形联系起来快速处理、同时创造新的多边形,在很短时间内直接分配给其他Shader和显存而无需经过CPU,烟雾、爆炸等复杂图象不再需要CPU来处理。从而极大的提高了CPU速度和显卡速度。游戏图象中可以出现许多精细场景,如不锈钢茶壶上清楚的反射出四周物体、超精细的人物皮肤等。
为了最大程度的发挥Geometry Shader的威力,DX10硬件还专门设置了一个名为流输出层(Stream Output State)的部件来配合它使用。这个层的功能是将Vertex Shader和Pixel Shader处理完成的数据输出给用户,由用户进行处理后再反馈给流水线继续处理。我们可以通过Stream Out把GPU拆成两段,只利用前面的一段几何运算单元。对某些科学研究,也许可以通过stream out来利用GPU的数学运算能力,等于在CPU之外又平白多得了一个数学协处理器。举个例子,Doom3常用的Stencil shadow,因为CPU负担很重,广受批评。但是因为GS可以计算轮廓线, 还可以动态插入新的多边形,有了Stream out之后,Shadow volume的生成就可以放到GPU端进行,实现Stencil shadow的硬件化,这将大大降低CPU占用。
统一着色架构
在以前的DirectX版本中,像素着色器因为受到常量寄存器、可用指令和总体流程可的限制总是运行在顶点着色器之后,因此程序员必须学会怎样分别去利用好顶点和像素着色器的权限。Shader model 4.0则带来了与以往不同的统一着色架构,在DirectX 10基础上进行游戏开发,程序员不需要在避免着色冲突限制上花费时间,所有的统一架构着色器都能够使用GPU可以用的全部资源。
Shader model 4.0在着色器程序可用资源的提升方面让人激动,在以往的DirectX下,开发者不得不仔细计算可用的寄存器资源,而在DirectX 10中,这些问题都不复存在,如上表所示,总体上DirectX 10提供了超过10倍的DirectX 9可用资源。
更多的纹理和渲染
Shader Model 4.0支持纹理队列集,把开发者从繁重的拼接纹理图集的工作中解放出来,并能够在每个着色器上使用更多的非凡纹理实现更好的视觉效果。
在Shader Model 4.0之前,过高的开销使在一个着色器操作上使用多个非凡纹理的操作基本无法实现。为了解决这个问题,开发把许多小的分散的纹理拼接成一个大的纹理;在运行层中,着色器也需要进行额外的地址运算以便在拼接纹理图集中找到特定的纹理。纹理图集方式存在两个明显的缺点:首先小纹理之间的分界线回导致过滤操作错误;然后,DirectX 9的4096*4096纹理尺寸限制也是纹理图集的总体规模受到局限。纹理队列集能够解决所有问题,它能够使用队列格式存储纹理,每个队列能存储512同尺寸个纹理,最大的可用纹理尺寸也提升到8192*8192。为了促进这种应用,每个着色器可以操作的最大纹理数也提高到了128个,8倍于DirectX 9。
更多的渲染对象
多重渲染对象是DirectX 9时代的一个流行特性,它答应每个像素着色周期输出4个不同的渲染结果,从而高效率的在一个周期内渲染一个场景的4遍。在DirectX 10中,渲染对象的数目提高到8,着极大的提高了着色器能实现的场景复杂程度,延迟渲染和其它一些图像空间优化算法将广泛的从中受益。
两种新的HDR格式
两种新的HDR格式
HDR(High dynamic range rendering)从支持浮点色彩格式的DirectX 9时代开始流行。不幸的是浮点格式比整数格式占用更多的寄存器空间而限制了其性能的发挥。如典型的FP16格式的每个色彩数据需要占用16bits,这两倍于整数格式的空间占用。
DirectX 10的新HDR格式能够在和FP16实现同样动态范围的前提下只占用50%的存储空间。第一种格式为R11G11B10,它使用11-bits的红色和绿色以及10-bits的蓝色来优化存储空间;第二种格式是使用一个5-bits共享首位存储所有色彩然后每个色彩拥有9-bits尾址,这些简化的方法在HDR品质上和标准的FP16几乎没有差别。在最高级别的HDR方面,DirectX 10支持FP32的HDR,这可以用于科学计算等对计算精度较高的应用程序。
很显然,DirectX 10.0全新的Shader Model4.0对于消费者来说是一场全新的视觉革命,更逼真的3D游戏画面、流畅的高清视频回放是微软、显卡厂商推动技术发展的动力之源,在不远的将来我们就会体会到全新的DX10、SM4.0给我们带来的饕餮大餐。