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

2010-04-15 20:06  出处:PConline原创  作者:后天太阳   责任编辑:chenri 

第四章 GF100图形架构全解析

  有关DX11的相关技术部分讲了那么多,最终还是要体现在产品方面,毕竟对手的HD5000已经问世达半年之久。姗姗来迟的NVIDIA对自己的要求比较高,可谓是慢工出细活,我们首先来看看GF100的设计目标:

  1.史上最快的GPU,出类拔萃的游戏性能

  2.超高的抗锯齿精度和效能,一流的图像质量

  3.不可思议的几何性能,通过DX11实现电影级的逼真度

  4.革命性的计算架构,DX11和通用计算两不误

第四章/第一节 在GT200基础上支持DX11很容易,但NVIDIA不这么做

  从DX10到DX10.1再到DX11,转眼间显卡已经发展到了第四代,但有经验的读者应该可以发现,ATI的新产品只是在R600核心的基础上添加新的ShaderModel指令集并扩充流处理器规模而已,对于GPU图形架构的改进十分有限甚至原封未动。

  NVIDIA方面也是如此,G92/GT200相对于G80也只是强化了并行计算架构,虽然对流处理器的排列组合做了一些微调,但整体架构没有本质变化。到了DX11时代,NVIDIA认为旧的架构已经不适合新技术和新游戏的需要,有必要对GPU架构进行大幅度的改进、甚至是重新设计。

  实际上G80和GT200的架构也是非常优秀的,ATI即便有DX10.1的辅助,同时代产品都没能占得任何便宜。ATI沿用R600的架构推出了DX11产品,按理说NVIDIA为GT200添加DX11支持也不是什么难事,性能也不会差,那为什么NVIDIA不这样做呢?

  因为NVIDIA发现了GPU新的瓶颈:从NV30到GT200核心,GPU的渲染能力提升了150倍,但几何性能的增长居然连3倍都不到!这个问题此前未能得到重视,因为游戏中的几何图形转换大多交给CPU来计算,而到了DX11时代,新增的Tessellation技术对GPU几何图形处理能力提出了新的要求,此时如果继续沿用上代架构显然会制约DX11性能,成为新的瓶颈!

  于是GF100架构应运而生了,NVIDIA没有像对手那样以新瓶装旧酒的方式加入DX11支持,而是将整个GPU架构推倒重来,完全针对Tessellation技术而优化设计,确保拥有最强的DX11性能。

  下面我们就来看看NVIDIA是如何做到的?

第四章/第二节 GF100芯片图与核心架构图

● GF100核心规格:

  512个流处理器(现在被称为CUDA核心)

  4个GPC(图形处理器集群)

  4个Raster Engine(光栅化引擎)

  16个SM(流处理器簇)

  16个PolyMorph Engine(多形体引擎)

  64个纹理单元

  48个光栅单元

  384bit GDDR5显存控制器

  这其中,流处理器、SM、纹理单元、光栅单元等大家都不陌生,是GPU的基本模块,其数量多少代表了GPU的规模与性能。而GPC、Raster Engine、PolyMorph Engine这几个模块比较新鲜,这也就是GF100与以往GPU最大的不同之处。

● GTX480、GTX470显卡规格

  值得注意的是,NVIDIA首发的两款高端显卡GTX480/470都没有采用完整规格的GF100核心,原因来自多个方面:台积电40nm良品率、产能还有单卡功耗。

  其中GTX480屏蔽了一组SM,因此比完整的GF100少了32个流处理器和4个纹理单元;GTX470屏蔽了两组SM,比完整的GF100少了64个流处理器和8个纹理单元,另外还屏蔽了一组显存控制器,少了64bit位宽和8个光栅单元。

