1、统一渲染架构
相对于其他方面的技术革新,微软在Shader Model 4.0中引入的统一着色架构才是DX10最大的看点。我们都知道,微软在DirectX 9中引入的了2.0/2.X/3.0三个版本的Vertex Shader(顶点着色引擎)以及Pixel Shader(像素着色引擎)。其中支持2.0版的着色引擎是DirectX 9的GPU的最低标准,而当前主流的显卡已经都硬件支持加入了拥有更多高级处理功能的3.0版本着色引擎。不过,即便是DirectX9.0c,对于功能相仿的Vertex Shader、Pixel Shader来说,目前图形芯片厂商仍需要在GPU中划分两个区域来存放Vertex Shader阵列和Pixel Shader贴图流水线。这无疑是一种资源冗余,而且这也加重GPU的设计难度及成本。当Direct X10把渲染流程更细分为Vertex Shader、Geometry Shader及Pixel Shader,这个情况将会更为明显。那么,有没有可能把这两者整合在一起呢?答案就是肯定的!
统一渲染架构是一项极具创新意义的作法。要知道,在很多时候如果我们处理的一个场景注意是以Pixel Shader计算为主,Vertex Shader计算仅占一小部分的时候,如果采用分离Shader设计的显示核心,就可能存在Vertex Shader计算单元空闲,但Pixel Shader单元过渡计算的现象。同样的也可能存在Pixel Shader数据比较少,但Vertex Shader计算数据过多的问题。这就往往造成了一方面着色单元闲置,另一方着色单元资源紧缺的情况。
统一渲染架构能更有效地利用显卡资源
比如在《上古卷轴4:湮没》中,7900GTX在1600×1200+HDR的环境下,FPS仅为14~50帧左右。这是因为独立渲染的草丛或者树叶是由庞大数量的多边形构成,对GPU的顶点渲染提出了严酷的要求,相对来说并不需要太多像素操作,如此一来大规模的像素渲染被闲置而顶点模块处于不堪重负状态。而统一渲染架构则可以帮我们解决硬件资源上的限制----你能够不受限制地使用纹理资源,并可以使用任意长度的着色指令,如果能够将闲置的像素单元用来处理顶点,那么游戏速度就不会如此可怜了!此外,统一渲染架构将令GPU的角色由单纯为Game Rendering提升至Game Computing的理念,Unified Shading引擎设计更适合异类运算工作(Heterogeneous Computing),例如Physics运算、影像编码运算等,让显卡的应用范畴大幅提升。
2、虚拟显存技术
众所周知,在286/386时代,人们为了利用更多的内存,发明了虚拟寻址技术,今天,这项技术被用到显存身上,将如同当年般震撼,彻底地把显存的利用带到了全新的层次。以往,GPU采用直接内存调用法则,无论是纹理、顶点、多边形、光影,都需要占用显存空间,这些数据的运算量越大,占据的空间也越多。为了避免每次都需要重新计算,人们想到了MIP-MAP纹理映射的方法。当时,纹理贴图的尺寸很小、3D场景亦没有这么复杂,MIP-MAP能够显著地减少GPU计算量和显存的占用。然而,随着3D游戏复杂性的增加,仅靠显存已经无法存储这些数据,不得不开发出AGP总线,利用部分内存作为AGP显存,来暂时存储纹理和顶点数据、补充显存容量的不足。但别说以前的AGP 8X,即使是今天带宽更大的PCI Express X16,亦远远不能与显存带宽相比。更为严重的问题是,为了同步处理,GPU会降低显存的工作速度,使之与显卡显存顺利传输,所以一旦动用显存,系统速度会大为下降。从这方面看,在游戏中提升纹理调节的时候,必须注意自己的显存容量,比如你要玩FarCry、战地1942、等游戏,没有256MB显存,就别想把画质设置到最高,否则会大大地影响游戏速度。
因此,微软根据虚拟内存管理方法将在DirectX 10中引入虚拟显存技术。它可以很好的解决以上所提到的问题,所有的纹理、着色等都分成“小块”数据即使在低速总线上也能流畅传输。例如,一个4KB大小的页面相当于一个32×32×32bit大小的纹理贴图,这样大小的纹理贴图已经可以满足需要,这样在需要纹理渲染时系统就不需要传输太多"页面"就可以完成相应的工作,而做到这一切几乎不会损失性能。
而且将虚拟显存技术与着色引擎搭配也是一个很具创新性的想法。在显存中,着色器指令是被当作一个抽象的数据块进行处理的,系统并不理会“数据块”能否装得进GPU的指令流水线,一旦着色器被载入,它就会在每个顶点以及象素上操作、直至卸载。因此要想完成更长的着色器指令就需要增加GPU的指令执行管数或利用自动多路形式将指令划分成若干个可管理的小块。由于GPU的指令执行管数在设计之时就固定好,如果要增加执行管数无疑需要重新设计及增加晶体管数,显然第一种方法并不太实用。因此第二种方法较为实用,而这也与我们所提到的虚拟显存系统实际是一样的。为了适应着色器指令的执行应用,虚拟显存被划分为许多相对独立的页面。假定图形处理单元当中设置的指令执行管道可以执行整个页面所包含的指令,那么我们的着色器操作就可以建立起一套流水线式的运作机制,加载一个页面,然后运行,停止下来之后再加载一个新的页面,然后运行,如此反覆指导全部包含指令的页面被加载到处理器当中,此间,执行管道的作用与处理器的L1 Cache相当类似,而整个运作流程和处理器的可以说是一致的。
通过虚拟显存技术,着色指令的长度将可以不受指令执行管数的限制,存储系统可以存放的图象纹理可以更多,寻址的方式变得轻松简单,于是我们的DirectX10技术就实现了可用资源“不受限制”的强大功能。当然了,资源的“不受限制”还是受到硬件实际可用资源的限制。指令太长的话,GPU就需要多次加载指令页面,这样也会造成性能大幅度下降;如果纹理数据太多,需要用到系统内存、甚至是硬盘空间进行存储的话,那么整个图形子系统的性能也会下降。针对这个问题,微软为资源限制定了两个门限:只要不超过第一个限定,系统都能够工作;而超过第二个限定时,系统就不能够正常工作(在640×480分辨率下,fps值不足10)。其实,此前已经有厂商使用了虚拟显存技术,3Dlab的专业级显卡野猫WildCat VP就能调度16GB虚拟显存,16GB哦,在主流显存不过256MB的时代,这是多么震奋人心的事情。很明显当你能完全使用全部16GB时,相信系统瓶颈问题已经不在此了。
- 第1页:电影级画质来临——浅谈DirectX发展历史
- 第2页:DirectX 10技术详解上