MCPLive > 杂志文章 > DirectX 11技术面面看

DirectX 11技术面面看

2009-02-06再来一次《微型计算机》2009年1月下

游戏永远是引人注目的计算机应用之一。抛开游戏本身的设计而言,美丽而真实的视觉效果永远是用户关心的因素。因此,我们必须了解究竟是什么技术推动了游戏画面的发展和进步。毫无疑问,对于3D渲染这种复杂的工作来说,基础API(应用程序接口)是重要的。正如没有图纸就不能建起大楼,3D API承载了所有有关游戏画面的方方面面,其中普及广,发展快的无疑是DirectX。殊不知,当我们还沉浸在DirectX 10/10.1带给我们的变革时,DirectX 11已经悄然走进我们的视线。

2009年里,令人期待的显示技术革新可能就是DirectX 11。众所周知,DirectX 10/10.1采用了统一渲染架构,彻底抛弃了不够智能的顶点渲染管线和像素渲染管线,同时加入了几何处理单元,让显卡可以更为自由的生成数据。尽管DirectX 10/10.1做出如此多的改进,但CPU的计算能力依旧没有被释放出来,仍被大量多边形数据淹没;在面对SLI和CrossFireX多卡互联技术的火热大潮,DirectX也不能提供API级别的多线程处理;在画质改善方面,如《Crysis》等游戏使用了更为精细、更为巨大的纹理文件,但依靠DirectX 10却无法对纹理做到更好的压缩。可以说,DirectX 10/
10.1的压缩算法损失比较严重。总的来看,DirectX 10/10.1更像革命的第一步,更多的功能可以从
DirectX 10/10.1改革的方向中依稀猜测出来。从DirectX 7时代一直走到DirectX 10/10.1时代,我们可以发现,解放CPU计算压力,让GPU具备更高的自由度、更为强大的通用计算功能和更为紧密贴合硬件发展的需求,是Di rectX的发展方向。在DirectX 11上,这种趋势更为明显。

DirectX 11提前预览

在介绍DirectX 11前,我们不妨先来了解一下DirectX 11为我们带来的一些新理念和技术更新。

●DirectX 11是DirectX 10和DirectX 10.1的超集。也就是说DirectX 11是基于DirectX 10/10.1开发的技术,并在此基础上做出了扩展和改进。

●DirectX 11的开发重点是可扩展性和性能优化,并且着力扩大GPU的应用范围,以带给用户更为出色的应用体验。

●DirectX 11可以通过运行升级包安装在Windows Vista以及以后的Windows 7操作系统上。

以上是DirectX 11的主要设计理念,下面是较DirectX 10/10.1而言,DirectX 11主要技术改进:

●Shader Model 5.0
●改进多线程处理
●对渲染管线的改进,包括新增“tessellation(镶嵌)”处理阶段以及Hull Shader、Domain
Shader等其他改进。
●改进纹理压缩
●Compute Shader

Shader Model 5.0

DirectX 10的Shader Model 4.0(Shader Model以下简称“SM”)带来了整数运算和位运算的功能,DirectX 10.1的SM 4.1加入了对MSAA的直接采样和控制。从目前的消息来看,DirectX 11包含的SM 5.0,采用面向对象的概念,并且完全可以支持双精度数据。随着SM 5.0的发布,微软也会将HLSL语言更新至新版本,其中包含了诸如动态着色、动态分支和更多的对象等。总之,面向专业开发人员的SM 5.0,依旧是以降低编程的难度和复杂为目的。

对多线程处理的改进

目前桌面多核心处理器已经被广泛使用,特别是双核处理器。对系统程序的调用而言,多线程虽然不够成熟,但起码能使用,且正处于持续的发展中。但如果告诉你DirectX 10.1依旧不能支持多线程,你相信吗?

