MCPLive > 杂志文章 > 管窥DirectX 11与通用计算技术

管窥DirectX 11与通用计算技术

2009-09-15陈可《微型计算机》2009年8月下

DirectX 10虽然已发布了两年,但仍未成为游戏的主流,基于DirectX 9的游戏还是目前玩家硬盘里的主力。现在,Windows 7发布在即,微软又将祭出新一代图形API——DirectX 11。保守主义者会认为这种无休止的升级令人厌倦,不过对于图形工业而言,DirectX
11却正在给我们带来了一个新时代。同时,在DirectX 11大旗之下,GPU也将获得更强大的通用计算能力,多线程机制的纳入让游戏渲染效率更高;另外,诸如光线追踪技术的引入,都会对游戏工业产生深远影响。在今年第一期的技术广角栏目中,我们已经做过DirectX
11的技术预览,现在随着Windows 7发布日期的临近,DirectX 11距离我们越来越近了,我们也终于有更加翔实的资料与大家一起分享。

DirectX 11是10.1版本的平滑升级吗?

从DirectX 9到DirectX 10,微软几乎将API打破重来以构建全新的渲染体系,Di rectX 10也成为了第一种影响硬件设计的图形API——统一渲染架构代替传统的分离渲染,从而赋予GPU更高的渲染效率和可编程能力,也为通用计算提供良好的基础,之后的DirectX 10.1就属于功能上的小升级。而到DirectX 11,微软引入了更多的新技术,但同时又保有DirectX 10.1的全部特性,换句话说,
DirectX 11实际上就是DirectX 10.1的扩展集,所有DirectX 10.1硬件所遵循的API对于DirectX 11同样适用。


DirectX 10的渲染架构

对用户而言,这样的设计在兼容方面很有好处:无论软件还是硬件,都可以完美地向后兼容。现行的DirectX 10游戏,在DirectX 11环境下都可以正常运行。而对软件开发者来说,包容的设计使他们能够非常平滑地过渡到DirectX 11,而不需要像DirectX 9到DirectX 10过渡那样突兀和漫长。这样一来,软件厂商可以直接转入DirectX 11技术体系,这对于后续产品开发是非常有利的。不过,
DirectX 11不仅只是简单的升级,它带来相当多的新颖特性,比如引入通用计算着色器(Compute
Shader),允许GPU从事更多的通用计算工作,而不仅仅是3D运算,这可以鼓励开发人员更好地将GPU作为并行处理器使用。还有就是引入多线程渲染、提高GPU的工作效率;新增的镶嵌技术(
tessellation)可以帮助开发人员创建出更为细腻流畅的模型,实现高质量实时渲染和预渲染场景。


DirectX 11的渲染架构

首先我们来看DirectX 10体系的渲染架构,DirectX 10加入Geometry Shader(几何着色器,简称GS单元)设计,让GPU可以直接处理模板阴影特效(Stencil Shadows)、动态法向量图(
Dynamic cube maps)及位移贴图(Displacement mapping)等操作——过去这些操作是由CPU来完成的。此外,Geometry Shader高可支持1024个顶点处理,同时可把不必要的顶点数据删除,这两项功能使得绘图运算将较以往更具效率。除了纳入几何着色器外,DirectX 10的渲染流程其实并没有改变,顶点渲染与像素渲染依次进行,只是在硬件层级上,渲染工作不再由独立的顶点着色器、像素着色器进行,而交给通用的统一着色器(或者说统一渲染单元)。

现在我们接着来看看DirectX 11的渲染管线。引人注目的变化就是:在顶点渲染之后,
DirectX 11新增了外壳着色器(Hull Shader,简称HS)、镶嵌器(Tessellator)和域着色器(
Domain Shader)三个新的管线;而在像素渲染环节,DirectX 11则新增了计算着色器(Computer
Shader,简称CS),这些新增的部分也就是DirectX 11的关键所在。

孪生兄弟:DirectX Compute与DirectX 11

通过上文的阅读我们已经知道,Compute Shader是DirectX 11渲染架构中新增的一个组成部分,也是DirectX 11的一项重要改进,那么它与现在热火的DirectX Compute又是什么关系呢?

