更逼真的3D效果 下代DirectX 10技术前瞻
前言:微软虽然不生产图形芯片,但是它对业界标准的影响可不是任何一家图形芯片厂商所能比拟的!而微软的利器就是—DirectX !无论是对图形芯片厂商、还是对游戏开发者来说,DirectX所带的的影响是没人能及的!
经过几年的发展,目前DirectX已经发展到了V9.0版本。DirectX9.0同时没有令我们失望,其所带来的电影级 画面渲染效果给我们造成的震撼绝不亚于当年的Voodoo。但微软并没有止步不前。
近日微软DirectX技术开发小组已经在相关技术会议上公布了他们下一代DirectX技术的一些相关内容,而在著名的M SDN上也公布了关于下一代DirectX技术的一些总体性的内容。下面我们将根据这些内容了解下一代DirectX将为我们带 来什么样的最新特性。
一、Vertex Shader、Pixel Shader二合为一:一体化着色引擎
微软在DirectX 9中引入了2.0/2.X/3.0三个版本的Vertex Shader(顶点着色引擎)以及Pixel Shader(像素着色引擎)。其中支持2.0版的着色引擎是DirectX 9的GPU的最低标准,而高档GPU则支持加入了拥有更多高级处理功能的2.X版本着色引擎。至于3.0版本的着色引擎,则需要 下一代的GPU如NV40、R420等方可实现硬件级支持。
Pixel Shader 2.0中的通用寄存器数量已经是DirectX 8中的6倍、具有更加复杂,强大的象素渲染能力,而指令集数量则是DirectX 8的指令集数量的平方数,这使得Pixel Shader的功能已经达到DirectX 8中的Vertex Shader水准。与此同时,在Vertex Shader中查找纹理的操作工作量也有所增加,特别是使用了置换贴图技术的应用程序当中这种查找纹理的操作就更为明显了。
而3.0版本着色引擎也同样存在以上情况。对于功能相仿Vertex Shader、Pixel Shader来说,目前图形芯片厂商仍需要在GPU中划分两个区域来存放Vertex Shader阵列和Pixel Shader贴图流水线。这无疑是一种资源冗余,而且这也加重GPU的设计难度及成本。那么,有没有可能把这两者整合在一起呢? 答案就是肯定的!
[img]http://www.myhard.com/imagesnew/hardware/0205/zuoxd040205042.jpg[/img]
微软将DirectX 10引入了Integrated Shader的概念,通过一个整合Vertex Shader、 Pixel Shader的Integrated Shader(可编程整合光影处理器)来完成目前Vertex Shader、Pixel Shader所有的工作。这样在硬件上,设计者就无需为不同的着色引擎设计不同的执行单元,只要按照所对应的接口以及操作方式全 部融为一体,仅设置一种独立的Shader执行单元。这意味着GPU厂家可以用更小的核心来实现现在需要用8000万甚至更多晶 体管才能实现的功能!
统一着色引擎是一项重要而有意义的作法。比如说,当我们需要处理Vertex特效的时候,但这种特效又需要应用Pixel Shader指令(或者在处理Pixel特效,但却需要Vertex Shader方面的支持),就会常常出现资源紧缺的情况。而一体化着色引擎则可以帮我们解决硬件资源上的限制—你能够不受限制地 使用纹理资源,并可以使用任意长度的着色指令。但是否能实现这个梦想,目前我们还需要解决一个问题—GPU显存控制器的问题……
二、虚拟显存技术
目前消费类显卡的显存系统都是根据GPU核心运算法则进行设计的,而象纹理、顶点、三角形以及荫影等这些需要处理的数据都是 存入在显存之中。如果打算用纹理贴图对几何框架进行渲染,但此时显存之中还没有加载所需要使用的纹理贴图数据,那么GPU只有等 待纹理贴图被载入显存后才能进行渲染处理。因此这种设计存在很多问题的。
首先这种处理方式相当浪费资源,对任意一帧来说,我们在很多情况下未必会使用到所有的纹理贴图如mip-map(纹理细化) ,但实际上需要最少资源消耗的mip-map占用了很大的显存带宽。
提示:MIP-map的原理是事先把贴图用各种大小的过大处理,建立许多不同大小的贴图。将来在缩小的时候,只要选择适当的 大小,就不需要使用超过 2x2 的过滤。例如:如果贴图的大小是 256×256,可以事先计算出128×128、64×64、32×32、……、4×4、2×2 和1×1不同分辨率下需要的贴图。假设现在对贴图做重新取样,需要缩小5倍,这时只要取用64×64的版本就可以很快得到重新取 样的结果,而不需要再对原来的贴图做5×5的过滤。这个过程有点像放幻灯片,随着渲染场景的变化来“播放”不同分辨率的贴图。
在很多情况下,仅仅需要非常低分辨率的贴图就可以完成工作,而用大量的带宽去传接小量的数据无疑很消费。在传输少量的纹理贴 图数据的时候,这个问题还不会显得十分突出,但当我们不断的去传送这些纹理贴图的时候呢?目前显卡的内部带宽基本上是AGP总线 带宽的10倍,当用完显存容量之时问题是显而易见了—此时3D应用程序的帧速就开始变得十分不稳定并出现大幅度的下降。
目前最简单的解决方法,就是将多出来的纹理、顶点缓存(Vertex Buffer)最好放在AGP显存中,GPU透过AGP总线读取这些数据。不过,AGP总线速度与显存总线速度并不对称—AGP 总线速度要远低于显存总线速度。在并不是数据都需要通过AGP总线传输的情况下,系统就会以“从低原则”以AGP总线速度来传输 所有的纹理数据。因此这个方法也并不是很令人满意。
此时人们想到利用CPU管理内存的方式来解决这个问题,毕竟目前GPU越来越像CPU了。在CPU中,我们不可能把所有的程 序都放在处理器本身的缓存当中,但直接从外部存储器中执行程序又会变得很慢。因此人们引入虚拟内存来突破物理内存的限制。
通过虚拟内存管理模式,程序员不再为CPU内部的缓存和外部存储器的容量而担心,替代方案是将所有存储设备都安置到一个虚拟 寻址空间并被划分为一个个较小的内存页面(每个内存页面尺寸为4K)。在虚拟寻址空间里是按优化处理原则来管理这些页面—急需处 理的页面放置在缓存之中,次之的则存放在系统内存中,而如果内存容量不足之时系统就会将这些页面存放到硬盘里。
因此,微软根据虚拟内存管理方法将在DirectX 10中引入虚拟显存技术。虚拟显存将可以很好的解决以上所提到的问题,所有的纹理、着色等都分成“小块”数据即使在低速总线上也 能流畅传输。例如,一个4KB大小的页面相当于一个32×32×32bit大小的纹理贴图,这样大小的纹理贴图已经可以满足需要 ,这样在需要纹理渲染时系统就不需要传输太多"页面"就可以完成相应的工作。而做到这一切几乎不会损失性能。
此外,虚拟显存技术还可以改善资源限制的问题。首先AGP/系统内存拥有更灵活的储存空间,从而更有好地利用带宽及内存。其 次,由于虚拟显存使用统一的逻辑地址空间,只要在整个虚拟寻址空间内,用户可以自由使用。对于那些极耗显存资源的应用程序来说, 此种方式并不能使其达到最佳性能,但至少可以让这些程序可以顺畅地工作。当然虚拟显存地址空间的并不会很小,例如3Dlab的W ildCat VP使用虚拟显存后就拥16GB的虚拟寻址空间。很明显当你能完全使用全部16GB时,相信系统瓶颈问题已经不在此。
[img]http://www.myhard.com/imagesnew/hardware/0205/zuoxd040205043.jpg[/img]
将虚拟显存技术与着色引擎搭配也是一个很具创新性的想法。在显存中,着色器指令是被当作一个抽象的数据块进行处理的,系统并 不理会“数据块”能否装得进GPU的指令管线,一旦着色器被载入,它就会在每个顶点以及象素上操作、直至卸载。因此要想完成更长 的着色器指令就需要增加GPU的指令执行管数或利用自动多路形式将指令划分成若干个可管理的小块。
由于GPU的指令执行管数在设计之时就固定好,如果要增加执行管数无疑需要重新设计及增加晶体管数,显然第一种方法并不太实 用。因此第二种方法较为实用,而这也与我们所提到的虚拟显存系统实际是一样的。为了适应着色器指令的执行应用,虚拟显存被划分为 许多相对独立的页面。
假定图形处理单元当中设置的指令执行管道可以执行整个页面所包含的指令,那么我们的着色器操作就可以建立起一套流水线式的运 作机制,加载一个页面,然后运行,停止下来之后再加载一个新的页面,然后运行,如此反覆指导全部包含指令的页面被加载到处理器当 中,此间,执行管道的作用与处理器的L1 Cache相当类似,而整个运作流程和处理器的可以说是一致的。
通过虚拟显存技术,着色指令的长度将可以不受指令执行管数的限制,存储系统可以存放的图象纹理可以更多,寻址的方式变得轻松 简单,于是我们的下一代DirectX技术就实现了可用资源“不受限制”的强大功能。当然了,资源的“不受限制”还是受到硬件实 际可用资源的限制。
指令太长的话,GPU就需要多次加载指令页面,这样也会造成性能大幅度下降;如果纹理数据太多,需要用到系统内存、甚至是硬 盘空间进行存储的话,那么整个图形子系统的性能也会下降。针对这个问题,微软为资源限制定了两个新的门限:只要不超过第一个限定 ,系统都能够工作;而超过第二个限定时,系统就不能够正常工作(在640×480分辨率下,fps值不足10)。
三、整数指令集
编程的时候不必受到指令集的限制是一个相当大的进步,但对于GPU来说,要达到这一点还需要很长的路要走。其中第一个需要改进之 处就是整数处理运算方面。目前,着色器所处理的所有东西都需要依靠浮点运算所完成(除了静态分支预测试运算之外)。在大多数的图 像处理上来说,这种处理方式是没有问题的。但进行动态分支预测或非内插式内存搜索时(比如对顶点缓存器进行定位索引时),这种浮 点运算处理方式就存在很大的问题。
在目前的GPU中唯一需要内存寻址的就是纹理寻索,而这些纹理数据均为浮点值。如果寻址值不能与纹理数据相对应的话,那么系 统就会取最接近的纹理数据值(采样点)或者几个纹理数据的内插值作为我们需要的纹理数据取值。对于图象的纹理效果而言,这样的做 法完全没有问题,但却不能实现通用化内存寻址操作,因为用不是很精确的浮点数是无法将连续的内存块进行精确的标识。微软将在一体 化着色引擎中加入了相应的指令集,来解决上述问题。
四、通用I/O模型
一体化着色引擎设计带来了很多有意思的结果,当然这一切仍不能马上看到。其中最明显的就是在顶点着色器对纹理贴图的进行处理操作 之上,这对于常规的置换贴图相当重要的。另外一个相对不那么明显的结果主要体现在顶点着色器直接对顶点缓存进行写数据的操作之上 ,这对高速缓存计算结果起到一个延迟的作用。而这项功能对于高阶曲面以及置换贴图应用相当重要。比如可以将镶嵌或置换贴图暂时存 入在显存当中的顶点缓存当中,在以后的使用中只要查找到并应用即可。
正是遵从这种观点,下一代DirectX中将引入一个通用的输入/输出模型。这时你可以将需要的数据写入到显存中,而这些数 据都可以被任意阶段的管线读取或者也可以迟些时候再被调用。在这里的数据类型并不受限制,可以顶点、象素以及其他任何图像相关的 核心数据。只要利用通用索引值及顶点缓冲器,你就能让系统根据联通性信息绘出图象轮廓。
事实上,你可以生成任意的光影效果,所有的光影特效都可以在GPU的一个周期内完成,同时可以将运算结果存放在显存中并到下 一个渲染场景中利用。大家是不否可以看这个功能的最大特点:可以大大减少GPU的工作负荷,提高运算性能!
五、拓朴处理器
实际上,今天的GPU都能创造新三角,但事实上象线、点这些绘描素材仍在许多地方需要应用。但大多数消费类GPU仅仅具有产 生三角形能力,这意思着所有的线、点也需要转换成三角形才能进行相应的渲染工作。点、线都是以二个三角形来完成,这意味着无论任 何时候都需要2~6个顶点(这取决于索引的方法)。从本质上来说,这种处理方式有一定的优点—这样可以使渲染更准确。
不过目前所有这些都需要依赖于管线编程完成,在资源紧张的情况下为极易造成游戏画面停滞。因此,微软将在下一代Direct X中引入“拓扑处理器”来解决这个问题---所有的点、线转换都可由拓扑处理器来完成。从逻辑上来说,这个拓扑处理器和镶嵌单元 是相互独立的,这个处理器在两种操作集中均可以使用。
七、增强型图形镶嵌技术
高阶曲面技术最先引入到DirectX 8中,而且最初的芯片都硬件支持这项技术(nVIDIA将它称为“RT-Patch”技术,而ATi则称为“N-Patch”技 术),但两者所带来的效果相当有限而实现上又有所难度,因此不少开发商都这种技术失去了兴趣,而图形芯片厂商最终也放弃对这项技 术的硬件支持。直到DirectX 9引入适应图形镶嵌以及置换贴图技术这种情况才有所改变。
不过高阶曲面技术在实现便利性及效果方面并没有多大改变,真正引进开发商感兴趣的是置换贴图技术。但不幸的是,硬件芯片厂商 已经放弃了对高阶曲面的支持,虽然程序开发商对于置换贴图技术相当感兴趣但苦于没有硬件支持也只好放弃采用这项技术。
[img]http://www.myhard.com/imagesnew/hardware/0205/zuoxd040205044.jpg[/img]
其实置换贴图是Matrox自己研发的技术,被微软整合进了DirectX 9。利用此技术,设计师可以使用一层“置换贴图”来记录几何信息而不是直接使用数量庞大的多边形来制作物件,在这种贴图上有专门 经过编码的纪录物体几何表面的定点高度信息。不同于凹凸贴图,置换贴图技术精确地描述了物体的外形,使得其光线反射和阴影投射的 效果更加真实。
深度适配顶点镶嵌和顶点纹理技术,加上重组基础网面与置换贴图,可以营造一个非常真实的3D图形。不过,置换贴图在应用上有 一些问题,主要体现在高阶曲面之上。与象R Patche和Patche这样的曲面配合时,置换贴图必须由设计师小心使用,如果使用不当的话,可能会导致难看的图象问题。正 因为受此限制,此技术也没有得到广泛支持,甚至Matrox自己最后也放弃了对这项技术的支持。
随着支持Pixel Shader 3.0以及Vertex Shader 3.0的图形芯片的推出,高阶曲面镶嵌以及置换贴图这两项技术将有望在新一代的图形芯片中得到支持,但当前DirectX技术在 支持高阶曲面上仍存在一定问题。
[img]http://www.myhard.com/imagesnew/hardware/0205/zuoxd040205045.jpg[/img]
如果硬件芯片直接支持各种通用高阶曲面计算的公式比如Catmull-Rom曲面、贝赛尔曲线、B-Splines曲线、圆 锥曲线等,将是一个极有趣的创新。而在此基础之上能够支持自适应镶嵌贴图技术无疑是锦上添花,如果在DirectX都支持以上所 述的各种高阶曲面技术,这样我们就可以设计的场景中不受限制就可以实现这些效果。
值得大家兴奋的是微软将在下一代DirectX中支持上面所提及的一切。整合了置换贴图、拓扑处理器使得这项功能变得很具实 用性,当然这些也需要图形芯片进行硬件支持。
七、改进的通用API接口
微软不是将所有的改进都集中的特性方面,也有不少改进是针对DirectX接口的。就目前而言,如果我们需要渲染一个场景, 每个物体都必须被分割成一批几何结构,同一批的几何结构将使用同样的纹理贴图、同样的顶点缓存数据、完全一致的着色器和同样的转 换矩阵。基本上,如果某一几何体与众不同的话,那么它就需要被拿出来进行单独渲染。
整个过程需要通过DirectX接口函数、显卡的驱动程序调用及GPU三者来实现,这在一定程度上占用了不少系统资源。不过 ,其中一部分资源损耗可以利用操作系统的接口来降低,而微软计划在Longhorn操作系统中实现这一功能。另外一种解决的办法 就是在图形芯片当中加入“网格列举”技术。网格列举技术首先选取一个单一的网格,然后通过不同的转换、不同的纹理贴图以及不同的 置换贴图列举出几个不同的实例。
[img]http://www.myhard.com/imagesnew/hardware/0205/zuoxd040205046.jpg[/img]
实际上,给定一个通用的输入输出模型,开发人员可以将所有可见的纹理以及变换矩阵放到一个数组当中,所有的着色器都可以访问 这个数组,并将几何结构作为一个整批的结构提交给所有的着色器共享,然后就让着色器来决定哪一个几何结构应当采用什么样的纹理以 及转换矩阵。这种方式将极大程度的降低CPU工作量,让GPU完成所有工作。
八、Pixel Shader的帧缓存操作
通常时你可能会考虑如何对图象进行一些额外处理工作,比如说数字分级、色彩校正或颜色调和。然而,由于在DirectX 9中大部分情况处于实时渲染模式,我们都无法实现这一切。事实上,当你读取渲染中图象的纹理数据,大多数的GPU和驱动程序都可 以工作。但这属于非法操作(没有经过定义),这样的操作随时可能被中断,而开发人员通常不会使用这项功能。
解决的办法就是建立两个独立的纹理,在两者中设定一个为预备纹理来进行相应附加处理,但这样意味着需要占用两倍的存储空间。 不过,下一代DirectX中,开发者终于实现期盼以久的功能—在Pixel Shader中直接对帧缓存进行存取操作(目前仅限于Pixel)。但并不意味着在下一代DirectX中进行实时渲染模式就毫 无问题,并且厂商可能放弃了对这种技术的支持。那样这项技术很可能以一种备选方案出现,如此一来,程序员可能会忽略这项技术的存 在而继续沿用老方法
不过,图形芯片厂商可能会在Pixel Shader中通过模拟混合函数的实现以上功能。ATi已经在他们的GPU芯片中加入了类似的做法,他们通过顶点着色引擎来模拟 原有的固定顶点处理函数。这样就意味着GPU设计厂商需要在着色引擎上增加额外的晶体管来实现以上的功能。 结论
可以说,下一代DirectX将比DirectX9有很大改进,其中最为引人瞩目的就是一体化着色引擎和虚拟显存这两项技术 。这将对未来图形芯片的架构、性能及发展方向带来巨大的影响。我们也相信随着硬件技术的发展以及软件技术的革新,我们将能够不断 的享受到越来越逼真的3D效果。
页:
[1]