● Compute Shader与Texture Compression
GPU是图形处理器,以往的GPU通用计算需要程序员先将资料伪装成GPU可识别的图像,再将GPU输出的图像转换为想要的结果,而通过DX11中的Compute Shader通用计算,任意类型的数据(即使是非图形数据)都可以直接进行计算,而且不受图形渲染流程的束缚,可以随时写入写出,GPU通用计算的效能提高了很多。
由于GPU的浮点运算能力非常强大,支持GPU进行通用计算的技术发展势头很快,NVIDIA和AMD分别有CUDA和Stream技术,以前两家是各自为战,如今微软也看到了GPU通用计算的曙光,在DX11中加入了Compute Shader这一技术,意在统一当前的通用计算技术。你可以认为Compute Shader标准就是微软提出的OPEN CL。
Compute Shader技术是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其他的运算能力,也就是我们说的GPGPU的概念和物理加速运算。多线程处理技术使游戏更好地利用系统的多个核心。

Compute Shader图形流水线
Compute Shader主要特性包括线程间数据通信、一整套随机访问和流式I/O操作基本单元等,能加快和简化图像和后期处理效果等已有技术,也为DX11级硬件的新技术做好了准备,对于游戏和应用程序开发有着很重大的意义。
在DirectX 11以及CS的帮助下,游戏开发者便可以越过复杂的数据结构,并在这些数据结构中运行更多的通用算法。与其他完整的可编程的DX10和DX11管线阶段一样,CS将会共享一套物质资源(也就是着色处理器)。
在硬件支持Compute Shader之后,相应的硬件必须要比当代硬件更加灵活,因为在运行CS代码的时候,硬件必须支持随机读写、不规则列阵(而不是简单的流体或者固定大小的2D列阵)、多重输出、可根据程序员的需要直接调用个别或多个线程、32k大小的共享寄存空间和线程组管理系统、粒数据指令集、同步建构以及可执行无序IO运算的能力。
Compute Shader可发挥的地方很多,游戏中可以使用GPU进行光线追踪、A-Buffer采样抗锯齿、物理特效、人工智能AI等游戏特效运算。在游戏之外,程序员也可以利用CS架构进行图像处理、后期处理(Post Process)等。
Texture Compression(纹理压缩)是一种和虚拟纹理类似的纹理管理方法,在很多情况下具有6倍以上压缩比例的纹理压缩都可以极其有效地减小纹理本身的大小,从而避免纹理传输和管理方面的瓶颈,并且可以获得更加精细的画面,由此看来其效率比虚拟纹理要高。
DirectX 11加入了两种新的压缩算法——BC6和BC7。其中,BC6是专门针对HDR图像设计的压缩算法,压缩比为6:1;而BC7是专门为LDR(低动态范围)图像设计的压缩算法,压缩比为3:1。

上图则是BC7针对LDR纹理的压缩与传统的BC3纹理压缩对比。可以看出传统的BC3纹理压缩损失了大量的纹理细节,压缩之后的效果也很不好。而采用BC7算法压缩后的纹理,丢失的细节很少,效果也非常好,这就是改进纹理压缩的魅力。