二者都叫“计算”,却拥有完全不同的含义。从宏观上上,DirectX Compute是一个应用程序接口,它与DirectX 9.0c、DirectX 10、DirectX 11是同级的关系,而Compute Shader从某种意义上来说时实现通用计算所必需的功能组件。如果用类比的方法来介绍,DirectX Compute相当于通用计算API——OpenCL,而DirectX 11则相当于图形API——OpenGL,大家可以简单地如此类比。


DirectX Compute在支持DirectX 10的显卡上都可以运行

从功能上来讲,DirectX Compute由微软来主导,通过基于DirectX 10、DirectX 11的GPU来实现其通用计算的目的。目前使用成熟的应用便是视频转码操作,这也是Windows 7中一个非常特色的功能:用户将一段视频拖到移动设备上,系统会自动调用DirectX Compute API来进行视频压缩和转码工作。以前想要完成这项工作,我们先要安装转码软件,然后设置各项功能参数,后还要花上很长时间才能得到结果;而现在,一切都由DirectX Compute API来接手,并调用GPU的计算资源,只需要花以前几分之一甚至几十分之一的时间就可以完成。除此之外,DirctX Compute的应用领域还有很多,例如视频插值运算(提高画面质量)、三维网页浏览以及PC游戏的物理运算加速等等。


使用GPU的效率要数十倍于CPU

DirectX Compute在通用计算领域的增强,进一步提升了GPU通用计算的动能,同时也将对该领域产生微妙的影响。作为DirectX 11的合作开发者,AMD公司将首先从其中受益——AMD尽管一直都拥有顶级图形技术,但它并未构建属于自己的通用计算平台,如果用户想利用AMD流处理平台,那么不得不从硬件底层上对AMD GPU进行编程,难度巨大!而在DirectX Compute导入之后,这种局势有望得到一定的缓解,不过我们仍需保持清醒:DirectX 11的Computer Shader只是硬件上的计算着色器,即为GPU增加了一个新的计算单元,而不是导入一系列可直接实现GPU通用计算的API,换言之它只是增强了新一代GPU的通用计算硬件性能,从这个意义上讲,AMD的流处理平台可以因DirectX Compute获益,但幅度是比较有限的。


使用DirectX Compute可以实现很多以往想实现,但是没有办法做到的渲染,
途中所示为NVIDIA的“置换散射材质”演示DEMO。

DirectX Compute令GPU通用性变得更加强大,这对于OpenCL和NVIDIA的CUDA平台都将产生正面影响。OpenCL是GPU通用计算的API标准,它提供了并行计算API和一个扩展的编程语言,
DirectX Compute增强了GPU通用性能,但由于重点不同,它与OpenCL完全不是竞争关系,反而进一步增强了OpenCL的实用性——DirectX 11提升GPU通用性能,基于OpenCL的通用计算程序将更富效率。

与此类似,NVIDIA的CUDA平台也将获得来自DirectX Compute的强大推动。CUDA包括应用
API、开发环境以及编程语言,它的完整性比开放的OpenCL还要高得多。在过去几年间,CUDA非常成功并获得学术界与高性能计算行业的广泛采用,实际上奠定NVIDIA在GPU通用计算领域的王者地位。

目前CUDA发展到2.x版本,3.0版将在09年第四季度出台,当OpenCL 1.0在08年12月9日正式出台之后,NVIDIA CUDA就迅速提供支持,亦即将OpenCL的相关特性纳为子集;对于DirectX
Compute NVIDIA同样态度积极,将在年底推出的CUDA 3.0将对DirectX 11的Computer Shader提供支持,及时吸纳GPU领域的新成果,此举也将进一步增强CUDA的优势。鉴于NVIDIA的GPU通用平台已经在开发环境、应用API、编程语言和实际市场占用率中具有全方位优势,AMD、Intel等竞争对手要想在短时间内赶超是不现实的。

灵活多变:Compute Shader

在DirectX 11中,新增的Compute Shader(CS)计算着色器拥有核心地位。与DX10中引入的GS几何着色器不同的是,CS并不是渲染管线的一部分,它的主要用途在于增强GPU的通用计算能力。

我们知道,现在的GPU能够被应用于某些通用计算工作,譬如在高并行计算应用中,GPU就表现出十倍于CPU的卓越能力。对游戏开发者而言,经常出于某种需要希望GPU能执行通用计算指令,但以往的渲染结构却对GPU制造了诸多障碍——比如说,程序员可以在一个像素着色程序中强行加入通用算法,但却无法随意利用诸如树形结构之类的数据结构,这就给程序员带来很大的麻烦。因为要在像素间共享数据的过程非常繁琐,先绘制三角数据结构、再加入贴图是唯一的解决方案,但这将严重影响GPU的渲染性能。而在DirectX 11和CS着色器的帮助下,未来的游戏开发者将不再受困于此,他们可以直接越过复杂的数据结构、并在这些数据结构中运行更多的通用算法。而这些算法将由CS着色器专门负责,不会给渲染单元带来额外的负担。


DirectX 10硬件只要获得相应的驱动,便可享有DirectX 11游戏的多线程支持

CS代码可以做到高度灵活,它们可以支持随机读写、不规则列阵(而不是简单的流体或者固定大小的2D列阵)、多重输出,并可根据程序员的需要直接调用单线程或多线程应用。CS体系中拥有32Kb容量的共享寄存器和线程组管理系统,具备可执行无序IO运算的能力。总之,CS可以带来几乎无限的新型应用,关键在于开发者能够在多大程度发挥它的功效。

在获得灵活性的同时,CS也会带来一些性能损失。由于单线程任务现在无法以像素为单位,所以这些线程将会丧失几何集合功能。从技术上讲:虽然CS程序依然可以利用纹理取样功能,但是原本的“自动三线LOD计算”将会丧失自动功能,程序员必须指定LOD指令。另外,一些并不重要的普通数据的深度拣选(depth culling)、抗锯齿(anti-aliasing)、α混合(alpha blending)和其它运算不能在一个CS程序中被执行。


DirectX11的Tessellation处理流程

CS可以为开发者带来多种多样的灵活渲染,这项先进技术应该正中游戏开发商们的下怀:它们的兴趣大多是寻求先进技术来增强游戏引擎,比如增强抗锯齿性能或无规则透明度的性能,带来更先进的Deferred Shading(延迟着色)技术、后处理效果(post processing effect)等等,CS都可以大放异彩。除了上述这些特殊的渲染应用,游戏开发者可能还希望让GPU完成诸如IK(inverse
kinematics,逆运动学)、物理计算、人工智能计算等过去由CPU完成的通用计算,而利用CS在GPU上执行这些算法时,可以获得非常理想的效率。

化繁为简:Tessellation镶嵌化技术

早在XBOX 360平台上,ATI就带来了一项名为“Tessellation(镶嵌化)”的新技术。这项技术的用途就是提升硬件的利用效率、用低的资源获得好的渲染效果——简单点说,我们可以将它比作数据传输中的压缩技术。

Tessellator可以将原始的图形分成很多更小的图形,然后它还可以将这些小图形组合到一起、形成一个新的几何图形,这种几何图形更复杂,当然也更为逼真。打个比方,Tessellator技术可以让某个图形变成立方体,并通过旋转让其从底部看起来像是个球形,而这两者实际上都使用相同的数据,达到节省资源的目的。


Tessellation技术可以将简单的图形演变为复杂的图形

在DirectX 11系统中,Tessellation处理过程包括外壳着色器(Hull Shader,简称HS)、镶嵌器(Tessellator)和域着色器(Domain Shader)三个组件,其中HS外壳着色器负责接收琐碎的图形数据和资料,镶嵌器(Tessellator)只负责分块处理,它根据HS的指令要求生成大批量的、确定数量的点,然后将数据传送给域着色器(Domain Shader),再由它来将这些点转换成3D处理中的顶点,终就生成了相应的曲线和多边形。

如果开发者能够娴熟地运用镶嵌化技术,那么就能够极大程度提升游戏性能、或者说在保有当前性能的条件下显著提升画面品质。这一点我们可以从下面的对比中看出来:在采用传统高细节模型渲染时,原始模型需要动用巨量的三角形,数据量十分之大,终获得354fps的渲染性能。而采用低细节模型和Tessellation技术来生成相同的效果,所需的数据量与前者简直不成比例,渲染性能可达到821.41fps,两者对比非常悬殊。然而,镶嵌化技术也不是万能的:其使用的是一项完全固定的单元,不具备任何可编程能力,这就意味着开发者没有丝毫回旋余地。

这一点看起来与图形技术的发展方向背道而驰。微软之所以在DirectX 11中纳入这项技术,很大原因就是因为Tessellation确实具有显著的效果,以至于微软无法拒绝。

多线程(Multithreading)功能:多核处理器派上用场

双核处理器早已经成为PC系统的标准配备,三核、四核更是进入主流市场,然而,现在只有为数不多的游戏产品能够对多核平台提供良好的支持,原因在于为多核平台编程十分困难,只有高水准的开发者才能够胜任,但显然并不是所有的游戏公司都有这样的一流好手。因此,直到今天为主,仍有很多数游戏都还只能在单线程下工作,即只能支持CPU的单核运作,其它核心的计算力无法得到充分发掘。

只要开发者采用DirectX 11作为开发平台,那么代码本身就能直接支持多核平台,DirectX 11在底层接管了多核平台的资源分派问题。DirectX 11预示着多线程游戏真正步入现实,我们才可以说多核心处理器被真正派上了用场。对于一套四核游戏平台,当某个渲染场景中有人像和它的三个镜像,DirectX 11就会启动四个线程进行并行处理,效率显然要比目前单线程处理的方式快上数倍!而更令人兴奋的是:多线程技术不仅适用于DirectX 11平台,它同时也能够让现有的DirectX 10硬件受益。比如说基于DirectX 11开发的新款游戏,可以很好支持多线程,而当它在DirectX 10硬件平台上运行时,多核优化的机能依然有效,前提是AMD和NVIDIA必须为各自的DX10 硬件开发出相应的驱动软件才行——就目前看来,这项工作的进展非常顺利。

对象支持:HLSL 5.0高级着色语言

在DirectX 11中,HLSL(MS's High Level Shader Language,微软的高级程序语言)也被升级到5.0版本。HLSL与C语言比较类似,新版本的改进就是新增了类(Class)和接口(interface)的支持,实现了面向对象的支持。


游戏代码高度复杂,若开发语言缺乏面向对象功能,对程序员而言不吝是一个噩梦

这样的升级显然顺应了潮流,上一代HLSL 4.0无法支持面向对象开发,而对于任何一款游戏,编程人员和美工要么构建一种单一的大型渲染,要么就是编写大量的小型渲染程序——这些代码资源巨大,如果没有面向对象指令的话,很难对这些程序进行有效的管理。从这个角度上讲,HLSL 5.0的微小进步依然值得赞许,不过我们相信仍然会有很多程序员表示不满,因为HLSL 5.0依然还不支持指针功能。

写在后:DirectX 11前瞻

DirectX 11的技术改进是渐进式的,并紧扣着开发者的需求,多线程、Tessellation镶嵌化技术、Compute Shader通用计算着色器、面向对象的HLSL 5.0,这些特性都极具实用价值,开发者没有拒绝的理由。DirectX 11将伴随着Windows 7到来——实际上,我们发现这两者在技术风格上出奇一致:都是在一个良好基础上进行深度的改进,这种改进方式稳妥可靠,不需要耗费巨大的工作量,这样反而可以很好地照顾到用户的需求。可以确信,当DirectX 11到来之后,游戏工业在很短的时间内就可以直接实现支持,而DirectX 11游戏的上位时间也会比过去快很多,不会再出现诸如新游戏刚出来,DirectX API就被淘汰的现象。得益于GPU与API的双重进步,未来的DirectX 11游戏将会拥有更精美的画面,我想所有的游戏玩家都会对此热烈欢迎。

分享到:

用户评论

用户名:

密码: