显卡 频道

击落当前DX10显卡头顶的光环

DirectX 10的技术革新

Shader Model 4.0

  DirectX 10非常明显的一个变化,就是引入了Shader Model 4.0,而Shader Model 4.0也为我们带来了一些和DirectX 9.0C所不同的特性。在DirectX 10中,微软引入了Geometry Shader,Geometry Shader可以认为是图形流水线的一大进步,GS第一次允许了GPU生成/销毁几何的图元数据,并且和流输出功能相配合,大大提高了GPU的可编程性。

统一的Shader架构

  之前的DirectX版本,均采用分离式Shader架构,Pixel Shader搭配Vertex Shader,遗憾的是,Pixel Shader在各个方面都要落后于Vertex Shader,包括可用指令数、Shader长度、Constant Register个数等等,导致可编程性的下降。而在Shader Model 4.0中,无论是Vertex Shader、Pixel Shader还是刚刚引入的Geometry Shader,都具有完全相同的Constant/Temp Register、指令集、Shader长度,统一Shader架构的Shader,可以平等的共享这些资源,程序员在操作的时候,完全不必考虑Shader自身的限制。同时,Shader Model 4.0对可用资源进行了扩充,Temp Register从32个扩展到了4096个,而Constant Register从原来的256个扩充到了65536个。

  更多的Render Target:图形特效的逐渐增加,对于目标的数量要求也越来越多。一般来说,RT可能需要在物件的位置、pixel等部分,绘制一切的信息。为了提高效率,不少图形卡都可以支持,在Shader执行结束后,把不同的信息,绘制到不同的RT中。DirectX 10将RT的数量从DX9的4个提高到了8个。

  纹理阵列:包括在DirectX 9.0C中,多张纹理的切换操作,在一定程度上增加了CPU的复合,原因很简单:每次的切换都需要调用DirectX的函数,而绘制一个新纹理的物件,都需要进行这种切换操作,甚至要实现有些特殊的材质特效,可能需要进行多次切换。因此,曾经有一些游戏,将小的纹理合并到大的纹理中,通过赋予不同物件局部纹理的方式,减少纹理的切换,以提升游戏的运行效率以及CPU的占有率。这种方式的效果相当不错,但实现起来比较复杂,DirectX 9.0c对于纹理,是有一定尺寸限制的,仅为4096*4096,假如要容下更多的纹理,甚至需要增加多张大纹理的切换,造成运行效率的下降。

  而在DirectX 10中,微软引入了新的纹理整列,DirectX 10允许图形芯片进行512张纹理的同时维护,并且,Shader可以使用新的指令来随意提取维护纹理中的任意一张,这就意味着,DirectX 10将纹理切换的工作移交给了GPU,并且,GPU进行纹理切换操作,有助于降低和存在于显存中的纹理的操作延迟。在目前的DirectX 10中,应用程序只需要赋予纹理整列中的纹理索引号,即可由GPU来为物件选择纹理。

  DirectX 10中,每张纹理贴图的分辨率被提升到了8192*8192,每个Shader能够同时访问的数量,也增加到了128个,因此,DirectX 10中,Texture的细节精细度和多样性,都有了极大的提升。

  绘制预测:在很多的3D场景中,有一些物体是被遮挡的,如果对这些被遮挡的部分进行渲染,是对资源的一种浪费。在NVIDIA和ATI的图形芯片中,二者通过某种算法,不对遮挡的部分进行渲染,但尽管如此,还是会浪费不少宝贵的渲染资源。而DirectX 10则引入了绘制预测,来解决这种问题。绘制预测可以一个简单物件的渲染,来判断复杂物件的部分是否被遮挡,用小规模的渲染来判断大规模,高复杂化的渲染,的确要划算的多。

  流输出:流输出是DirectX 10的重要特性之一,流输出允许GPU的Vertex Shader或者是Geometry Shader直接向显存中写入数据,而在此之前的DX版本中,VS是只读的Shader,并不能写入。

  批量绘制:在之前版本的DX中,一直由CPU对渲染状态进行管理,每一次的调用DX的函数,都占据了CPU的运算能力,一定程序的约束了渲染的效率。而为了让这些操作能够批量运行,DirectX 10引入了全新的State Object以及Constant Buffers。

  State Object的作用比较简单,将之前的零散的部分,根据功能,聚合成一个,甚至几个整体,这样的话,应用程序不需要为每个部分进行DirectX函数读取,图形卡一次即能够将所有的部分全部写入。

  而Constant Buffers则更加具有实际意义,在建模之前的准备工作中,渲染状态的设置,只是一个小部分而已,这些信息存储在GPU的Constant Register中,每个CR只能够储存4个浮点型向量。在之前的DirectX版本中,CR的数量是非常优先的,而且每次更新一个CR的数据,都必须调用DX API函数,而Constant Buffer的引入,则彻底改变了这种状况——DirectX 10的Constant Buffer可以容纳4096个Constant,只需调用一次函数即可多次,大批量更新。

HDR新的颜色格式

  从Shader Model 3.0开始,HDR成为外界所关注焦点,HDR可以通过浮点的格式,以及颜色的格式,为光照、纹理等等运算,提供颜色范围和精度。在DirectX 10中,微软引入了两种全新的格式:R11G11B10和R9G9B9共享5。两种新的格式使纹理占用和原来完全相同的显存空间,避免了显存和带宽的消耗。当然,DirectX 10同样能够支持每个通道32bit精度的FP Texture。

0
相关文章