DirectX10
文章来源:[SouVR.com]网络收集整理
作者:Frank/Tracy
发布时间:2010年06月02日
点击数:
次
字号:小 大
能有几千个顶点,需要做复杂的骨骼皮肤动画处理、顶点光照运算等等,然而,GPU是在处理完这些顶点之后,并要把这个角色模型一个像素一个像素地画到画面中时,才开始判断每个像素是否需要画,而当所有的像素都被剔除了时,之前做的顶点处理也就全白费了。在DirectX 10中的绘制预测便正是针对这种情况的解决,简言之,绘制预测通过用一个可以代表某个复杂物体的简单物体来判断这个物体是否被全部挡住了,例如用一个可以罩住刚才那个角色的大盒子,当绘制这个盒子时,如果发现所有的像素都被屏蔽掉了,也即是说这个盒子肯定完全看不见,那么,里面的角色绘制包括骨骼皮肤运算等之类的操作便完成不必进行。而一个盒子顶多有八个顶点,相比处理几千个顶点,开销小得多。
另外,以前这个步骤中有些真运算也需CPU完成的,在DirectX 10中,已经完全交由GPU来做,这也可以在一定程度上减轻CPU的压力。
数据流式输出
数据流式输出也是DirectX 10的重要特性,它允许GPU上的Vertex shader或Geometry shader向显存中添加数据,而这在以往的vertex shader中是不可能的。
在之前的DirectX版本中,vertex shader只能读取显存中已有的顶点数据;而DirectX 10中引入的新的Geometry shader,不但能读取显存中的顶点数据、几何(点、线段、三角形)数据,还可以生成新的几何数据放回显存。批量绘制
在DirectX 9中,对渲染状态的管理一直是个十分信赖于CPU运算能力的操作。所谓渲染状态,是指显卡进行一次绘制操作时所需要设置的各种数据和参数。例如,要绘制一个人物角色,就需要先设置他的几何模型数据的数据格式、纹理过滤模式、半透明混合模式等等,每设置一项,都要调用一次DirectX API,占用大量CPU时间,极大的约束了渲染的性能。
为了使这些操作能够批量的进行,DirectX 10中引入了两个新的结构——状态对像(state object)和常量缓冲(constant buffers)。
状态对像就是将以前的零散状态按照功能归结为几个整体,这样,当要设置一系列相关状态时,无需为每一个状态来调用一次DirectX API,只需要调用一次将这些状态统统设置到显卡中去。
而常量缓冲是另一个十分有意义的机制。在绘制模型前的准备工作中,渲染状态的设置只是一小部分。还是拿绘制人物角色来说,能照亮这个人的光源的颜色、位置、类型、范围等等,都要提前设给显卡;为了通过骨骼来带动他的皮肤做出姿势,还要设置骨骼的位置信息等等,而这些东西主要都是通过GPU中的常量寄存器(constant registers)来传递给它的。每个常量寄存器可以存储一个4维的浮点型向量(即四个浮点数)。常量寄存器是游戏程序向GPU输入游戏场景中数据的重要途径。
在DirectX 9中,这种常量寄存器的数量是十分有限的,而且每次更新一个寄存器,都需要调用一次DirectX API函数。DirectX 10通过使用常量缓冲(constant buffer)这种结构,在每个constant buffer中都可以容纳4096个常量,而且只需调用一次API就可以更新一大批常量。
比如说,在以前的DirectX版本中,如果程序想在场景里画很多的树木和杂草,可以采用一个类似于“克隆”的方法:先做好一棵或几棵树、草的三维模型,然后在画一帧画面时,不停的在不同的位置、方向,用不同的大小为参数,调用DirectX API的绘制函数来画这些模型,就可以画出很多草木来。但是每画一棵,都要设置一大堆参数后调用一次API,这是很耗CPU时间的,所以在以前的游戏中鲜有大规模且细节丰富的森林场景。
而在DirectX 10中,我们可以先把树、草的几个模型设给显卡,然后将所有要画的树木的位置、方向和大小一次性的写入到constant buffer中,这样,显卡便一下把所有的树木和草都一起绘制出来了。
总之,DirectX 10通过提前数据验证、纹理阵列、绘制预测、流式输出、状态对像、常量缓冲等机制,帮助游戏的效果和效率上升到一个新的高度。这样,也避免了之前DirectX版本因CPU负载过大而无法对图形实施更多细节优化的问题。Shader Model 4.0
DirectX 10另一个引人瞩目的特性便是引入了Shader Model 4.0,那么,Shader Model 4.0能够带来怎样的新特性,特别是将它与DirectX 9.0c中Shader Model 3.0相比时?
引入新Shader : Geometry shader
DirectX 10新引入的Geometry Shader,可以简单地编程操纵几何图元,同时, vertex、geometry、pixel shader采用了统一的Sahder架构。
Geometry shaders是可编程图形流水线的一大进步。它第一次允许由GPU来动态的生成和销毁几何图元数据。通过和新的数据流输出功能配合使用,许多以前无法实施的算法现在都可以在GPU中使用了。
统一的Shader架构
在DirectX 9中,Pixel shader总是在各个方面落后于vertex shaders,包括常量寄存器个数、可用的指令个数、shader长度等。程序员需要区分对待这两种shader。
而在shader model 4中,无论 vertex、geometry和pixel shader,均有统一的指令集、同样的临时/常量寄存器个数,它们将平等的共享GPU中的所有可用资源。这样,在编程时便不必再考虑每种shader自身的限制了。
百倍于DirectX 9的可用资源
对于shader中可用的资源,在Shader model 4.0中比原来有了惊人的扩充。就像早期的程序员们绞尽脑汁的省着用可怜的640k内存一样,在使用以前的DirectX开发游戏的过程中,程序员需要小心翼翼的分配珍贵的shader寄存器资源。寄存器的数量,直接影响着shader程序的复杂度。这和在640k内存的 机器上,怎么也不可能写出Microsoft Office这样的大规模软件是同一个道理。
而在DirectX 10中,将临时寄存器由原来的32个扩充到了4096个,将常量寄存器由原来的256个扩充到了65536个。更多的渲染目标(Render Target)
所谓渲染目标,就是指GPU可以把画面绘制到的目标,我们可以把它理解为GPU的画布。一般来说,渲染目标被输出到屏幕上,这样我们就能看到画好的画面了。但是有时为了实现一些特效,某些渲染结果并不直接画到屏幕上,而是再返给GPU做进一步的特效处理,而且渲染目标中也不一定是画好的画面的颜色信息。
根据图形特效的需要,渲染目标可能是每个物体距离屏幕的远近,或者物体表面上每个像素的方向,或者每个物体表面的温度等等,之为了实现特效,可以按需要在其中绘制任何信息。为了提高这种情况下的效率,很多新的显卡都支持在同一遍Shader执行结束后,同时把不同的信息绘制到不同的渲染目标中。在DirectX 9中就已经支持这种机制了,但是它约束最多同时向四个渲染目标绘制。而DirectX 10将这个数量提升了一倍。更多的纹理
在Shader Model 4.0中提供了对纹理阵列(Texture arrays)的支持。在前文中已经对纹理阵列有了比较详细的介绍,在这里只着重介绍一下与shader相关的部分。
在每个纹理阵列中,最多可以保存 512张同样大小的纹理。而且每张贴图的分辨率被扩展到了8192×8192。更大的分辨率意味着纹理中更丰富的细节。在一个shader中能够同时访问的纹理个数被增加到了128个,也就是说在每次执行同一个shader时,可以使用一个纹理阵列的512个纹理中的128个。所以说,在DirectX 10中,纹理的多样性和细节程度将会有大幅的提升。新的HDR颜色格式
要说这些年来在实时图形界炒得最热的概念,应该是HDR了。它通过采用浮点格式的颜色格式来为纹理、光照等计算提供极大的精度和颜色范围(以前的纹理一般 都是采用整数型的颜色格式)。尽管最后显示到屏幕上
共5页
您在第3页
首页 上一页
1 2 3 4 5
下一页
尾页
跳转到页
本页共有3500个字符