浅析DirectX11技术带给图形业界的改变(一) 浅析DirectX11技术带给图形业界的改变
前言:2009年10月23日,微软高调发布了其最新一代操作系统——Windows7,这款操作系统相对于之前的Vista系统有相当大的进步,特别核心执行效率方面得到显著改善,并且加入了DirectX 11等新技术。微软此次推出全新图形API——DirectX 11目的很明确,就是能够充分利用显卡资源,旨在游戏以及通用计算方面达到更高的执行效率。今天本文就带大家一起分析DirectX 11技术带给图形业界和游戏玩家的双重体验。同时也让更多人了解到自己是否需要一款支持DirectX 11的显卡,具体选择哪些显卡最为合适。
● DirectX对GPU发展带来的影响
DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它几个组件几乎被人们忽略。
Direct Graphics的优秀表现和微软的影响力,令无数硬件厂商生畏并不断遵循其变化来开发新的图形处理器架构。同时ATI和NVIDIA两家厂商之所以至今仍不断跟随DirectX的步伐,是意识到任何游戏相关的硬件厂商要是被微软抛弃,那么其后果是不堪设想的。
大家都在畅想DirectX技术的未来
在过去的数次DirectX更替中,有几次较大的更新,比如我们熟知的从DirectX 7到DirectX 8到DirectX 9到再DirectX 10,也是因为这样的理由使得芯片变得更大。在向DirectX 8的转移使得可编程的硬件进入管线成为了双重构造。对于DirectX 9的顶点处理与像素处理,则被真正的可编程处理器调换。而在向DirectX 10的转移为了实现更灵活的可编程性,需要GPU架构进行根本的改革。
所以哪个世代的改变以及生产什么样的GPU都关乎根本性的改革,而这种改革基本上都是围绕DirectX这个最重要的图形API来进行的。特别是DirectX 10时代架构的改革,从根本上改变了GPU的本质。从DirectX 8向DirectX 9通过API的改革牵动了GPU架构的改革,而架构巨大变化的转折点则是DirectX 10。
DirectX 10时代 着色器单元走向统一
在DirectX 10时代,我们非常有幸看到了Pixel Shader(顶点着色器)、Vertex Shader(像素着色器)和Geometry Shader(几何着色器),三种具体的硬件逻辑被整合为一个全功能的着色器Shader。但是我们也发现,GPU在性能提升的同时,芯片规模发生了更快速的放大,这不得不让人担心未来GPU的功耗和发热等等问题。
事实上芯片变大有两个主要原因。一个是因为性能的增加。要提高运算性能就会需要更多的资源,这会增加晶体管的数量。另一个就是为了发展可编程化。需要让单一的可编程处理器包括个别进行处理的固定功能硬件,这必然也会增加晶体管数量。可是这样会让性能出现大幅度下滑,因此为了保持同样的性能也需要大幅度增加运算资源。结果就是对于GPU的情况需要从固定硬用向可编程硬件转换,晶体管数和核心尺寸也因此而增加。
直到今天我们看到的DirectX 11出现,这个问题得到了一个平衡的解决方案。DirectX 10带来了众多绚丽无比的新特效,但“滥用”各种特效最终导致GPU不堪重负。在DirectX 10经历了种种波折,瓶颈尽显时,微软也开始将重心集中在如何提升算法和效率上面,而不是一味的加入新特效或提高模型复杂度。因此我们看到的DirectX 11,已经将技术重心放在如何用最小的硬件开销在先进图形技术的辅助下实现最佳的渲染效果。
● DirectX 11带来的全新特性
DirectX 11作为一套全新的图形API,提供给图形开发者和用户极大的想象空间,同时降低了开发难度,节省硬件资源,特别是后两个特点,是DirectX 11区别与以往的DirectX最为显著的特点。
2009年NVISION大会上,微软就透漏了DirectX 11的大量细节,此时DirectX 11已经完全成熟并获得硬件厂商支持,就等和Win7操作系统一同上市了。同时借助SIGGRAPH以及GameFest 2008大会上放出的幻灯片,我们可以进行一些深入的研究。此外,DX11特性的提前放出,对于目前DX10以及DX10.1硬件用户而言也很有帮助,因为AMD和NVIDIA可以照此提前开发适当的驱动支持。
回顾历次DirectX的更替过程,几乎都对GPU架构产生了颠覆性的影响,它们大部分要求GPU改变现有的着色器Shader单元结构,或者为着色器Shader单元追加资源,这些改进都是为了让GPU的指令数提升,寄存器数量增加,纹理规模提升,材质Texture精度提升。这样的改进难免带来晶体管数量的增长,也就说说GPU内部的每个着色器Shader单元变得更加庞大。
DirectX 11发布后,人们发现微软并没有在Shader Model方面做出重要提升,虽然版本升至Shader Model 5.0,但是更重要的是它实际上可以被看作是DirectX 10和DirectX 10.1的功能补全,你也可以认为它是DirectX 10和DirectX 10.1的超集,如果换个角度大胆设想,我们今天看到的DirectX 11才是微软想要的DirectX 10完美形态。
DirectX 11针对不同方面带来了全新的特性,目前通过现有资料分析,它主要有以下几个方面的提升:
DirectX 11带来的全新特性
● 着色器版本提升到Shader Model 5.0,采用面向对象的概念,并且完全可以支持双精度数据。 ● Tessellation曲面细分技术获得微软正式支持,逐渐走向成熟; ● Multithreading多线程处理,让图形处理面对多线程编程环境不再尴尬; ● 提出微软自己的Compute Shader通用计算概念,把GPU通用计算推向新的巅峰; ● 新的Texture Compression纹理压缩方案,在画质损失极小的环境下带来了硬件资源的节约。
在今天的分析中,我们将重点放在Tessellation曲面细分技术方面,因为这是DirectX 11最为突出的特色之一,也是给图形运算产生深远影响的一项技术,DirectX 11的其他特点我们也会提及。
● Tessellation技术简析
Tessellation又可译作拆嵌式细分曲面技术。其实这是ATI早在其第一代DirectX 10图形核心R600,即HD2900XT上就引入的一个特殊的计算模块。从HD2000系列开始,直到最新的HD5000系列,整整4代显卡全部支持这一技术。即使目前也仍然没有游戏能够支持这一技术,ATI也依然没有放弃在这项技术上的努力——从名字上也可以看出ATI在这项技术上的心血:Tessell-ATI-on。
Tessellation主要是靠GPU内部的一个模块Programmable Tessellator(可编程拆嵌器)来实现的。能够根据3D模型中已经有的顶点,根据不同的需求,按照不同的规则,进行插值,将一个多边形拆分成为多个多边形。而这个过程都是可以由编程来控制的,这样就很好的解决了效率和效果的矛盾。TessellATIon能自动创造出数百倍与原始模型的顶点,这些不是虚拟的顶点,而是实实在在的顶点,效果是等同于建模的时候直接设计出来的。
很明显,DirectX 11中的Tessellation让雪山的凹凸感更为明显,远胜于DirectX 10里所采用的视差映射贴图技术。虽然后者在较远距离观看的时候也能提供一定的视觉欺骗性,但和 Tessellation技术塑造出来的真实感觉还相差太远。我们使用的分析图来自AMD在R600发布时放出的一段Demo,这段Demo区别于以往的设计方式,它没有突出主角而淡化背景,因为在没有Tessellation技术之前,大量顶点的生成和随之而来的计算将给GPU的几何处理部分带来巨大压力,无法流畅运行,而Tessellation技术改变了这一模式。
除了大幅提升模型细节和画质外,Tessellation最吸引程序员的地方就是:他们无需手动设计上百万个三角形的复杂模型,只需简单勾绘一个轮廓,剩下的就可以交给Tessellation技术自动拆嵌,大大提高了开发效率;而且简单的模型在GPU处理时也能大幅节约显存开销,令渲染速度大幅提升。
● Tessellation技术历史回顾
Tessellation技术最早可以追溯到DX8时代,当时ATI就已经和微软联手开发了TruForm(N-Patch)技术,也就是Tessellation的前身,并被纳入DX8.1的范畴。
2001年,ATI公布了TruForm的技术细节,相关媒体也对这一技术进行了报道。简单地说TruForm技术就是将在芯片内部将游戏中的三角形转换成曲面然后再转换成一个新的三角形,这个三角形可以在场景中显示。
当三角形信息通过图形芯片时,TruForm技术开始工作,它通过创建N-Patch来形成N-Patch网格。
N-Patch网格是一个曲面,通过线性三角形信息来定义。N-Patches在三角形每个边放两个控制点,这样就产生了六个新的顶点。这些控制点都在一个单独的平面上,可以位于原三角形之下或者之上。使用储存在原三角形的顶点向量的信息,可以决定控制点的位置。
当然,这并不是一个简单的工作,而这正是TruForm技术的用处所在。当时人们认为它是ATI下一代显卡Radeon2的独门武器。在当时GPU运算能力极为有限的情况下,N-Patch技术可以大幅提升3D模型的细节和显示效果。
但是它却出现了一些非常遗憾的失误,导致这项技术最终被用户放弃。因为N-Patch技术技术比较适合于海豚、赛车等表面为曲面的模型上,而如果这个技术应用在坦克等不需要做曲面化的模型上的时候,效果就会变得相当的滑稽。
Tessellation技术带来的3D流水线变化
N-Patch/TruForm技术就这样被市场边缘化,但是ATI还是没有放弃对它的开发和研究。终于在2005年出现了转机,在微软与ATI的合作结晶——专为XBOX360设计的图形芯片Xenos当中,经过改进的N-Patch/TruForm技术重出江湖,这次ATI将它直接命名为我们熟悉的TessellATIon,直译为“拆嵌”意译为“细分曲面”,同时表示ATI在这项技术中不可磨灭的贡献。
● Tessellation技术拆解分析
Tessellation这个英文单词直译为“镶嵌”,也就是在顶点与顶点之间自动嵌入新的顶点。Tessellation经常被意译为“细分曲面”,因为在自动插入大量新的顶点之后,模型的曲面会被分得非常细腻,看上去更加平滑致密。它是一种能够在图形芯片内部自动创造顶点,使模型细化,从而获得更好画面效果的技术。Tessellation能自动创造出数百倍与原始模型的顶点,这些不是虚拟的顶点,而是实实在在的顶点,效果是等同于建模的时候直接设计出来的。
在此之前,人们对低代价多边形操作法已经探索了近10年,从最开始的对三角形的fan操纵,到后来的龟裂和冲撞检查,这些方法可以实现曲面细分效果,但是对资源的消耗量太大不可控制。这次微软在DirectX 11中加入硬件Tessellation单元,我们可以视作曲面细分技术历经长时间的磨练后修成正果。虽然它不太符合通用处理单元的设计方向,但是如果计算晶体管的投入与性能回报,独立的硬件Tessellation单元是目前最好的选择。
Tessellation技术是完全可编程的,它提供了多种插值顶点位置的方法来创造各种曲面:
1. N-Patch曲面,就是和当年TruForm技术一样,根据基础三角形顶点的法线决定曲面; 2. 贝塞尔曲面,根据贝塞尔曲线的公式计算顶点的位置; 3. B-Spline、NURBs、NUBs曲线(这三种曲线均为CAD领域常用曲线,在Maya中均有相应工具可以生成) 4. 通过递归算法接近Catmull-Clark极限曲面。
不同方式的曲面细分效果实例
Tessellation技术最初主要被用以“细分曲面”,随着该技术被纳入DX11范畴,得到大范围推广之后,插值顶点的算法也越来越多,因此用途也越来越广,产生了很多非常有创意的应用。
Tessellation技术还经常与Displacement Maps(贴图置换)技术搭配使用,从而将平面纹理贴图改造成为具有立体感的几何图形,大大增强3D模型或场景的真实性。
除了大幅提升模型细节和画质外,Tessellation最吸引程序员的地方就是:他们无需手动设计上百万个三角形的复杂模型,只需简单勾绘一个轮廓,剩下的就可以交给Tessellation技术自动镶嵌,大大提高开发效率;而且简单的模型在GPU处理时也能大幅节约显存开销,同时大幅提升渲染速度。
● DirectX 11引入可编程曲面细分管线
在DirectX10时代的细分曲面里,最有新用途的就是Geometry Shader和Stream Out,前者可以输入一些数据,然后产生一些三角形,后者可以断绝Pixel Shader,做完Geometry Shader就直接输出回Input Assembler,这就意味着可以做GPU递归和迭代。
而DirectX 11相比DirectX 10,Shader Model的变化并不算大,只是增加了5个全新的指令集。但是对于游戏开发者而言,Shader Model 5.0函数和子程序代码的开发都比上一代更加简单方便。增加的五个新指令集目的也是为了让编程者可以进行更灵活的数据访问和操作。
在Shader Model 5.0中,Shader进行了类型的统一,除了4.0版本中就已经有的Vertex Shader、Pixel Shader、Geometry Shader外,还增加了Hull Shader、Compute Shader、Domain Shader三种新的Shade,它们的出现都是为了完善曲面细分管线。
ATI的HD2000以上级别显卡其实都具备Tessellation的功能,但它们却无法与DX11中的Tessellation技术相兼容。这是因为微软并没有原封未动的将R600的Tessellation技术抄到DX11之中,而是对其进行了优化,使之能与渲染流程完美的结合在一起,可以更高效率的细分出更多的多边形和曲面。
与DX9C/DX10时代孤零零的Tessellator模块不同,在DX11当中,微软加入了两种全新着色器来全力配合Tessellator的工作,分别位于镶嵌器的前后。
其中Hull Shader(外壳着色器)用来控制自动生成顶点的数量和算法,也就是Tessellator的细分级别,然后交给Tesselator进行镶嵌处理,最后由Domain Shader(域着色器)按照程序要求生成所需曲面,并自动进行法线平移、置换贴图,产生新的模型。
与DX9/10中的Tessellation技术相比,DX11新增的两种着色器都受统一渲染架构支配,因此处理能力非常富裕,DX11版Tessellation不仅效率更高、而且细分级别更丰富。但是,更高的细分等级对Tessellator模块本身的处理能力提出了苛刻要求,这需要芯片厂商在设计之初就考虑周全。 ● Tessellation与Displacement Mapping综合应用
Displacement Mapping(贴图置换)与Tessellation(曲面细分)的结合使用具有许多优势。虽然两者在原理方面本来是没有任何。
贴图置换是一种通过VS和alpha混合操作来达成复杂表面的操作;基本上贴图置换不会增加新的多边形,即便增加也仅作操作点用。曲面细分则不一样,它通过在已知多边形内设立新的顶点,达成fan操作来完成增加多边形的目的。这两种技术一个的重点是alpha和顶点移动,另一个的重点则是直接增加多边形数量。这是两种完全不同的复杂表面细节实现手段。
Tessellation和Displacement Mapping结合应用
简单来讲,Displacement Mapping的目的就是借助Tessellation改变多变形的外观,而不仅仅只是圆滑棱角。
正如你所看到的那样,Displacement mapping能够透过Tessellation和Displacement Mapping让一张平面的网面真正实现具有不同形状的外观(上面的例子是绵绵起伏的山丘),只要使用Displacement Mapping映像到网面的顶点上,就能够让网面善的顶点提升/升降到不同的相对高度,同样的网面可以形成不同的形状。
Tessellation和Displacement Mapping结合应用
和以往主要在光栅化阶段进行的Bump mapping不同的是,Displacement Mapping是生成的是由更多多边形构成的真实外观,而Bump mapping则是一种欺骗性手段、一种性能妥协方案而已,不能产生真正不同的外形,采用Displacement Mapping来实现丰富的表面细节实在有太多的好处了。
最终,利用Displacement Mapping(贴图置换)与Tessellation(曲面细分)相结合的方式所渲染出来的模型与艺术家所用工具中的原生模型很相似,从而让艺术家不必创建不同几何细节级别的模型,无需重复地进行这种一般性劳动。
● 全新的多线程渲染技术
虽然超线程概念已经在CPU领域发展了数十年,但大多数程序员还是直到近年来多核心CPU流行之后才开始关心程序的平行化,在此之前大部分通用代码都是简单的单线程,在这些代码里寻找并挖掘多线程化带来的性能提升是非常困难的。
为了改变这一现状,DirectX 11特性还包括很重要一点:支持多线程(multi-threading)。没错,无论是DirectX 10还是DirectX 11,所有的色彩信息最终都将被光栅化并显示在电脑显示屏上(无论是通过线性的方式还是同步的),但是DirectX 11新增了对多线程技术的支持。
得益于此,应用程序可以同步创造有用资源或者管理状态,并从所有专用线程中发送提取命令,这样做无疑效率更高。DX11的这种多线程技术可能并不能加速绘图的子系统(特别是当我们的GPU资源受限时),但是这样却可以提升线程启动游戏的效率,并且可以利用台式CPU核心数量不断提高所带来的潜力。
多线程渲染示意图1
在DirectX 11中,微软通过将目前单一执行的Direct 3D设备被分为三个独立的接口:设备(Device)、立即执行范畴(immediate Context)和延迟执行范畴(Deferred Context)。
多线程渲染示意图2
这三者都被分发到各自独立的线程,而且设备和Deferred context还可以分配多个线程,负责将等待执行的任务发送给immediate Context或渲染线程。这样的设计可以将图形生成所需的资源做预先的存取。同时,CPU还可以利用显卡的多线程处理加快DirectX的处理,减少CPU的响应时间而使游戏不再受到CPU的瓶颈限制。