正在阅读:详细剖析DirectX10和统一Shader架构威力详细剖析DirectX10和统一Shader架构威力

2007-02-02 11:38 出处:PConline 作者:海盗旗 责任编辑:zhouxijian

  微软在2007年1月31日正式发布举世瞩目的Windows Vista操作系统,而作为重头戏的DirectX 10也史无前例得离我们那么近。本文会DirectX10和统一Shader架构做一些介绍。由于目前NVIDIA的G80为唯一硬件支持DirectX 10的显卡,因而在下面的介绍下,会用G80作为例子。

  DirectX 10最大的革新就是统一渲染架构(Unified Shader Architecture)。目前的GPU架构还是沿用的分离式渲染架构,目前NVIDIA的G71和ATI的R580都是采用这样的架构,顶点渲染和像素渲染各自独立进行,而且一旦当架构确定下来,顶点和像素shader单元的比例就会固定下来。不过分离式渲染架构设计更为简便而且经验丰富,例如NVIDIA的NV40发成到后来的G70/G71,又或者是R420到R580,性能都得到显而易见的提升。

 

 

详细剖析DirectX10和统一Shader架构威力

  微软认为这种分离渲染架构不够灵活,不同的GPU,其像素渲染单元和顶点渲染单元的比例不一样,大大限制了开发人员自由发挥的空间。不同的应用程序和游戏对像素渲染和顶点渲染的需求不一样,导致GPU的运算资源得不到充分利用。微软在DirectX 10中提出了统一渲染架构,在通用和独立的shader单元中可以执行不同的shader程序,包括vertex、pixel和在DirectX 10中首次提出的geomery shader。而且随着这些通用独立的shader单元功能的不断完善,日后有望执行更多的shader程序,例如物理效果。

详细剖析DirectX10和统一Shader架构威力

  相对顶点渲染来说,像素渲染将面临大规模使用纹理所带来的材质延迟,这是统一渲染架构急待解决的问题。不过在Geforce880 GPU里面,这种情况得到很大的改善,分组的steam processor都用联立一定数量的texture单元和L1/L2高速缓存。

详细剖析DirectX10和统一Shader架构威力

详细剖析DirectX10和统一Shader架构威力
(更多的纹理意味着物体表面精度更真实)

  Shader Modle 4.0无论是vertex还是pixel指令,最大指令长度相当于Shader Modle 3.0的128倍(64K),越长越复杂的指令可以产生越真实的画面,Shader Modle 4.0的寄存器也激增到4096个,Constant寄存器采用16×4096阵列。input寄存器采用16/32规格等,上述指标都比以前的DirectX有明显的改进。Shader Modle 4.0允许程序员在渲染物体时使用128个纹理,而DirectX 9只提供4/16规格,更多的纹理意味着物体表面精度更真实,游戏开发者拥有更广泛的选择。

详细剖析DirectX10和统一Shader架构威力

  在不同应用程序和游戏中,vertex shader和pixel shader的需求比例不尽相同, 十分不幸地在Geforce8800 GPU之前,GPU里面的vertex shader和pixel shader的比例是固定。显然unified的实际适应性更强,从下面的例子我们可以看到在unified shader架构的威力,大大提升了GPU的硬件使用率,尽量避免shader空闲的情况发生。

详细剖析DirectX10和统一Shader架构威力

详细剖析DirectX10和统一Shader架构威力

详细剖析DirectX10和统一Shader架构威力

  在典型的HDR代表游戏《上古卷轴4:湮灭》中,7900GTX在2048x1536并开启HDR的情况下,FPS惨不忍睹。独立渲染的草丛或者树叶是由庞大数量的多边形构成,对GPU的vertex shader和geomery shader提出严酷要求,相对来说并不需要太多像素操作,如此一来大规模的像素渲染被闲置而顶点模块处于不堪重负状态。Unified shader架构则可以帮我们解决硬件资源上的限制,Unified shader架构也尽量降低了shader单元的闲置率。

  geomery shading是DirectX10的新特性,streaming  processors可以处理几何运算,大大减轻了CPU在几何运算的负载。GPU分派器和控制逻辑可以动态的指派streaming processpors进行vertex、pixel、geometry等操作,因为他们是通用的。显然unified shader设计可以建立更加平衡的shader工作机制,但是传统的pipeline定义不再适用,在未来,可能其他特性的预算也可以通过unified streaming processor去完成。我们看看geomery shader的情况。

  Input Assembler(IA)从顶点缓冲区上的输入流中接收顶点数据,并且把数据项转换为规范的格式。vertex shader通常用来把顶点从模型空间变换到平面空间,vertex shader读取一个顶点,输出一个顶点。Pixel Shader读取单一pixel属性,输出包含颜色和Z信息的的片断。而geometry shader是DirectX10提出的,把同一区域的所有顶点作为输入,产生新的顶点或者区域。此外steam output把geometry shader输出的顶点信息复制为4个连续的输出缓冲子集。理论上来说,steam output的输出能力Input Assembler的输入能力相匹配。

  Shader就是一段可以改变像素、顶点和几何学特征的小程序。Vertex Shader是专门处理多边形顶点的。那么Geometry shader就是专门用来处理场景中的几何图形。在过去Vertex Shader每一次运行只能处理一个顶点的数据,并且每次只能输出一个顶点的结果。在整个游戏场景中,绘制的几何图形的任务量非常庞大,如果仅仅依靠Vertex Shader单一来完成,效率会极其低下。

详细剖析DirectX10和统一Shader架构威力

  现在DX10的设计师们在顶点与像素的处理过程中又加入了Geometry shader几何着色器。它可以根据顶点的信息来批量处理几何图形,对Vertex附近的数据进行函数处理,快速创造出新的多边形。通过steam out将这些结果传递给其他Shader或buffer,将CPU从复杂庞大的几何运算中解放出来。大爆炸,粒子效果,瀑布流水等复杂又关联的场景都可以用Geometry shader很逼真的表现出来。

为您推荐

加载更多
加载更多
加载更多
加载更多
加载更多
加载更多
加载更多
加载更多
加载更多
热门排行

DIY论坛帖子排行

最高点击 最高回复 最新
最新资讯离线随时看 聊天吐槽赢奖品