上图展示的是图像通过BC6压缩模式进行压缩的前后效果对比图。其中左边的图像为原始图像,中间的是在压缩过程中损失的一些细节,而右边的就是压缩后的图像。可以看出,从画质上来看几乎没有损失(肉眼看不出),但是却可以大幅度降低显存的占用。
● 着色器模型变化历程与总结
在图形渲染中,GPU中的可编程计算单元被称为着色器(Shader),着色器的性能由DirectX中规定的Shader Model来区分。GPU中最主要的可编程单元式顶点着色器和像素着色器。
为了实现更细腻逼真的画质,GPU的体系架构从最早的固定单元流水线到可编程流水线,到DirectX 8初步具备可编程性,再到DirectX 10时代的以通用的可编程计算单元为主、图形固定单元为辅的形式,最新的DirectX 11更是明确提出通用计算API Direct Compute概念,鼓励开发人员和用户更好地将GPU作为并行处理器使用。在这一过程中,着色器的可编程性也随着架构的发展不断提高,下表给出的是每代模型的大概特点。
表:Shader Model版本演化与特点
Shader Model
|
GPU代表
|
显卡时代
|
特点
|
|
1999年第一代NV Geforce256
|
DirectX 7
1999~2001
|
GPU可以处理顶点的矩阵变换和进行光照计算(T&L),操作固定,功能单一,不具备可编程性
|
SM 1.0
|
2001年第二代NV Geforce3
|
DirectX 8
|
将图形硬件流水线作为流处理器来解释,顶点部分出现可编程性,像素部分可编程性有限(访问纹理的方式和格式受限,不支持浮点)
|
SM 2.0
|
2003 年
ATI R300
和第三代NV Geforce FX
|
DirectX 9.0b
|
顶点和像素可编程性更通用化,像素部分支持FP16/24/32浮点,可包含上千条指令,处理纹理更加灵活:可用索引进行查找,也不再限制[0,1]范围,从而可用作任意数组(这一点对通用计算很重要)
|
SM 3.0
|
2004年
第四代NV Geforce 6
和 ATI X1000
|
DirectX 9.0c
|
顶点程序可以访问纹理VTF,支持动态分支操作,像素程序开始支持分支操作(包括循环、if/else等),支持函数调用,64位浮点纹理滤波和融合,多个绘制目标
|
SM 4.0
|
2007年
第五代NV G80和ATI R600
|
DirectX 10
2007~2009
|
统一渲染架构,支持IEEE754浮点标准,引入Geometry Shader(可批量进行几何处理),指令数从1K提升至64K,寄存器从32个增加到4096个,纹理规模从16+4个提升到128个,材质Texture格式变为硬件支持的RGBE格式,最高纹理分辨率从2048*2048提升至8192*8192
|
SM 5.0
|
2009年
ATI RV870
和2010年NV GF100
|
DirectX 11
2009~
|
明确提出通用计算API Direct Compute概念和Open CL分庭抗衡,以更小的性能衰减支持IEEE754的64位双精度浮点标准,硬件Tessellation单元,更好地利用多线程资源加速多个GPU
|
传统的分离架构中,两种着色器的比例往往是固定的。在GPU核心设计完成时,各种着色器的数量便确定下来,比如著名的“黄金比例”——顶点着色器与像素着色器的数量比例为1:3。但不同的游戏对顶点资源和像素资源的计算能力要求是不同的。如果场景中有大量的小三角形,则顶点着色器必须满负荷工作,而像素着色器则会被闲置;如果场景中有少量的大三角形,又会发生相反的情况。因此,固定比例的设计无法完全发挥GPU中所有计算单元的性能。
顶点着色单元(Vertex Shader,VS)和像素着色单元(Pixel Shader,PS)两种着色器的架构既有相同之处,又有一些不同。两者处理的都是四元组数据(顶点着色器处理用于表示坐标的w、x、y、z,但像素着色器处理用于表示颜色的a、r、g、b),顶点渲染需要比较高的计算精度;而像素渲染则可以使用较低的精度,从而可以增加在单位面积上的计算单元数量。在Shader Model 4.0之前,两种着色器的精度都在不断提高,但同期顶点着色器的精度要高于像素着色器。
Shader Model 4.0统一了两种着色器,所以顶顶点和像素着色器的规格要求完全相同,都支持32位浮点数。这是GPU发展的一个分水岭;过去只能处理顶点和只能处理像素的专门处理单元被统一之后,更加适应通用计算的需求。
DirectX 11提出的Shader Model 5.0版本继续强化了通用计算的地位,微软提出的全新API——Direct Compute将把GPU通用计算推向新的巅峰。同时Shader Model 5.0是完全针对流处理器而设定的,所有类型的着色器,如:像素、顶点、几何、计算、Hull和Domaim(位于Tessellator前后)都将从新指令集中获益。

GPU执行FFT性能将在未来迅速提升
如图,快速傅里叶变换(Fast Fourier Transform,FFT)有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。SIGGRAPH2008峰会认为未来随着Compute Shader和新硬件、新算法的加入,GPU执行FFT操作的性能将得到快速提升。
如果使用DirectX 11中的Computer Shader技术,API将能借助GPU充裕的浮点计算能力进行加速计算,则能轻易完成大量的FFT(傅里叶变换)。在图形渲染中,这项技术的运用极大地提高了波浪生成速度,而且画面质量也更好。
以往受限于浮点运算性能,目前CPU进行FFT变换只能局限在非常小的区域内,比如64x64,高端CPU最多能达到128x128,而GTX 280则能实现每帧512x512的傅里叶变换,所用时间不过2ms,效能非常高。
DirectX11最为强调的图形特性就是Tessellation(曲面细分)。Tessellation技术利用GPU硬件加速,将现有3D模型的三角形拆分得更细小、更细致,也就是大大增加三角形数量,使得渲染对象的表面和边缘更平滑、更精细。
● Tesslation测试-Stone Giant
《Stone Giant》是一个针对DirectX 11 Tessellation效能十分依赖的Demo,本次笔者将用其作为检验产品Tessellation性能的工具。
以下对比图左侧为Geforce GTX480,右侧为Radeon HD 5870。
● NO Tessellation + NO Wireframe

● NO Tessellation + Wireframe

● Tessellation + NO Wireframe

● Tessellation + Wireframe