第四章/第三节 GPC是什么?GF100居然是四核心GPU 

  不管GPU架构改不改,流处理器数量总是要扩充的,准确的说是以级数规模增长,这样才能大幅提升理论性能。在流处理器数量急剧膨胀之后,如何管理好如此庞大的规模、并与其它模块协调工作成为新的难题。

  ATI RV870包括流处理器在内的所有核心规格都比RV770翻了一倍,ATI选择了“双核心”设计,几乎是并排放置两颗RV770核心,另外在装配引擎内部设计有两个Rasterizer(光栅器)和Hierarchial-Z(多级Z缓冲模块),以满足双倍核心规格的胃口。

  如果说Cypress是“双核心”设计的话,那么GF100的流处理器部分就是“四核心”设计,因为GF100拥有四个GPC(图形处理器集群)模块,每个GPC内部包含一个独立的Raster Engine(光栅化引擎),而在以往都是整颗GPU共享一个Raster Engine。

  Raster Engine由三个流水线阶段组成。在边缘设置阶段中,可提取顶点位置、计算三角形边缘方程。没有朝向屏幕方向的三角形都通过背面剔除而删掉了。每一个边缘设置单元在一个时钟周期中最多都能够处理一个点、线或三角形。光栅器(Rasterizer)为每一个基元而运行边缘方程并计算像素的覆盖。如果开启了抗锯齿功能,那么就会为每一个多采样以及覆盖采样执行覆盖操作。每一个光栅器在每个时钟周期内均可输出8个像素,整个芯片每个时钟周期内总共可输出32个光栅化的像素。光栅器所生成的像素将被发送至Z坐标压缩(Z-cull)单元。Z坐标压缩单元获取像素图块(Pixel Tile)并将图块中像素的深度与显存中的现有像素进行比较。完全处于显存像素后面的像素图块将从流水线中剔除,从而就不再需要进一步的像素着色工作了。

  我们知道RV870的Rasterizer和Hierarchial-Z双份的,而GF100则是四份的,虽然命名有所不同但功能是相同的。

  GF100的四个GPC是完全相同的,每个GPC内部囊括了所有主要的图形处理单元。它代表了顶点、几何、光栅、纹理以及像素处理资源的均衡集合。除了ROP功能以外,GPC可以被看作是一个自给自足的GPU,所以说GF100就是一颗四核心的GPU。

  在每个GPC内部,是由四组SM共享一个Raster Engine,现在我们进一步细分GF100,来详细看看SM的结构。

第四章/第四节 每组SM拥有一个独立的多形体引擎 

  GF100拥有四个GPC,每个GPC内部拥有四组SM,每组SM内部包括了32个CUDA核心:

  G80=8 TPC=8x2 SM=8x2x8 SP

  GT200=10 TPC=10x3 SM=10x3x8 SP

  GF100=4 GPC=4x4 SM=4x4x32 SP

  现在我们就可以了解到,GF100与上代的GT200和上上代的G80相比,SM的变化非常大。GF100每组SM当中拥有32个流处理器,而GT200/G80的每组SM都是8个流处理器。在SM内部流处理器数量翻三倍的同时,GPC/TPC的构成也发生了变化,G80每个TPC内部拥有2组SM,GT200是3组SM,而GF100每个GPC内部则是4组SM。

  对于CUDA核心与SM结构的微调,大家都很容易理解。GF100与GT200最大的不同其实就是PolyMorph Engine,译为多形体引擎。每个SM都拥有一个多形体引擎,GF100核心总共有多达16个。那么多形体引擎是干什么用的呢?为什么要设计如此之多?

● 为什么要设计多形体引擎?

  之前的GPU架构一直都使用单一的前端控制模块来获取、汇集并对三角形实现光栅化。无论GPU有多少个流处理器,这种固定的流水线所实现的性能都是相同的。但应用程序的工作负荷却是不同的,所以这种流水线通常会导致瓶颈出现,流处理器资源未能得到充分利用。

  实现光栅化并行处理的同时还要保持API的顺序是非常困难的,这种难度阻碍了这一领域的重大创新。虽然单个前端控制单元的设计在过去的GPU中曾有过辉煌的历史,但是随着对几何复杂度的需求不断增长,它现在已经变成了一个主要障碍。

  Tessellation的使用从根本上改变了GPU图形负荷的平衡,该技术可以将特定帧中的三角形密度增加数十倍,给设置于光栅化单元等串行工作的资源带来了巨大压力。为了保持较高的Tessellation性能,有必要重新平衡图形流水线。

  为了便于实现较高的三角形速率,NVIDIA设计了一种叫做“PolyMorph”的可扩展几何引擎。每16个PolyMorph引擎均拥有自己专用的顶点拾取单元以及镶嵌器,从而极大地提升了几何性能。与之搭配的4个并行光栅化引擎,它们在每个时钟周期内可设置最多4个三角形。同时,它们还能够在三角形获取、Tessellation、以及光栅化等方面实现巨大性能突破。

● 多形体引擎的工作原理:

  多形体引擎拥有五个阶段:顶点拾取、Tessellation、观察口转换、属性设置以及流式输出。每个SM都拥有一个多形体引擎,因此每一阶段中所运算得出的结果都被实时发送至SM处理。该SM能够执行游戏的着色程序、将结果迅速返回至多形体引擎中的下一阶段,从而保证了最高的执行效率。在五个阶段都执行完毕之后,结果会被传递给光栅化引擎。

  第一个阶段是从一个全局顶点缓冲区中获取顶点。所获取的顶点于是被发送至SM,以进行顶点着色以及外壳着色。在这两个阶段中,顶点从一个物体空间转变成了世界空间,而且还算出了Tessellation所需的参数(例如细分级别)。Tessellation系数(或LOD)将被发送至Tessellator进行镶嵌处理。

  在第二个阶段中,多形体引擎读取Tessellation系数。Tessellator将修补面(控制点网格所定义的光滑表面)分成小方块并输出许多顶点。修补(u、v)值定义了网格以及形成网格的连接方式。

  全新的顶点被发送至SM,域着色器与几何着色器均在这里执行。域着色器能够根据外壳着色器与Tessellator的输入来运算每个顶点的最终位置。在本阶段中,通常会附上一个Displacement Mapping(贴图置换)以提升修补面的细节表现。几何着色器能够执行任何后期处理、按需增加或删除顶点以及基元。结果最终将被发回至Tessellation引擎。

  在第三个阶段,多形体引擎会执行观察窗口转换以及视角校正。接下来就是属性设置,把后期观察口顶点属性转变成了平面方程,以进行高效的着色器评估。最后,可以选择将顶点“流出”至存储器,使其能够用于更多处理。

● RV870只有一个控制引擎:

  ATI似乎也意识到了单个控制引擎不足以满足如此庞大规模流处理器并行处理的需要,因此设计了两个Rasterizer(光栅器)和Hierarchial-Z(多级Z缓冲模块)。但其它的模块如Tessellator(镶嵌器)、Vertex Assembler(顶点装配器)、Geometry Assembler(几何装配器)都只有一个:

  4:2的光栅化引擎,16:1的多形体引擎(包括Tessellator),GF100的几何图形性能有多么强大已经可以想象。Tessellation作为ATI发明的技术,对于图形渲染流程与负载的改变ATI不会不知道,如此鸡肋的设计只有一个原因,那就是不做任何改动抢先进入DX11时代,至于执行效率问题暂时抛诸脑后。

  NVIDIA则比较务实,他们要的不是抢第一赚噱头,而是做最完美的DX11显卡。当NVIDIA的工程师通过计算机模拟测试得知几何引擎将会成为DX11新的瓶颈之后,毫不迟疑的选择了将单个控制模块打散,重新设计了多形体引擎和光栅化引擎,并分散至每组SM或每个GPC之中,从而大幅提升了几何性能,彻底消除了瓶颈。

  当然这种革命性的设计代价很大,消耗了NVIDIA工程师无数的精力、资源和时间。事实上多形体引擎正是GF100核心最大的变化所在,也是它无法在去年及时发布的本质原因。
  讲完了GPC(内含光栅引擎)和SM(内含多形体引擎)之后,就轮到了GF100的最小单元——流处理器,现在NVIDIA将它称为CUDA核心。

第四章/第五节 CUDA核心:第三代流处理器

    论单个CUDA核心,GF100与GT200/G80的基本功能是相同的,沿用了之前的1D标量流处理器设计,无论程序要求什么类型的指令,都可以通过线程分配器打散之后交给CUDA核心处理,从而保证任何指令都能获得100%的执行效率。

  虽说像素和顶点等4D指令依然是主力,但在进入DX10时代后Z缓冲区(1D)或纹理存取(2D)等非4D指令所占比重越来越多,此时NVIDIA的标量流处理器架构处理起来依然如鱼得水,但对ATI的5D超标量流处理器架构提出了严峻的考验。

CUDA核心的改进:

  每一个CUDA核心都拥有一个完全流水线化的整数算术逻辑单元(ALU)以及浮点运算单元(FPU)。GF100采用了最新的IEEE754-2008浮点标准,2008标准的主要改进就是支持多种类型的舍入算法。新标准可以只在最终获取数据时进行四舍五入,而以往的标准是每进行一步运算都要四舍五入一次,最后会产生较大的误差。

  GF100能够为32bit单精度和64bit双精度运算提供FMA(Fused Multiply-Add,积和熔加)指令,而GT200只在64bit时才能提供。FMA不仅适用于高性能计算领域,事实上在渲染紧密重叠的三角形时,新的FMA算法能够最大限度的减少渲染误差。

● 16个载入/存储单元:

  每一个SM都拥有16个载入/存储单元,从而在每个时钟周期内均可为16个线程运算源地址与目标地址。支持的单元能够将每个地址的数据载入和存储到高速缓存或显存中。

● 四个特殊功能单元:

  GF100每个SM内部还拥有额外的四个SFU(Special Function Units,特殊功能单元),可用于执行抽象的指令,例如正弦、余弦、倒数和平方根,图形插值指令也在SFU上执行。每个SFU在一个时钟周期内针对每个线程均可执行一条指令,一个Warp(32个线程)的执行时间可超过八个时钟周期。SFU流水线从分派单元中分离出来,让分派单元能够在SFU处于占用状态时分发给其他执行单元。复杂的程序着色器在特殊功能专用硬件上的运行优势尤为明显。

  而ATI的SFU则需要共享SP资源,在每一个Shader单元内部拥有5个流处理器,其中比较“胖”的一个具有SFU的功能,也就是说ATI的架构有1/5的流处理器可以零时充当SFU使用。在大量使用特殊函数运算时,A卡的处理能力会损失不少,而N卡则因为额外的SFU单元辅助效率会更高。

  另外ATI所有的流处理器在执行整数型加、乘指令时仅支持24bit精度,而NVIDIA CUDA核心支持所有整数指令全32位精度,符合标准编程语言的基本要求。整数ALU还经过了优化,可有效支持64位以及更高精度的运算,这一点是对手无法比拟的。

● 双Warp调度器:

  SM可对32个为一组的并行线程(又叫做Warp)进行调度。每个SM拥有两个Warp调度器以及两个指令分派单元。这样就能够同时发出和执行两个Warp。

  GF100的双Warp调度器可选出两个Warp,从每个Warp发出一条指令到16个核心、16个载入/存储单元或4个特殊功能单元。因为Warp是独立执行的,所以GF100的调度器无需检查指令流内部的依存关系。通过利用这种优秀的双指令执行(Dual-issue)模式,GF100能够实现接近峰值的硬件性能。

  大多数指令都能够实现双路执行,两条整数指令、两条浮点指令或者整数、浮点、载入、存储的混合指令以及SFU指令均可同时执行。但双精度指令不支持与其它指令同时分派。

第四章/第六节 GF100图形架构:纹理单元贵在精而不再多 

  GF100的每个SM都拥有4个纹理单元,这样整颗核心总共就是4x16=64个纹理单元,数量居然仅与G92处在同一水平。要知道GTX480被屏蔽了一组SM之后纹理单元只剩下60个,而自家上代GTX285和对手HD5870都拥有80个纹理单元。难道说NVIDIA认为DX11时代纹理贴图并不重要,因此在扩充流处理器规模的同时忽略了纹理?

  在以往的GT200架构中,是三个SM共享一个纹理引擎,该引擎含有八个纹理定址单元和过滤单元。更早的G92则是两个SM共享一个纹理引擎。

  GF100的纹理单元确实是少了,但NVIDIA重新设计了纹理单元,通过改进效率来提升纹理性能,而不是以暴力扩充规模的方式实现,因为NVIDIA发现庞大规模的纹理单元也存在瓶颈,而且会浪费很多晶体管。

  NVIDIA的方法听起来很简单,但做起来很复杂——就是将纹理单元从外围模块搬入到了SM之中,从而提升了纹理高速缓存的利用率、并达到了更高的时钟频率。道理就类似于AMD和Intel把内存控制器整合在了CPU内部,从而大幅提升了内存带宽和延迟。

  我们知道,N卡的流处理器工作频率非常高,达到了核心频率的两倍甚至更高,而其包括纹理单元、光栅单元及周边控制模块在内的其它部分工作频率比较低。现在NVIDIA将纹理单元转移到了SM内部之后,大幅提高了工作频率,全新的一级缓存将以1200-1400MHz的全速运行,纹理单元虽然还是以半速工作但也受益匪浅。

  在GF100架构中,每个SM都拥有自己专用的纹理单元并共享一级纹理高速缓存,GF100专用的1级纹理高速缓存经过重新设计,可实现更高的效率。而且,通过配备统一的2级高速缓存,纹理可用的最大高速缓存容量达到了GT200的三倍,为纹理密集的着色器提升了命中率。

  每个纹理单元在一个时钟周期内能够计算一个纹理地址并获取四个纹理采样。返回的结果可以是经过过滤的也可以是未过滤的。支持的模式包括双线性、三线性以及各向异性过滤模式。

  而且,纹理单元的内部架构还得到了大幅增强。在阴影贴图、屏幕空间环境光遮蔽等实际使用情况中,净效应就是所实现的纹理性能得到了大幅提升。

  GF100的纹理单元还新增了对DirectX 11中BC6H与BC7纹理压缩格式的支持,从而减少了HDR纹理与渲染器目标的存储器占用。

  纹理单元通过DirectX 11的Gather4特性,还支持抖动采样。这样一来,单一纹理指令就能够从一个128×128的像素网格中获取四个纹理像素。GF100在硬件上采用了DirectX 11四偏置点Gather4,大大加快了阴影贴图、环境光遮蔽以及后期处理算法的速度。凭借抖动采样,游戏就能够高效地执行更加平滑的软阴影或定制纹理过滤器。

第四章/第七节 GF100图形架构:一级缓存与二级缓存

  GF100核心拥有很多种类的缓存,他们的用途不尽相同,其中一级缓存、共享缓存和纹理缓存位于SM内部,二级缓存则是独立的一块,与光栅单元及显存控制器相连。

● 64KB可配置共享缓存与一级高速缓存

  以往的GPU都是没有一级缓存的,只有一级纹理缓存,因为这些缓存无法在通用计算中用于存储计算数据,只能用于在纹理采样时暂存纹理。而在GF100当中,NVIDIA首次引入真正的一级高速缓存,而且还可被动态的划分为共享缓存。

  在GF100 GPU中,每个SM除了拥有专用的纹理缓存外,还拥有64KB容量的片上缓存,这部分缓存可配置为16KB的一级缓存+48KB共享缓存,或者是48KB一级缓存+16KB共享缓存。这种划分方式完全是动态执行的,一个时钟周期之后可自动根据任务需要即时切换而不需要程序主动干预。

  一级缓存与共享缓存是互补的,共享缓存能够为明确界定存取数据的算法提升存取速度,而一级缓存则能够为一些不规则的算法提升存储器存取速度。在这些不规则算法中,事先并不知道数据地址。

  对于图形渲染来说,重复或者固定的数据比较多,因此一般是划分48KB为共享缓存,当然剩下的16KB一级缓存也不是完全没用,它可以充当寄存器溢出的缓冲区,让寄存器能够实现不俗的性能提升。

  而在并行计算之中,一级缓存与共享缓存同样重要,它们可以让同一个线程块中的线程能够互相协作,从而促进了片上数据广泛的重复利用并减少了片外的通信量。共享存储器是使许多高性能CUDA应用程序成为可能的重要促成因素。

● 共享式二级高速缓存

  GF100拥有一个768KB容量统一的二级高速缓存,该缓存可以为所有载入、存储以及纹理请求提供服务。二级缓存可在整个GPU中提供高效、高速的数据共享。物理效果、光线追踪以及稀疏数据结构等事先不知道数据地址的算法在硬件高速缓存上的运行优势尤为明显。后期处理过滤器需要多个SM才能读取相同的数据,该过滤器与存储器之间的距离更短,从而提升了带宽效率。

  统一的共享式缓存比单独的缓存效率更高。在独享式缓存设计中,即使同一个缓存被多个指令预订,它也无法使用其它缓存中未贴图的部分。高速缓存的利用率将远低于它的理论带宽。GF100的统一共享式二级高速缓存可在不同请求之间动态地平衡负载,从而充分地利用缓存。二级高速缓存取代了之前GPU中的二级纹理缓存、ROP缓存以及片上FIFO。

  统一的高速缓存还能够确保存储器按照程序的顺序执行存取指令。当读、写路径分离(例如一个只读纹理路径以及一个只写ROP路径)时,可能会出现先写后读的危险。一个统一的读/写路径能够确保程序的正确运行,同时也是让NVIDIA GPU能够支持通用C/C++程序的重要因素。

  与只读的GT200二级缓存相比,GF100的二级高速缓存既能读又能写,
而且是完全一致的。NVIDIA采用了一种优先算法来清除二级缓存中的数据,这种算法包含了各种检查,可帮助确保所需的数据能够驻留在高速缓存当中。

● ATI的一二级缓存设计:

  我们再来看看ATI的缓存设计,其中一级缓存部分与NVIDIA类似,每组SIMD阵列拥有32KB的本地共享缓存和8KB的一级纹理缓存,在通用计算中纹理单元可用于负责数据拾取,这样与SIMD捆绑在一起的4个纹理单元可共享8KB的一级缓存。

  RV870总共拥有20组SIMD阵列,这样总共就是160KB的一级(纹理)缓存和640KB的共享缓存。而GF100则拥有1024KB的可动态配置的一级缓存+共享缓存,不但容量更大而且效率更高。

  二级缓存部分与GT200/G80的设计相同,L2与显存控制器绑定在了一起,每个64bit显存控制器独享128KB L2,四个就是512KB。而GF100拥有单块768KB完全共享的二级缓存,同样是容量更大效率更高。

  可以看出,ATI的一二级缓存都是完全分散的,为了协调一二级缓存之间的数据交换,ATI特意设计了一个可全局共享的64KB数据缓存。至于独享式缓存与共享式缓存的效率与性能,无需多言,大家可参照CPU的发展即可略知一二。

第四章/第八节 GF100架构解析:光栅单元与高倍抗锯齿

  从HD4000时代开始,ATI改进ROP单元设计之后抗锯齿效能大增,在标准的4xMSAA模式下已经与N卡不相上下,而在最高的8xMSAA模式下大幅领先于N卡。NVIDIA虽然提供了比较巧妙的高精度CSAA模式,但画质方面还是比不上正统的MSAA,基于8xMSAA的更高级别8xQ AA与16xQ AA也毫无用武之地,因为N卡的8xMSAA效能偏低。

  为了一雪前耻,NVIDIA在GF100当中重新设计了ROP单元(后端渲染单元,俗称光栅单元)。主要是大幅提升了数据吞吐量与效率,上页介绍过GF100的L2已经不再与ROP及显存控制器绑定在一起,而且是全局共享的,因此存取效能与带宽大幅提升。

  GF100的每个ROPs包括8个ROP单元,比GT200翻了一倍。这8个ROP单元可在一个时钟周期类输出8个32bit整数像素、4个16bit浮点像素或2个32bit浮点像素。原子指令性能也得到了大幅提升,相同地址的原子操作执行速度最高可达GT200的20倍,邻近存储区的操作执行速度最高可达7.5倍。

  在GF100上,由于压缩效率的提升以及更多ROP单元能够更有效地渲染这些无法被压缩的较小基元,因此8倍速多重采样抗锯齿(8xMSAA)的性能得到了大幅提升。

  在上代架构中,由于ROP资源有限,在进行高倍抗锯齿采样的同时还执行渲染后端处理任务时(如SSAO、运动模糊、景深等),效率会非常低下。典型的比如《鹰击长空》、《晴空》等等。

  GF100不仅ROP资源非常丰富,而且可以在DirectCompute 11的帮助下减轻ROP部分的负载,提高执行效率,此时开启高倍抗锯齿就没什么压力了。

● 将CSAA精度提升至32倍,并优化算法实现更高画质

  解决了8xMSAA效率抵消的问题之后,NVIDIA在此基础上更上一层楼,开放了更高级别的32x CSAA抗锯齿模式,上代产品最高只能提供16xQ CSAA而且实用性并不高。同时新的抗锯齿模式还优化了“透明覆盖”(Alpha-to-Coverage)采样的算法,实现更高的画质:

  受到API与GPU计算能力的限制,当今的游戏能够渲染的几何图形数量还很有限。树叶的渲染是一个尤其突出的难题。针对叶子的一种常用技术就是创建一个包含许多树叶的透明纹理模版,利用“透明覆盖”来除去树叶之间的缝隙。覆盖采样的数量决定了边缘的画质。如果只有四个覆盖或八个采样,那么将会出现非常糟糕的锯齿以及镶边现象,尤其是在纹理靠近屏幕的时候。采用32倍速覆盖采样抗锯齿(CSAA),GPU共有32个覆盖采样,从而最大限度减少了镶边效果。

  透明多重采样(TMAA)也能够从CSAA中获益匪浅。由于“透明覆盖”不在DirectX 9 API当中,所以DirectX 9游戏无法直接使用“透明至覆盖”。而TMAA恰恰对这样的游戏有所帮助。取而代之的是,它们采用了一种叫做“透明测试”的技术,该技术能够为透明纹理产生硬边缘。TMAA能够转换DirectX 9应用程序中旧的着色器代码,使其能够使用“透明覆盖”。而“透明覆盖”与CSAA相结合,能够生成大幅提升的图像质量。

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