【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3473|回复: 4

技术/画面/性能全面展示DX10先进特性

[复制链接]
发表于 2007-11-8 16:53:11 | 显示全部楼层 |阅读模式
:[DX10技术探讨](一):统一架构和批量渲染

    我们将从技术层面和游戏画面融合的角度来讲解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,只需调用一次函数即可多次,大批量更新。

 楼主| 发表于 2007-11-8 16:57:40 | 显示全部楼层

◆ DX10重要改进之八:几何单元的加入

    在DirectX 10中引入了一个全新的Shader单元,那就是Geometry Shader(几何着色器,简称GS单元),它将处理之前VS单元和PS单元很难完成的渲染任务。目前DirectX的处理顺序简化来看是顶点数据准备、VS单元处理、光栅化计算、PS单元处理。因为处理过程是顺序进行的,所以VS单元和PS单元的输入和输出是一一对应的,并不会创造新的几何物体,但是GS单元却不同,它让GPU有创造全新几何物体的机会。

『GS单元被安排在VS单元之后,它能处理更为复杂的几何图形』

    在整个游戏场景中,绘制的几何图形的任务量非常庞大,如果仅仅依靠Vertex Shader单一来完成,效率会极其低下。而更致命的是VS无法单独生成或重组多边形(缺乏Tessellation),所以在以往只有VS跟PS的GPU中,生成越复杂的模型CPU的负载就越大。

    而GS单元不同于VS单元的地方是GS单元可以一次最多处理6个顶点数据,也可以简单的理解为它可以实现顶点的批量处理,GS单元可以借助相邻顶点的信息,让GPU在不依靠CPU的帮助下直接提供更为精细的模型细节。另外GS单元的输出几何单元可以和输入几何单元的数量不同,这样它就可以灵活的增加场景中的几何单元,从而达成更丰富的场景内容。GS单元的数据处理是安排在VS单元之后,PS单元之前的,因为GS单元处理是一个几何单元而不是单独一个顶点,所以会有一个几何单元组装器来帮助顶点数据的整合。

『应用了GS单元的鱼模型更加复杂,但却不会加大CPU的负载』

    具体来说,GS单元可以方便的实现复杂的烟雾、爆炸、皮毛、毛发等图象处理,甚至可以模拟一些简单的运动轨迹等,而这些操作很多时候已经不再需要CPU的干预,以更好的发挥系统的3D效率。在全新的G80图形核心中,GS单元已经有效的和VS、PS单元整合到了一起,从统一渲染架构中获得更大的效益。

◆ DX10重要改进之九:新的HDR颜色格式

    从Shader Model 3.0开始,HDR成为外界所关注焦点,HDR可以通过浮点的格式,以及颜色的格式,为光照、纹理等等运算,提供颜色范围和精度。在DirectX 10中,微软引入了两种全新的格式:R11G11B10和R9G9B9。

    这两个新的HDR格式可以提供FP16的动态范围,而保证只使用此前一半的存储信息。新的R11G11B10格式对存储纹理进行了优化,它为红和绿色使用11-bits的数据,而蓝色则为10-bits,第二个浮点格式则是被设计成一个渲染对象,这两个格式都可以提供高动态范围渲染的同时保证存储和带宽的开销。


 楼主| 发表于 2007-11-8 17:16:36 | 显示全部楼层