● Direct X11 SDK Test:Sub D11
Direct X11 SDK Test:Sub D11是集成在微软的DirectX SDK开发包中的测试组件之一,它主要测试GPU的Tessellation性能。这个测试一共包含31个层级,从第一级的轻度曲面细分到31级重度曲目细分,对显卡的几何处理能力考验不断升级。
我们为了对NVIDIA和AMD公平起见,选择了Factor=1/16/31,这三个级别的测试曲面数量很有可能在未来作为图形开发者的重要参考标准。




我们能够看到一个很明显的性能变化,在曲面细分压力不大的情况下,HD5870有接近于Fermi架构GTX480的表现,HD5970则能够超越GTX480。而在曲面细分压力变大之后,A卡出现了非常严重的性能下降,毕竟R800架构的一个曲面细分单元无法对抗NVIDIA在Fermi架构中给每个SM单元分配一个曲面细分单元。
● DX11 SDK Test:PN Triangle
PN Triangle和上一个Sub D11测试有异曲同工之处,它们都着重测试GPU的曲面细分性能。这个SDK测试程序是在微软发布DirectX 11初期由AMD提供的。

因为它同样也有曲面层级设置,所以我们选取了负载较轻的5和负载较重的19进行测试。结果如下:


PN Triangle的测试结果和Sub D11非常相似,毕竟两者的测试目的相同。但是我们需要清楚知道的一点是我们所作的都是理论性能测试,而且是有很强侧重性的。
在图形运算中不可能有完全纯净的Tessellation环境和极大的Tessellation负载。所以我们不可能看到在DirectX 11游戏中出现A卡因为开启了DirectX 11支持的Tessellation功能之后性能大幅度下降。
● DX11 SDK Test:Detail Tessellation (1)
Detail Tessellation是集成在DirectX 11 SDK开发包中的重要基准测试程序,它提供了Bump Mapping、Parallax Occlusion Mapping和Tessellation三种主渲染模式,同时使用者可以在这3种模式之上添加其他附加效果,以达到较为复杂的Shader效果。

这个测试中只要涉及置换位移贴图和传统的凹凸类贴图,都会有大量的VS指令,而VS指令天生就是4D指令,因此R800的4D+1D组织SIMD结构流处理器会表现出较强的性能。而NVIDIA显卡的主要看点则在曲面细分性能上。越复杂的Shader效果对着色器性能要求越高。



Detail Tessellation虽然同样侧重曲面细分能力,但是它添加了大量其他贴图效果,像我们熟知的置换位移贴图和传统的凹凸类贴图都会在这项测试中找到。这项测试已经逐渐接近真实使用环境,同时大量的VS指令也让4D+1D组织SIMD结构流处理器找到了爆发理论值的用武之地。
● DX11 SDK Test:Detail Tessellation (2)
Detail Tessellation是集成在DirectX 11 SDK开发包中的重要基准测试程序,它提供了Bump Mapping、Parallax Occlusion Mapping和Tessellation三种主渲染模式,同时使用者可以在这3种模式之上添加其他附加效果,以达到较为复杂的Shader效果。

Adaptive Tessellation技术一样会通过调节VS来细化曲面结构,跟单纯的设置顶点碎多边形的Tessellation技术来说不一样。我们发现这方面AMD显卡表现较为优秀,比起单纯的Tessellation技术来说性能衰减要小很多。
而Tessellation Ultra对曲面细分单元较为缺乏的A卡来说,性能下降非常迅速,毕竟Fermi架构的GF100完整版拥有16个曲面细分单元,而AMD的R800架构只是在UTDP指令分配器中装配了一个曲面细分单元以达到微软DirectX 11的硬件要求,所以性能较弱理所应当。



鉴于这项测试对单卡双芯HD5970显卡没有提供良好支持,我们在Detail Tessellation测试中忽略了这款显卡的成绩。我们可以从测试中看到,在Shader效果较为简单的前几项测试中,AMD和NVIDAI的最新架构显卡并没有太大分别,而在越来越复杂的Shader效果中,全新设计的Fermi架构显卡体现出了比较强劲的运算能力。
在4月下旬,中关村在线显卡频道已经对DirectX 11现有的大部分游戏进行了横向评测,而今天这篇文章的目的,就是让大家更加深入地了解DirectX 11这套全新的API将如何从图形图像的渲染方面改变我们的“视界”。
目前Fermi架构的Geforce GTX400系列显卡刚上市不久,整个DirectX 11周边配合程序还没有完善,用户方便执行的、可用于单项性能测试的也只有屈指可数的Techdemo和SDK开发包内的程序,而且它们的测试方向几乎都指向了Tessellation技术。相信在未来的一段时间内,我们可以运用更好的软件来了解DirectX 11显卡的各项技术特性。