等一下!不是有SLI和CrossFireX吗?没错,但这些技术基于一个虚拟的GPU。也就是说,无论有多少物理GPU,到后反映在DirectX中只能有一个GPU。采用一个虚拟GPU和DirectX沟通,然后在显卡的驱动程序中将任务分派下去。由于实际上只有一个GPU(虚拟的),因此只能设置一个命令缓冲区,必须得考虑究竟哪一个物理GPU计算出的结果可以存放在缓冲区内。另外一个问题是,目前显卡厂商正在向多核心处理改进,代表产品有Radeon HD 4870X2和GeForce 9800 GX2,以及即将推出的双核GT200。因此多GPU设计很可能是未来高端显卡的一个发展趋势。可以看出,相对于大体积芯片来说,小体积芯片利于控制成本和提高性能,在DirectX 11中加入多线程处理是非常恰当的。

为了加强多线程处理能力,DirectX 11一改以往Direct 3D同步运行的对象和Device,使其可以被异步执行的API所调用,并且程序员能够准确地控制程序的运行时间。为了保证多线程的运行,
DirectX 11将目前单一执行的Direct 3D设备分为三个独立的接口:设备(Device)、立即执行范畴(Immediate Context)和延后执行范畴(Deferred Context)。应用DirectX 11后,由于API本身支持多线程处理,NVIDIA和ATI应该要在驱动程序上做出一定改进,以达到更有效率、更紧密结合API的多线程运行方式。同时,CPU还可以利用显卡的多线程执行加快DirectX的处理,减少CPU的响应时间,提升整体系统的性能。值得注意的是,有消息指出,目前支持DirectX 10/10.1的显卡,也能利用到多线程带来的性能增益,不过关键还是在于相关驱动是否能很好优化。

更为完美的镶嵌处理(Tessellation)

毫无疑问,多边形是组成3D图像的基石。但是DirectX 10之前的GPU只能对像素进行处理,生成多边形是CPU的工作。比如基于DirectX 9的GPU如果需要建立3D模型,只有依赖CPU,然后重新载入并贴图。DirectX 10在这方面做出了改进,加入了几何渲染单元。但是几何渲染单元并非是想象中可以独立生成多边形的设备。在实际应用中,几何渲染单元更多的是对CPU生成的多边形进行加强、模仿。比如CPU给出多边形信息,GPU利用集合渲染单元将同类型的多边形加以复制处理,或者做出类似于影子的多边形效果。要想独立生成多边形,目前DirectX 10是做不到的。但DirectX 11新增加的镶嵌处理却可以在一定程度上生成多边形——新加入Hull Shader、Tessellator和
Domain Shader这三个渲染单元的目的正是为了完成这项工作。


Tessellation的工作流程示意图

那么镶嵌处理是如何工作的呢?首先,GPU依旧从CPU那里获得多边形数据和资料,顶点渲染单元(实际上是统一渲染架构作为顶点渲染单元使用)生成顶点,并制定控制点;接下来,处理好的资料会被传输到Hull Shader。Hull Shader根据程序将载入控制点,生成如贝塞尔曲线(Bezier
Patch)等平滑曲线,并对数据进行基础处理;而后,Hull Shader会将调整好的数据传输给
Tessellator,利用Tessellator生成大批量的、确定数量的点(Tessellator并不知道控制点的相关信息),这样Tessellator就会在原有多边形的区域内(控制点确定的区域内)确定大量的点;下面,得到数据的Domain Shader会将这些点转换成3D处理中的顶点;后,GPU自行生成大量的曲线,和多边形。

这幅图片说明了BC3和BC7压缩的差别。左侧是原始纹理,右侧是压缩后的纹理,中间是压缩中损失的图形信息的示意图。压缩损失越少,颜色越接近黑色。由于BC7是为低动态范围纹理设计的压缩模式,压缩率虽然不太高,但是在画质效果表现方面依然令人无可挑剔。

Tessellation的优势在于需要少量的数据点就可以生成大量多边形。这项技术应用非常广泛,比如无限远的视距范围内的物体生成,又如运行游戏时,只有走到一定距离,地面物体才会渐次显示出来,如果调节游戏的“远视距”,虽然能够减轻这种现象的发生,但不能根本解决问题。

