图形API再革命!DirectX 11新技术预览
[泡泡网显卡频道 2009年2月4日]2006年11月,G80的发布正式带来了DirectX 10应用程序接口,如今整整两年过去了,DirectX 10已经非常成熟,甚至AMD已经率先支持DirectX 10.1。然而,对于2009年来说,最值得期待的技术莫过于DirectX 11。
DirectX 11并不能算是一个全新的应用程序接口,而是DirectX 10的超集,简单的说DirectX 11就是基于DirectX 10/10.1开发出的技术,主要对DirectX 10和DirectX 10.1功能做出改进和扩展。
值得一提的是,DirectX 11在兼容性方面也非常的友好,即使现在的Windows Vista用户也可以通过安装升级包使用,这可比DirectX 10厚道的多(Windows XP无法使用DirectX 10)。
那么,DirectX 11到底有哪些新的技术,相对于现有的应用程序接口,又有什么改进呢?下面,笔者将对DirectX 11几个重要的功能进行详细的介绍,希望大家能够通过此文章对DirectX 11有一个初步的了解。
● Tessellation镶嵌处理
大家都知道,计算机上所显示出来的3D图形都是有无数个多边形组成,那么想要生成一幅3D图形,就必须经历多边形的生成这一个步骤。但是在DirectX 10到来之前,多边形的生成都是CPU的工作,而GPU只能对像素进行处理。比如基于DirectX 9的GPU如果需要建立3D模型,必须先依赖CPU生成多边形,然后由GPU调入进行贴图处理。这个现象在DirectX 10时代有所改观,加入了几何渲染单元(Geometry Shader)。但是,在我们之前介绍G80的时候就提到过,几何渲染单元的作用是将CPU生成的多边形进行加强、复制,并没有生成三角形的功能。比如CPU给出多边形信息,GPU利用几何渲染单元将同类的多边形加以复制处理,然后再进行贴图等后续操作。
可以看出,在DirectX 10中,三角形的生成实际上还是由CPU在完成。而DirectX 11新增加的镶嵌处理则可以在一定程度上生成多边形,在顶点渲染和几何渲染的中间加入了Hull Shader、Tessellator和Domain Shader这三个单元,这三个单元的目的正式为了完成生成多边形的工作。如下图:
那么,镶嵌处理是如何工作的呢?首先,GPU依然从CPU那里获得多边形的数据和资料,然后顶点渲染单元(Vertex Shader)生成定点,并制定控制点;接下来,处理好的资料会被传输到Hull Shader模块,Hull Shader模块会根据程序载入控制点,生成如贝塞尔曲线等平滑曲线,并对数据进行基础处理;之后Hull Shader再将调整好的数据传输给Tessellator模块,利用Tessellator生成大批量的、确定数量的点(需要注意的是Tessellator并不知道控制点的相关信息),这样Tessellator就会在原有多边形区域内(控制点所确定的区域内)确定大量的点;而得到数据的Domain Shader模块会将这些点转换成3D处理中的顶点,最后GPU生成曲线以及多边形。
Tessellation镶嵌处理所带来的好处非常多,首先CPU的压力被转移到了GPU,从而释放了GPU的资源占用率,而CPU空闲出来的性能可以更好的完成AI处理等工作。同时,Tessellation仅仅需要少量的数据点就可以生成大量的多边形,智能调节远/近景图像的生成。比如,比较远的图像可以使用低档次的特效等级,主要对轮廓进行生成;而比较近的图像可以使用高等级的特效,体现出图像细节。
● Multithreading多线程处理
现在,多线程已经被广泛使用,早在多年前,桌面处理器就有了超线程的概念。而现在双核心、三核心甚至四核心的处理器也随处可见。GPU也是一样,不仅有单独的单卡双芯产品,多路SLI、Crossfire也奠定了GPU多核心的发展。但是,对于GPU系统而言,多核心的程序调用并不成熟,从我们之前的测试中就可以发现,很多游戏在SLI、CrossFire平台上性能都不正常。这是什么原因呢?
原来,多核心GPU在DirectX中,只能模拟成一个虚拟GPU。也就是说无论有多少物理GPU,到最后反映在DirectX中的只有一个虚拟GPU,因此只能设置一个命令缓冲区。如果驱动程序不够成熟的话,那么对多核心GPU的性能就无法得以体现。DirectX 11中的Multithreading正是为了解决这一问题而来。
当然,这里并不是说DirectX 10和DirectX 10.1不支持多线程处理,而是微软强烈不建议使用此功能,因为性能不会有太大提升,反而有时候会出现稳定性的问题。在DirectX 11中,为了加强多线程处理能力,DirectX 11改变了以往DirectX 同步运行的对象和Device,使其可以被异步执行的API调用,并且程序员能够更加准确的控制程序运行的时间。
在DirectX 11中,目前单一执行的Direct 3D设备被分为三个独立的InterFace:设备(Device)、立即执行范畴(immediate Context)和延迟执行范畴(Deferred Context),这样的设计可以将图形生成所需的资源做预先的存取。同时,CPU还可以利用显卡的多线程处理加快DirectX的处理,减少CPU的响应时间而使游戏不再受到CPU的瓶颈限制。
● Compute Shader通用计算
近几年,利用显卡进行以往CPU才能支持的通用计算越来越受关注。特别是去年,NVIDIA推出了CUDA技术,让GPU可以通过其CUDA技术模拟成CPU,进行各种情况下的计算。比如使用GPU进行视频压缩、Photoshop处理加速、蛋白质折叠运算等等;而AMD在去年下半年也发布了自己的Stream技术,高举GPU通用计算的大旗。
NVIDIA的CUDA技术推出之后,立刻受到了业内人士的关注,同时NVIDIA也将其作为了宣传的重中之重。看来,显卡的未来将不再仅仅是图形计算领域,而将面向更多的需要高性能计算的领域。届时,GPU的定义似乎也需要改变,也就是我们常说的GPGPU。
虽然NVIDIA的CUDA技术非常先进,但是仍然无法改变一个现实——在CUDA通用计算模式与普通图形渲染模式之间的切换延迟。也就是说,想要根本的解决这个问题,还是需要DirectX来才能解决。而微软的DirectX 11中的Compute Shader功能就是来解决这个问题的。
Compute Shader的最重要特性就是支持GPGPU通用计算,微软提供HLSL语言对Compute Shader进行支持。在这里我们举一个简单的例子来说明Compute Shader的优势:
由于GPU的API目的是为了3D设计,输入的是材质,而输出的是图像。如果一个程序员想要利用GPU的API进行非3D设计,则需要将资料包装成材质,经过一番处理之后,再读取到计算后的资料。而DirectX 11可接受任意类型资料(非材质),并且可以不受图形渲染流程的限制,随时写入写出,这无疑为GPU的通用计算敞开了大门。同时,Compute Shader还完全支持双精度计算,可以更好的为科学计算提供服务。
● 改进的纹理压缩
丰富的纹理细节对于最终图像的质量尤为重要,目前的游戏也都在朝着超大规模、超精细的纹理细节方向发展。但是,大规模的纹理非常占用显存以及带宽。而纹理压缩就是为了解决这个问题,将大规模的纹理以一种优化的算法进行压缩。试想,如果图象的纹理都不进行压缩的话,那么2GB的显存容量恐怕都不够用。
但是,目前纹理压缩技术并不支持HDR(高动态范围)图像,这也是开启HDR很占用显存的一个很大的原因。为了解决这个问题,DirectX 11加入了两种新的压缩算法——BC6和BC7。其中,BC6是专门针对HDR图像设计的压缩算法,压缩比为6:1;而BC7是专门为LDR(低动态范围)图像设计的压缩算法,压缩比为3:1。
上图展示的是图像通过BC6压缩模式进行压缩的前后效果对比图。其中左边的图像为原始图像,中间的是在压缩过程中损失的一些细节,而右边的就是压缩后的图像。可以看出,从画质上来看几乎没有损失(肉眼看不出),但是却可以大幅度降低显存的占用。
这幅图展示的是BC7针对LDR纹理的压缩与传统的BC3纹理压缩对比。可以看出传统的BC3纹理压缩损失了大量的纹理细节,压缩之后的效果也很不好。而采用BC7算法压缩后的纹理,丢失的细节很少,效果也非常好,这就是改进纹理压缩的魅力。
同时,DirectX 11能够支持的纹理分辨率也从目前的4096×4096加强到16384×16384。
实际上,除了前面我们介绍的4个最重要的特性之外,DirectX 11还为我们带来了更多的其他特性,比如Shader Model 5.0、Dynamic Shader Linkage等等功能。
Shader Model 5.0采用面向对象的概念,完全支持双精度数据(DirectX 10支持整数运算和位运算的功能),最大限度的降低了开发者编程的难度。而Dynamic Shader Linkage代表可执行代码级的复用,相当于Windows中的DLL动态链接库文件。除了这些之外,DirectX 11还拥有以下技术特性:
●Addressable Stream Out
●Draw Indirect
●Pull-model attribute eval
●Improved Gather4
●Min-LOD texture clamps
●Conservative oDepth
●Geometry shader instance programming model
●Read-only depth or stencil views
目前,我们还无法完全的了解到DirectX 11的所有细节,毕竟直接支持DirectX 11的操作系统Windows 7还没有正式发布,而且截止目前为止还没有任何一款支持DirectX 11的显卡面世。但是大家都知道,DirectX的过渡是漫长的,想想当初G80发布半年之内都没有游戏的窘境,大家就能够想象到DirectX的过渡难度了。笔者估计,正式进入DirectX 11时代至少需要2010年初期甚至更晚。■
注:本文部分资料来自《微型计算机》<