◆ DX10的重要改进十、十一、十二等等……

    Alpha to coverage:游戏中通常会使用带透明部位的多边形(alpha纹理)来代替复杂的几何图形,其中包括树叶以及像栅栏、扶手一样的重复性很高的物品,在渲染的过程中,透明和非透明部位连接的地方将出现很严重的锯齿,alpha渲染可以解决这个问题,但是需要多边形被分类并且从后往前渲染,这将带来非常大的性能损失,DirectX 10提供了一个alpha to coverage的技术来解决这个问题。

    Shadow map filtering(阴影帖图过滤):Shadow map此前一直是渲染阴影的一个常用的算法,不过通常受到有限分辩率的影响,阴影帖图一直会由比较严重的锯齿,通过阴影帖图过滤,任何一种种类的阴影处理将会非常的柔和和真实。

    Access to Multi-sampling Sub-Samples(多采样子纹理的访问):此前进行的multi-sample anti-aliasing (MSAA)处理是在管线处理的非常靠后的阶段,这个阶段子样本不能在存储器中被并发使用,而DirectX 10则允许绑定MSAA渲染对象为纹理,从而对子样本的访问可以独立进行,这将给程序员有更好的灵活性,来实现对它的控制。

    Per-Pixel Displacement Mapping(每像素置换帖图):此前我们对在geometry shader的一些作用进行了介绍,通过geometry shader和pixel shader的组合,在不产生新的几何信息的情况下,就可以实现高性能的标准displacement mapping。

    Procedural Growth Simulation(程序化成长模拟):在Geforce 3时代,NVIDIA就引入了可编程的shaders,开发者可以实现程序化的生物生长效果,这些程序化效果是基于即时计算,而不是预先做好的数据,由于受到GPU性能的限制,并没有非常自如的采用,这些效果也在诸如火、水以及其它粒子效果中用到。

    但是到DirectX 10和几何shader的帮助下,这将不是问题,上图就是一个水下生态系统的截图,那些珊瑚和其它植物也在生态系统的帮助下自行生长,这将会是未来游戏的一个很好的例子。

 楼主| 发表于 2007-11-8 16:56:53 | 显示全部楼层

◆ DX10重要改进之三:渲染预测

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

『Early Z技术可以更早判定无用像素』

    NVIDIA就是采用了Early Z技术来实现渲染预测,它会在像素进入PS单元之前判断这个像素的价值,如果判断为无用像素,就直接省去了进入PS单元的过程,从而节省了相应的渲染单元,提高渲染效率。具备Early Z技术的GeForce 8800 GTX GPU可以相对于7900 GTX提升4倍的无用像素选择速度。

◆ DX10重要改进之四:纹理阵列

    包括在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的细节精细度和多样性,都有了极大的提升。


 楼主| 发表于 2007-11-8 16:57:15 | 显示全部楼层

◆ DX10重要改进之五:SM4.0

    Shader Model 3.0则是DirectX9.0c最大的特色。虽然DirectX9.0c与DirectX9.0b仅仅只是一个字母之差,但DirectX9.0c所支持的SM3.0与DirectX9.0b所支持的SM2.0在功能、特效方面却有差很大的差别。在即将推出的DirectX10中,SM4.0将取代SM3.0成为更为先进的shader模式,那它在指令集方面有什么进一步的提升呢?下图是近几代DirectX的对比。

  

『近几代DirectX的对比』

    SM4.0规格令游戏程序开发员有更大的空间,相比原先的Shader Model 3.0自然继续有所提升,特别是对于最大指令数从512条增加到了64k条;暂存器数量也从原先的32个增加到惊人的4096个,而同时Texture由SM3.0的16个提升至128个,并硬件支持RGBE,令HDR不再需要特别的Decoding处理也能实现,HDR+AA将不再有这么多的麻烦。在数据流的控制方面,DirectX10也完全转为动态控制,比较之前的动态静态结合的方式更进了一步。

『SM4.0灵活的编程环境将实现更为逼真的画面』

    对于2D的纹理尺寸支持来看,DirectX 10也有惊人的提升,8192x8192的最高纹理分辩率比原先最高2048x2048的分辩率要高出许多。值得注意的是,DirectX 10中将不在使用FP16数据,转而只支持FP32运算,并且也支持32位的纹理格式,可想而知,对于DirectX 10的显示卡来说,进行完全的FP32运算将可以获得更精细的画面。

◆ DX10重要改进之六:更多的渲染目标

    图形特效的逐渐增加,对于目标的数量要求也越来越多。一般来说,RT可能需要在物件的位置、pixel等部分,绘制一切的信息。为了提高效率,不少图形卡都可以支持,在Shader执行结束后,把不同的信息,绘制到不同的RT中。在DirectX 9中就已经支持这种机制了,但是它约束最多同时向四个渲染目标绘制,而DirectX 10将这个数量提升了一倍,达到了8个。

◆ DX10重要改进之七:流输出

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-6 11:31

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表