如果采用Tessellation就可以让游戏中的物体显示在无限远的视距中—远处的物体可以使用低档次的特效等级,近处的物体采用高档次的特效等级。这样就更加真实。另外一个重要的应用在于,CPU的压力被转移到GPU上了,因为CPU不再需要大量生成多边形,只要给予GPU合适的控制点,GPU就可以完成这种简单而重复性高的工作。CPU空闲出来的性能可以更好地完成AI处理等其他工作。

改进纹理压缩

精细的纹理对视觉效果的增益是显而易见的。目前的3D游戏越来越倾向于使用更大、更为精细的纹理,但是过大的纹理严重占用显存和带宽。由于目前纹理压缩仍然不支持HDR图像,因此
DirectX 11提出了更为出色的纹理压缩算法——BC6和BC7。BC6是为HDR图像设计的压缩算法,压缩比为6∶1;而BC7是为低动态范围纹理设计的压缩模式,压缩比为3∶1。两种压缩算法在高压缩比下画质损失更少,效果更出色。

这是一幅对HDR文件的压缩示意图,BC6的压缩相对于原图来说,仅仅损失了极小的画质,却获得了非常出色的效果。

纹理质量对画面效果起着至关重要的作用。比如我们运行3D游戏时,画面内同样一个物体,观察距离较远时,纹理锐利而清晰,但当你拉近视角,近距离细看时,纹理就非常粗糙了。更不用说在某些游戏中还有类似放大镜、望远镜等道具,启用这些道具后,只能看到更为粗糙和不真实的纹理。出现这种问题,一方面是纹理压缩率损失严重,细腻的纹理压缩存放后,损失大量细节;另一方面是大纹理难以保证保证游戏运行速度和软件体积,如果在游戏中大面积采用分辨率高达
4000dpi的纹理贴图,那么显卡的运算资源和显存容量很快就会告罄。因此,DirectX 11快速和直观的改变就是再次改进了纹理的压缩算法,将纹理体积和纹理质量控制在一个相当优秀的范围之内。

Compute Shader

目前显卡通用计算发展如火如荼,但无论是NVIDIA的CUDA,或是ATI的Stream,还是苹果领头的OpenCL,都没有在业界形成绝对的领导力。因此,微软在DirectX中加入有关通用计算的内容,无疑将使GPGPU通用计算的未来更加不确定。

新加入的Compute Shader可以让显卡完成更多的通用计算。同时,这幅图片还表明了新的
DirectX 11的流水线构成。

DirectX 11新加入的Compute Shader重要的特性是支持通用计算,即GPGPU。微软将提供HLSL语言对Compute Shader进行支持。Compute Shader可以支持线程间的数据共享,完全支持
DirectX 3D的所有计算资源,随时可以将数据从流程中调入调出,不受渲染管线的限制。为了更好地为科学计算提供帮助,Compute Shader还可以支持双精度计算。

写在后

从目前的情况来看,较DirectX 10/10.1而言,DirectX 11的改进不能称为大跨越,只是它们的一个超集。相比之下,真正的跨越是从DirectX 9.0c到DirectX 10。但是,DirectX 11依旧在完善和优化DirectX 10/10.1的统一渲染架构。只不过在视觉特效上,我们可能难以看到DirectX 11和
DirectX 10/10.1的明显区别,毕竟DirectX 11的重要目标在于改善编程难易程度、增加更多的功能。

另一方面,DirectX 10诞生一年多以后,我们才在游戏中看到DirectX 10相对DirectX 9明显的性能和画质进步。可想而知,一款全新的DirectX要真正被掌握和应用是多么困难的事情。可以预见,DirectX 11无形中也给显卡的发展提供了一个足够的缓冲期,在大量的DirectX 10技术成熟并广泛应用,操作系统全面转向Windows Vista甚至Windows 7之后,DirectX 11才可能真正面向终端用户并大力发展。

分享到:

用户评论

共有评论(1)

  • 2009.02.06 19:08
    1楼

    发展太快了,我刚上大学时家里电脑升级换显卡,那时我记得显卡是支持DirectX9.0的,一个假期我都在玩当时来说主流的3D游戏。现在我那台老爷机,已经退休了。

    (0) (0) 回复

用户名:

密码: