革命性DX11架构!GTX480470权威评测

2010-04-06 18:01  出处:PConline原创  作者:佚名   责任编辑:zhengwanglun 

第三章 DirectCompute:不止是通用计算

    此前在测试阶段,微软将DirectX 11中包含的GPU通用计算称为Compute Shader或DirectX Compute,而在正式版本中又改名为DirectCompute,一字之差何苦呢?显然,微软为了将GPU通用计算和主要是3D应用的DirectX区别开,进一步凸出DirectCompute的重要性并与OpenCL分庭抗力,由此足以见得微软对GPU通用计算的重视程度。

    DirectCompute主要针对GPU计算,但由此可以衍生出一些在图形渲染方面的特殊应用,因此笔者将其单列一章,对一些重要技术进行详细介绍。

第三章/第一节 DirectCompute与Stream/CUDA/OpenCL的关系

    提起GPU通用计算,自然会让人想到NVIDIA的CUDA、ATI的Stream以及开放式的OpenCL标准,再加上微软推出的DirectCompute,四种技术标准令人眼花缭乱,他们之间的竞争与从属关系也比较模糊。

    首先我们来明确一下概念:

1. OpenCL类似于OpenGL,是由整个业界共同制定的开放式标准,能够对硬件底层直接进行操作,相对来说比较灵活,也很强大,但开发难度较高;

2. DirectCompute类似于DirectX,是由微软主导的通用计算API,与Windows集成并偏向于消费领域,在易用性和兼容性方面做得更出色一些;

3. CUDA和Stream更像是图形架构或并行计算架构,NVIDIA和ATI对自己的GPU架构自然最了解,因此会提供相应的驱动、开发包甚至是现成的应用程序,通过半开放的形式授权给程序员使用。

  其中ATI最先提出GPGPU的概念,Folding@Home和AVIVO是当年的代表作,但在被AMD收购后GPGPU理念搁浅;此后NVIDIA后来者居上,首次将CUDA平台推向市场,在这方面投入了很大的精力,四处寻求合作伙伴的支持,并希望CUDA能够成为通用计算的标准开发平台。

  在NVIDIA大力推广CUDA之初,由于OpenCL和DirectCompute标准尚未定型,NVIDIA不得不自己开发一套SDK来为程序员服务,这套基于C语言的开发平台为半开放式标准(类似与Java的授权形式),只能用于NVIDIA自家GPU。AMD始终认为CUDA是封闭式标准,不会有多少前途,AMD自家的Stream平台虽然是完全开放的,但由于资源有限,对程序员帮助不大,因此未能得到大量使用。

  于是在2008由苹果牵头,以苹果OpenCL草案为基础,联合业界各大企业共同完成了标准制定工作。随后Khronos Group成立相关工作组,工作组的26个成员来自各行各业,且都是各自领域的领导者,具体包括3DLABS、Activision Blizzard、AMD、苹果、ARM、Barco、博通、Codeplay、EA、爱立信、飞思卡尔、HI、IBM、Intel、Imagination、Kestrel Institute、摩托罗拉、Movidia、诺基亚、NVIDIA、QNX、RapidMind、三星、Seaweed、TAKUMI、德州仪器、瑞典于默奥大学。

  OpenCL标准一经成立,IT三巨头Intel、NVIDIA和AMD都争先恐后的加入支持。AMD由于自家Stream推广不利、支持OpenCL并不意外;Intel潜心研发的Larrbee GPU一大卖点就是强大的计算能力,支持OpenCL有百利而无一害;NVIDIA虽然在大力推广CUDA开发平台,但无奈势单力薄,小有所成但前途未卜,OpenCL虽然与CUDA C语言有交集但并不冲突,是相辅相成的互补关系,NVIDIA自然也大力支持。

  OpenCL组织中唯独微软不在其列,微软有自己的如意算盘。经过多年的发展,DirectX凭借快速更新换代策略、相对轻松的开发与移植方式,在与OpenGL的交战中已全面占据上风,OpenGL的传统强项——专业绘图领域也在被DirectX不断的蚕食。因此微软打算用相同的策略来对抗尚未站住根基的OpenCL,于是DirectCompute诞生了。

  就如同GPU能同时支持DirectX与OpenGL那样,NVIDIA和AMD对DirectCompute和OpenCL都提供了无差别支持,真正的GPU通用计算之战,不在CUDA与Stream之间,因为Stream根本不是CUDA的对手,而是OpenCL与DirectCompute之争,DX11时代才刚刚开始……

第三章/第二节 DirectCompute 10/11版本间的区别

  虽说DirectCompute标准才刚刚问世,但目前已经有了三个版本,它与微软的DirectX版本是一一对应的(10.0、10.1、11.0),毕竟DirectCompute目前还只是DirectX的一个子集,羽翼未丰之前难以自立门户。

  新一代windows7操作系统已经内置了DX11及DirectCompute,对GPU通用计算提供原生支持。Win7对GPU的要求放得很宽,只要支持DX10即可,当然DX10.1更好DX11最完美。

  DirectCompute是与DX11一同发布的,因此相比“过去式”的10.0版,DirectCompute 11作出的改进比较多:

  可以看出,同DX11类似,DirectCompute 11的改进主要集中在降低系统资源开销与提高效能方面,也就是说新的DX11显卡会有更强的通用计算效能。而旧的DX10显卡虽然会慢一些,但实现的功能也不会差多少,如此一来就完美的解决的兼容性问题,也能很好的凸出新显卡的优势,用户和厂商皆大欢喜。

  虽然DirectCompute的主要任务是用来处理非图形运算,但很多时候它还是需要做一些图形相关的擦边球任务、或者是辅助图形渲染,比如说视频数据处理、物理运算、人工智能等,这些操作最终还是需要通过显卡输出至屏幕,因此计算着色器会经常与像素着色器打交道,当像素着色器使用到计算着色器的新特性之后,就会衍生出一些意想不到的新特效。

  接下来就为大家介绍一些属于DirectCompute 11的新技术,当然它们也属于DX11的范畴。

第三章/第三节 DirectCompute 11新特效:顺序无关透明化

  烟雾、火焰、流水、玻璃、树叶、栅栏、头发……游戏中所出现的半透明物体数不胜数,程序员很难给这些物体设计一个固定的模型,它们不规则、随机的特性决定了单纯依靠传统的像素着色或者纹理贴图都是行不通的,因此这类物体有了一个新的称呼——Order Independent Transparency (OIT,顺序无关透明化)。

  此前,程序员必须在每帧渲染之前对透明模型进行深度排序或者执行诸如深度剥离的Multi-Pass(多次)算法,以达成模型间正确的透明度。不管哪种办法,都不能像非透明模型那样实现正确的局部的Post-Processing(后处理)效果,而且会消耗很多资源。

  DX11则首次在没有额外专用电路的情况下,透过一个每像素空间数据结构对多个透明表面的排序实现对顺序无关透明化的支持,解决方法就是让GPU参与运算,通过使用DirectCompute 11新增的原子操作,无需直接软件管理就能往分级缓存的不同层级装载数据,依照每个像素透明层数来分配独占的内存。如此一来程序设计的复杂度显著降低,并且数据结构可以采用难以预测的非结构化的内存存取,DirectCompute 11新增的附加缓冲也会派上用场。

  由于DX10不支持原子操作,因此无法支持顺序无关透明化这项新特效,只能依靠传统的方式来实现差强人意的效果。而DX11不但画面更好,而且实现效率非常高,大量使用附加缓冲从而节约了显存带宽消耗。

  在《战地:叛逆连队2》的DX11版本中就运用OIT技术,如在通过建筑和载具的窗户观察窗外的景物,窗外景物同玻璃材质的混合、畸变就用到这样的OIT技术,不过开发商DICE考虑到多人游戏公平性的问题,在多人游戏中DX10和DX11两者的效果会使一致的,只是DX11会提升速度。

  就像大家通过数码相机拍完照片后需要经过PS处理一样,3D模型在GPU内部渲染完成后也会经过后端处理才会显示在屏幕上,这一过程叫做“Render Post-Processing”(渲染后端处理),常见的如“边缘侦测与抗锯齿、各向异性过滤、景深、运动模糊、色彩映射、滤波、锐化”等一些列特效都是在这一阶段加上去的。

  GPU有专门负责渲染后端处理的模块,叫做“Render Back-Ends”(ROPs),也就是通常所说的光栅单元,这个模块位于流处理器与显存控制器之间,也就是说它渲染完毕后将会把数据直接输出到显存与屏幕。

第三章/第四节 DirectCompute 11新特效:渲染后端处理之景深

  在DX10时代,光栅单元的任务量是很重的,如果大量使用后端处理特效的话,很容易出现像素着色器等待光栅单元的情况出现。所以很多DX10游戏的GPU负载还不如DX9C游戏就不足为怪了。而DX11则通过一个巧妙的方式降低了光栅单元的负担,确保流处理器和光栅单元能够协同工作,原理依然是使用计算着色器。

  各种后端处理特效的最终效果虽然千差万别,但它们大多数都有一个共同的特点,那就是需要对比相邻位置像素或者相邻帧之间像素的差别,然后进行对比与合成。这一拾取动作其实只用一个函数就能完成——Gather4,它使得计算着色器能够越权进行数据采集动作,帮助纹理单元和光栅单元的减轻负担,而且计算着色器的数据采集速度是专用单元的4倍!

  具体一点例子,比如DX10级别的运动模糊和景深特效,都是通过几何着色来实现的,通过几何着色控制运动物体的坐标变换与像素监控,或将深度帖图中的纹理信息按照距离拆分到缓冲,然后分为几个不同的视角进行渲染,最后合成完整的图像,实现比DX9C更精确、更流畅的特效。画面效果是更出色了,但几何着色并没有帮助光栅单元做任何事情,数据处理反而翻了好几倍,导致性能下降比较严重。

    而通过使用DirectCompute 11中的新指令,后端处理特效可以最大限度的降低显存读写次数、大幅降低光栅单元的负担,当然流处理器将会承担更多的任务(几何着色、计算着色、像素着色、外壳着色和域着色),但依然能够保持相对的平衡,不会出现DX10当中GPU资源负载不均的情况。

  刚刚发布的DX11大作《地铁2033》就使用了DX11级别的景深效果,清晰和虚化合理分配、主次分明,再搭配Tessellation技术的辅助,几乎接近与电影的拍摄效果,看起来有种赏心悦目的感觉。但该游戏由于使用了太多尖端图形技术,所以要求非常苛刻。

第三章/第五节 DirectCompute 11新特效:渲染后端处理之高清晰环境光遮蔽

    “环境光遮蔽”(Ambient Occlusion,AO)是一种非常复杂的光照技术,通过计算光线在物体上的折射和吸收在受影响位置上渲染出适当的阴影,进一步丰富标准光照渲染器的效果。“屏幕空间环境光遮蔽”(SSAO)就是该技术的一个变种,现已用于《孤岛危机》、《潜行者:晴空》、《火爆狂飙》、《鹰击长空》、《帝国:全面战争》等游戏。

  DX10也能实现SSAO特效,《Crysis》就大量使用了该技术,但其它DX10游戏却很少使用SSAO,因为效率太低。NVIDIA在驱动当中提供了强制SSAO的选项,可以让一些老游戏的画质也得到改善,但性能损失确实很大默认情况下是关闭的。

  DX10.1中的出现让SSAO得到了普及,程序员可以用Gather4函数来进行加速渲染,它只能处理单一的颜色分量,但依然适合处理阴影内核和SSAO,因为深度缓冲是一个单颜色分量。而在DX11中,Gather4再次升级,它可针对特定的颜色分别采样,可自动识别能做阴影映射的值,从而实现更快更好的阴影过滤。

  DX11对于Garher4函数特性的增强使得AO又有了更优秀的版本,称之为High Definition Ambient Occlusion(HDAO),即高清晰环境光遮蔽。HDAO和SSAO都能向下兼容旧硬件,但运行速度会打折扣。换句话说,DX11和DX10.1是在改进算法、优化性能的基础上,使得显卡有能力渲染出更复杂、更完美的特效,而DX10虽然在也能达到同样的画面效果,但速度会很慢,实用性不大。

  在ATI HD5870发布当天,《BattleForge》这款游戏就通过补丁从DX10.1升级至DX11,它只使用了DX11中的一个技术,那就是用DirectCompute 11加速HDAO,通过我们实际测试来看,DX11的确能够让HDAO效率提升20-30%之多。此外DX11大作《异形大战铁血战士》也大量使用了HDAO特效和DirectConpute11技术。

● 本章小结:DirectCompute技术目前主要用于游戏渲染加速

  DirectCompute虽然定位于GPU通用计算,但通过DX11发布半年来的实际情况来看,目前还是主要被用于图形渲染加速,并没有真正进入民用非图形计算领域,毕竟它还只是一个附属在DX11之下的指令集/函数库,而并非是一个单独的API。

  不过,能够大幅提升图形渲染效率也同样具有革命意义。只有让游戏跑得更快,GPU有富裕的运算能力时,游戏开发者才敢使用更多、更新的特效与技术,从而让游戏的画面变得更好,让游戏玩家真正得以体验,而不是以高高在上的形态让人顶礼膜拜。

键盘也能翻页,试试“← →”键