我们将从技术层面和游戏画面融合的角度来讲解DX10的改进,其实这两个角度的分类并不严格,只是为了让读者更便于理解,因为DX10的有些技术是为了释放CPU的占用率或者优化显卡架构,从而提升游戏的速度,比如统一架构的引入;而有些技术则是直观的提升画质,比如HDR更多颜色格式的引入,而我们在讲解的时候会融合两个角度。另外限于篇幅,我们会选择比较重要的改进进行评论,而具体的技术特性则可以参考之前的评测。 ◆ DX10重要改进之一:统一shader架构的引入 下面是DirectX9显卡的典型渲染过程,首先是几何图形的顶点处理,然后生成几何图形最基本组成部分,包括点、线、和三角形等,随后进入PS单元进行像素处理,然后进行ROP光栅处理,进行混合、Z缓存和反锯齿等处理,生成显示画面的最终效果,从而进入本地显存,进入输出部分。 
目前的GPU仍然严格的划分了两个区域来存放Vertex Shader(顶点着色器,简称VS单元)阵列和Pixel Shader(像素着色器,简称PS单元)贴图流水线,GPU会按顺序处理两种数据,对于功能相仿的VS和PS单元来说,这无疑是一种资源冗余,而且这也加重GPU的设计难度及成本,下面的图片可以清晰的说明这种架构会造成的资源浪费。 
左图模拟了两种比较典型的游戏画面,图左是VS和PS单元的工作状态,绿色代表运行,而灰色代表空闲。先来看看上半部分的情况,游戏的画面是一个几何构造十分复杂的场景,这时候GPU需要处理大量的几何顶点数据,而像素处理相对较少,这时候传统GPU就会出现VS单元满负荷运行,而PS单元大量空闲的情况;下半部分恰恰相反,对于水面的渲染没有过多的几何图形处理,而对着色渲染提出了很高的要求,于是GPU的PS单元又出现了满负荷的状况,VS单元则进入比较空闲的状态。 传统的GPU因为采用了分离式的架构,所以经常会出现数据分配问题,极大的影响了渲染效率。而DirectX 10中最大的改进便是引入了统一渲染架构(unified shader),所谓统一渲染架构,最容易的理解方式就是Shader着色单元不再分离。上面右图更能清晰的说明问题,传统的渲染方式中,因为游戏画面的渲染内容不同造成的PS、VS单元负载不同已经不复存在,无论几何图形过于复杂、或者像素渲染过于复杂,GPU都能有效的合理分配处理单元,有效的分配硬件资源。 基于DirectX 10架构的G80图形核心,则通过一个整合VS、PS、GS单元的可编程整合光影处理器来完成目前所有的工作,通过一个专门执行单元的运算,全新的GPU会计算游戏画面的Shader数据类型,从而灵活的调配Shader单元进行不同的数据类型运算,达成资源的合理利用,有效的提高GPU的运算效率。 ◆ DX10重要改进之二:批量渲染 在之前版本的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,只需调用一次函数即可多次,大批量更新。 |