完美DX10!ATI新王者HD2900XT权威评测
R600对于DIY玩家已经不算陌生,过去一年多的时间里,相关R600的各类新闻充斥着硬件网站。但在今天,它真的来了! 带着众多Afans和新东家AMD的期盼,AMD首款支持DirectX 10显卡——ATI Radeon HD 2000系列正式发布。
如果说,AMD&ATI的联姻是一个新时代的开始;R600则是这场“婚姻”后真正意义上的产物。这个由当年缔造了经典R300研发团队,再度操刀的R600将会带来怎样惊喜? DirectX 10战场上NVIDIA/ATI精彩厮杀能否再度上演?本文将会带您进入精彩的R600世界。
第一节 2007显卡年!AMD/NVIDIA决战图形市场
内忧外患 Radeon HD2000注定多坎坷
OEM市场传捷报 R6**未发布已被抢购一空
第二节 奋起直追!全新Radeon HD 2000产品线解析
ATI Radeon HD 2000系列规格表
R600——Radeon HD 2900系列
RV630——Radeon HD 2600系列
RV610——Radeon HD 2400系列
第三节 功能化发展!Radeon HD2000系列亮点逐个看
全线支持HDCP数字保护
显卡声卡二合一!HD 2000支持HDMI混音输出
超低功耗 HD2600/2400率先采用65nm制程
迈进高清! ATI全新视频引擎UVD
第二节:二次革命!R600的统一渲染架构
第一小节:传统的显示芯片架构
第二小节:传统架构的劣势和不足
第三小节:ATI的第一代统一渲染架构:XENOS
第三章 DirectX发展回顾以及DirectX10详细介绍
第一节:技术背景——DirectX 的发展回顾和API相关基本常识
第一小节:DirectX简介
第二小节:DirectX发展历程
第二节 DX10的架构特性 以及带来的好处
1.降低绘制消耗
2.降低CPU依赖性
3.批量绘制
第三节 ATI 3Dc功能回顾
1.纹理压缩技术
2.3DC技术原理
3.3DC技术的优点
第四节 Shader Model 4.0
1 加入了一种新的Shader——Geometry shader
2 统一的Shader架构
3 百倍于DirectX 9的可用资源
4 更多的纹理
5 更多的渲染目标(Render Target)
6 新的HDR颜色格式
第五节 几何Shader以及 Stream Out
1 细分的虚拟位移贴图(Displacement Mapping with Tessellation)
2 基于边缘(Adjacency)的新算法
3 数据流输出(Stream Output)
第六节 高级渲染语言(HLSL 10)
1 常量寄存器(Constant Buffers)
2 Views
3 整形与位运算指令 (Integer and Bitwise Instructions)
4 Switch 语句(Switch Statement)
第七节 其他改进
第一小节 alpha to coverage
第二小节 shadow map filtering
第八节 游戏效果
第一小节 次世代Instancing技术
第二小节 基于象素级别的位移贴图技术
第一节 集众家之长,R600架构总览
1 Xbox360图形芯片Xenos,为R600的研发积累了宝贵的经验
2 R580架构的精髓被沿用在了R600之上
第五节 Ultra-Threaded Dispatch Processor(超线程分配处理器)
第六节 Stream Processing Units(流处理器)
第一小节 SIMD架构的弊端
第二小节 G80全新的MIMD架构
第三小节 R600的超标量SIMD架构
第八节 Shader Export & Render Back-Ends(像素输出部分)
第二节 传统的虚拟3D技术回顾
第一小节 通过纹理贴图获得“质感”
第二小节 凹凸贴图 Bump mapping
第三小节 法线贴图(normal mapping)
第四小节 视差贴图技术parallax occlusion mapping
第五小节 位移贴图(displacement mapping)
第六小节 ATI的独门秘籍 Trumform
第三节 Tessellation技术
第一小节 Tessellation技术的网格细分算法:
第一种:离散算法
第二种:连续算法。
第三种:自适应算法
第二小节 神奇的小数点——细分网格算法中小数位的意义
第三小节 Tessellation效率的源泉——控制“笼子”
第四小节 顶点插值技术
第一节 抗锯齿技术及其两种基本方法
什么叫做抗锯齿(Anti-Aliasing)
超级采样(SuperSampling)抗锯齿
多重采样(Multi-Sample),抗锯齿技术真正实用化
第二节 抗锯齿技术的发展
暂时性(Temporal)抗锯齿(ATI专用)
自适应(Adaptive)抗锯齿
双卡互联,让AA等级成倍提高
组合AA技术
第三节 DX10时代,NVIDIA和ATI大幅改进AA算法和精度
第一小节 NVIDIA GeForce 8系列全新CSAA
第二小节 ATI HD 2000系列全新CFAA(Custom Filter,定制筛选)技术
第三小节 各个等级的AA品质对比:
第一节 DEMO升华到产品形象代言人
NVIDIA的美女策略,四代产品形象代言人
ATI四代Radeon统一使用Ruby,技术见证虚拟人物的进化
Radeon HD 2000系列提出Perfect 10的概念
第三节 X850 Ruby:Dangerous Curves
第五节 HD 2900 Ruby:Whiteout高清截图赏析
第六节 HD 2900 Ruby技术解析
第一小节 更大规模的多边形,展现人物完美细节
第二小节 支持更多活动混合变形,人物更加生动活泼
第三小节 更多的资源用于渲染环境,画面表现力大幅提升
第四小节 HDR效果以及瞳孔根据光线变化
第五小节 物理加速的粒子系统
第六小节 CG级别山脉渲染全过程
第七小节 三款Ruby Demo运算量对比
第七节 前景 HD 2900 Ruby Demo引擎将会被很多游戏采用
第一节 GPU逐渐“蚕食”CPU的功能
第一小节 之所以称为GPU,是因为实现了硬件T&L
第二小节 不再需要解压卡!显卡就是高清视频加速卡
第三小节 DX10大革命:几何着色从CPU转移至GPU
第四小节 物理加速卡还能存活几年?显卡足以胜任物理加速技术
第二节 CPU地位遭受挑战,GPGPU大战一触即发
为科学计算作贡献,ATI GPU大放异彩
AMD发布首款流处理加速卡,GPU通用计算真正进入实用阶段
第三节 R600——为通用计算而生
HD Cap`n`Stream技术,GPU视频编码加速
庞大的运算资源,R600单卡就能物理加速
R600能用于更多的非3D场合
第二节 三种HDTV编码方式对比
1 MPEG-2——已经难不倒主流CPU和显卡
2.VC-1(WMV9)——存在局限性的平衡之选
3.H.264(AVC)——最被看好的视频编码格式
第三节 各种显卡HDMI接口方案
第一种:无音频方案
第二种:音频“飞线”方案
第三种:光纤接线方式
第十一章 Radeon HD 2900XT显卡实物赏析和设计解析
第二节 揭开R600的庐山真面目,HD 2900XT全面拆解
第四节 HD 2900XT显卡特殊功能介绍
核心集成完整声卡,DVI也能输出音频!
视频芯片升级,多媒体功能大大加强
双桥交叉火力,双卡组建更容易,效能更强!
全新8Pin+6Pin PCI-E供电接口,保证极限超频的供电
第五节 HD 2900XT显卡供电模块解析
第一小节 8800GTX的PCB为何这么长
第二小节 ATI采用VOLTERRA优异供电解决方案
第三小节 最大电流输出、最高转换效率
第四小节 少有的显存IO供电
第五小节 多层陶瓷电容(MLCC),优异做工与用料
第六小节 辅助供电模块同样豪华无比
第九节 游戏测试:Half-Life2:Episode One(半条命2:第一章)
第十六节 游戏测试:Test Drive Unilimited(无限试驾)
第十七节 游戏测试:S.T.A.L.K.E.R (切尔诺贝利阴云)
第一节 DX10浮出水面,两大阵营硬件齐备,玩家苦于没有游戏
第四节 DirectX SDK测试(微软官方2007年四月版)
第一小节 Basic HLSL测试
第二小节:CubeMap GS测试
第三小节:Displacement Mapping测试
第四小节:Draw Predicated测试
第五小节:FixedFuncEMU测试
第六小节:Instancing测试
第七小节:MotionBlur10测试
第八小节:ParticleGS测试
第九小节:PipesGS测试
第十小节:skining 10
第十一小节:soft particle
第一章 前言 Afan的节日 R600震撼发布
第一节 2007显卡年!AMD/NVIDIA决战图形市场
在竞争激烈的图形芯片领域,2007年被业内人士寄以厚望。微软新一代操作系统Vista将个人电脑的3D门槛大大提高;具有革命意义的DirectX 10以及众多诱人的DX10游戏更促进了显示卡的更新换代。机会与挑战并存,对于NVIDIA/AMD两大竞争对手来说,2007年同样具有战略意义的一年。
● 内忧外患 Radeon HD2000注定多坎坷
R600发布固然是个好消息,但AMD近来传出的消息却不慎乐观。四月末,AMD公布了2007年一季度财报:AMD今年第一季度的销售收入为12.33亿美元,这一业绩与其2006年同期的销售收入13.32亿美元相比,减少了0.99亿美元,继续处于亏损状态;再此期间,AMD为了ATI继续支付了1.13亿美元收购开支。看来,06年大手笔的收购案以及处理器市场激烈竞争导致利润降低,短时间内AMD财务状况仍不是太乐观。
从市场状况来看,竞争对手NVIDIA支持DirectX 10的高端G80系列已经上市长达半年。8800GTX/GTS以及简化版的8800GTS 320M覆盖了从6000~2000元的绝大多数高端市场。半年来的市场真空不仅保证了丰厚的利润,也创造了NV高端卡市场的非常好的销量。而待到R600上市后又很可能迎来NV的价格战,这对于在制造成本上不占优势的R600系列将是更大的考验。
不过一切还算不上太糟糕,DirectX 10游戏的全面延期使得市场对于DX10显卡需求也相应放缓。对于在未来几月才能陆续到来的DX10游戏,A卡还有较为充裕的时间准备。尤其在销量最大的千元内主流市场,NV新推出的8500/8600优势尚未完全建立,市场对于Radeon HD 2000系列前景依旧看好。
● OEM市场传捷报 R6**未发布已被抢购一空
“前途是光明的,道路是曲折的”这句老话用在A卡身上再适合不过。自去年AMD完成对ATI的并购后,AMD也成为业内唯一能独立提供CPU+GPU+芯片组的厂商,创新的平台化战略大大加强了AMD/ATI产品的竞争力。
据外电报道称,R6**系列图形芯片已经卖出了百万颗芯片。其中低端RV610(HD 2400系列)尚未发布就已被被戴尔、惠普和联想三家瓜分一空。OEM巨头所看重的正是RV610低廉的成本(核心小、64Bit显存成本低)、极小的发热(65nm核心)、UVD高清视频加速和完整的DX10支持。另据有关预测显示,到2007年底,AMD 65纳米的 GPU销量有可能达到一个亿!
第二节 奋起直追!全新Radeon HD 2000产品线解析
● ATI Radeon HD 2000系列规格表
针对新一代产品在HD应用上的特色,AMD也将之前的英文字母“X”从产品命名当中除去。R600、RV630、RV610以及未来的RV6XX系列将会统一命名为Radeon HD 2XXX系列。
Radeon HD 2XXX系列规格表(点击看大图)
● R600——Radeon HD 2900系列
AMD Radeon HD 2000产品线的高端部分目前只有Radeon HD 2900XT一款,仍采用TSMC 80nm工艺制作。Radeon HD2900系列图形芯片拥有7亿个晶体管,内建320个流处理器,搭配双向512-bit显存位宽;支持原生交火、128-bit HDR渲染、硬件支持物理加速;而在HDTV支持方面,显卡内建了HDMI数字输出以及5.1声道的音频输出。
● RV630——Radeon HD 2600系列
Radeon HD 2600系列采用TSMC最新的65nm工艺。芯片拥有3.9亿个晶体管,内建了120个流处理器,搭配128bit显存位宽主要面向中端市场。主流的Radeon HD 2600系列将拥有XT、Pro两种规格,通过不同显存搭配从而衍生出多个不同版本。
Radeon HD 2600系列支持最新Avivo HD技术。能够从硬件端完成蓝光、HD-DVD影碟(H.264、VC-1编码)的播放,从而彻底解放CPU。
Radeon HD 2600XT GDDR3/Radeon HD 2600PRO GDDR3
RV630相关型号规格:
Radeon HD 2600XT 512MB GDDR4
Radeon HD 2600XT 512MB GDDR3
Radeon HD 2600XT 256MB GDDR3
Radeon HD 2600PRO 256MB GDDR3
● RV610——Radeon HD 2400系列
面向入门级用户的RV610(Radeon HD 2400系列)分为XT、Pro两种规格,芯片拥有1.8亿个晶体管,内建40流处理器,64bit显存位宽;低端的Radeon HD 2400系列同样保留在HD视频全面的功能。能够支持UVD以及Avivo HD,在输出方面同样支持HDMI以及5.1声道音频输出。
RV610的功耗仅为25W,发热很小,很容易被设计成被动散热以及刀卡板型,这个特性使得它非常适合用在准系统或者HTPC之上,再加上先进的规格,前景十分广阔!
Radeon HD 2400XT GDDR2与Radeon HD 2400Pro GDDR2
RV610相关型号规格:
Radeon HD 2400XT 256MB GDDR2
Radeon HD 2400PRO 256MB GDDR2
Radeon HD 2400PRO 128MB GDDR2
● Radeon HD 2000系列定价
根据AMD官方定价,高端HD 2900XT售价不足400美金,国内售价在3000~3500元左右;HD 2600系列由于规格较多,定价从99~199美金(800~1600元之间),基本于NV 8600GTS/GT相似。低端的HD 2400价格将低于99美元,国内售价在500~700元之间。
第三节 功能化发展!Radeon HD2000系列亮点逐个看
硬件产业发展至今,3D游戏性能早已不是衡量一款显卡优劣的全部。了解了Radeon HD 2000系列又具备哪些亮点功能?在正式评测开始前,先让我们来简单了解一下。
● 全线支持HDCP数字保护
作为高清视频内容的保护机制,HDCP(High-Bandwidth Digital Content Protection)是软件和硬件厂商针对HDTV推出的版权保护协议。在使用PC/HTPC播放蓝光和HD-DVD的播放过程中,选择一块支持HDCP的显卡是必不可少的环节。只有这样,才能完整输出蓝光和HD-DVD影碟的全高清画面。
Radeon HD 2000系列芯片全部内建HDCP密钥
从X1000系列开始,ATI中高端产品中已经开始加入了对HDCP的支持。但从制造成本考虑,HDCP仍只作为厂商的参考方案,市场销售的千元以内显卡绝大多数并不支持HDCP。随着高清内容的迅速普及,AMD已经将HDCP作为标配,HD 2000系列全线产品均可支持HDCP数字保护。
● 显卡声卡二合一!HD 2000支持HDMI混音输出
在显示卡发展初期,声卡显卡二合一并不算罕见。不过随着个人电脑市场的发展趋势,偏重3D性能的显卡与声卡功能完全分开从此分道扬镳。然而,HDTV的普及/应用却再次为显卡声卡的合二为一提供了非常好的的契机。
作为AMD新一代图形芯片的另一大特色,Radeon HD 2000系列核心集成了完整的声卡部分。不过这并不是说R600会竞争创新X-Fi等普通声卡,HD 2000系列音频部分是用来提供HDMI输出。因此在使用HD 2000系列显卡接驳大屏幕平板电视时可以更加方便输出视频和音频。
另据AMD官方资料,通过DVI-HDMI转接器HD 2000系列可提供Full HD 5.1音频信号。关于音频的详细介绍及测试,将在下文中为大家介绍。
● 超低功耗 HD2600/2400率先采用65nm制程
在此次推出的HD 2000系列显卡中,除高端R600(HD 2900XT)仍采用80nm制程外,另外两款RV630(HD 2600系列)、RV610(HD 2400系列)均采用TSMC 65nm工艺制造,这也是业界首款采用65nm工艺制造的GPU。
得益于更先进的工艺制程,RV630与RV610相比RV5**核心面积更小,对于芯片成本降低有利。不仅如此,先进的65nm工艺也使得功耗发热得到明显改善。低端RV610显卡的功耗仅为25W,很容易被设计成被动散热以及刀卡板型,这也使得它非常适合用在准系统或者HTPC之上,应用前景广阔。
● 迈进高清! ATI全新视频引擎UVD
R6XX系列除了集成声卡以及HDMI/HDCP等先进特效之外,新一代的高清视频加速引擎UVD也是一大卖点。作为Avivo的升级版本,UVD引擎在播放HDTV高清视频时有着更为出色的表现。与以往视频解码由CPU和GPU共同完成不同,UVD引擎能够在显卡上完成蓝光、HD-DVD影碟(支持H.264/VC-1编码)全部解码过程,从而彻底解放CPU。
在下文中,我们还会就UVD引擎进行介绍。
● 第二章 统一渲染架构详细解析
R600在架构上最大的特点就是它采用了第二代统一渲染架构(Superscalar Unified Shader Architecture )。这种架构院源自于Xbox360使用的Xenos图形核心。本章节将为您介绍一下统一渲染架构的特点。
第一节:3D图形创建原理
在为大家介绍R600的统一渲染架构之前,为了让更多的朋友能对统一渲染架构的革命性创新有更深入的了解,我们先介绍下图形管线,来看看传统的显卡管线工作原理,3D画面是如何最终展现在屏幕上的。
3D程序从载入到展现在屏幕上,在传统图形管线中是经过下列四个步骤的:
● 第一步:应用程序载入/ 场景构建
其中包含了场景/几何数据库遍历、对象的运动,观察相机的运动和瞄准,对象模型的动画运动,3D 世界内容的描述,对象的可见性检查,包括可能的遮挡剔除、细节层次的选择 (LOD)等处理。
简而言之,这一步主要是决定在游戏中有哪些对象, 它们的模型、使用的纹理,可能在什么动画帧,以及它们在游戏世界里的位置。 也决定照相机的位置和方向。
● 第二步:几何处理
几何处理过程也就是传统意义上的坐标转换和光源(Transforms&Lighting )
。其中包含几何模型的变换 (旋转,平移, 缩放),从模型空间到世界空间的变(Direct3D),从世界空间到观察空间变换,观察投影,细节接受/ 拒绝 剔除,背面剔除 (也可以在后面的屏幕空间中做),光照,透视分割 - 变换到裁剪空间,裁剪,变换到屏幕空间等几个步骤
在第二步中,计算机处理的内容是几何模型,不包括贴图和其他素材,因为只有骨架确定了位置和形状,往上面贴图才是有意义的。我们所说的“骨架”,也就是几何模型,在电脑里存储的信息就是确定这个几何模型的顶点的数据。因为我们知道,两个点能够确定一条线,三个点能够确定一个面,也就是一个三角形,而多个三角形可以组成一个多边形,多个多边形就确定了一个几何模型。
而且,3D画面中的任何一个顶点都有一个坐标,当此物体运动时,它包含的顶点坐标发生变化,这指的就是几何模型的变换。这个步骤里每个模型的每一时刻的顶点位置都要被重新确定。
然后进行的是观察投影(坐标转换),每一个时刻的3D几何模型将会由3D状态转变为2D状态,具体的方法就是将3D几何模型的每一个顶点的三维坐标通过投影的方法转换为二维坐标。这个过程中,做转换用的平面是根据玩家看游戏的方向和视角决定的。这个过程中电脑并不会进行贴图的操作。甚至每个顶点之前也仍然都是独立没有关系的。
这个步骤中包含了隐面消除技术(HSR),现实处理时还常加上背面剔除来提高效率。现实生活中,当你观察A物体的时候,如果物体B在你和A物体之间,那么你的视线就被物体B所遮挡。在3D技术发展的初期,整个3D场景所包含的顶点都被进行坐标变换并进行处理,这样一来,很多最终不会被显示在屏幕上面的模型也会被处理。所以研究人员发明了Z缓冲器算法来提前进行Z轴判断,也就是判断每个顶点的前后关系,从而决定究竟哪些顶点会被显示。Z缓冲器其实就是另一种帧缓冲器, 不同的是帧缓冲器存的是画面上每个像素的光亮度, 而Z缓冲器存的是画面上每个像素内可见表面采样点的深度。后来还有扫描线Z缓冲器算法,用于消除早期Z缓冲器算法内存消耗严重的缺点。
3D游戏中除了场景与物体还需要灯光,没有灯光就没有3D物体的表现,无论是实时3D游戏还是3D影像渲染,加上光照的3D渲染会引入大量的数学计算。在硬件T&L问世之前,位置转换和光照都需要CPU来计算。ATI从REDEON 256开始支持硬件T&L功能,从而把CPU从繁重的数学计算中解脱出来。后来,在硬件T&L但元为顶点着色单元所取代,这次REDEON X2900XTX的发布,带来的又是一场全新的革命,统一渲染架构下的64个5D Unifide Shader运算单元理论上都可以用作顶点的运算。
● 第三步:三角形生成
这个过程就是将已经转换为二维坐标的点根据他们之间的关系,构建成为三角形,也就是上一步骤中产生的骨架模型被附着一套三角形网格,这一过程也就是所谓的蒙皮,为下一步的贴图做准备。蒙皮过程需要进行计算普通或是相切的向量,并且需要骨架的节点被转化,因此他们与基础形态的关节是相关的,基础形态的关节会被转化后用于生成动态的网格。
一个简单的人物模型有5000多个多边形
一个复杂的人物模型会有多达两百万个多边形
构建三角形的这个过程常常称之为Setup,不论在GeForce 256发布前后,这个部分都是显卡的性能衡量的重要指标,也就是“三角形生成能力”。
● 第四步:渲染/光栅化
首先是处理原始的贴图或者材质素材,简单的而言就是根据需要把贴图处理一下,大多数情况是把贴图斜向做透视,说的明白一些就是把图片变变形状。这个过程中,我们常常提到的材质过滤(Texture Filtering,包括二线型过滤,三线性过滤,各项异性过滤)就是在这里做处理的。特别是各向异形过滤在做高等级处理的时候,消耗资源也相当的大。
应用程序经常需要把纹理贴到几何体上并使texel直接映射到屏幕上的像素。例如,以一个需要在纹理中显示文本的应用程序为例,为了使纹理中的文本能清晰地显示,应用程序需要以某种方式确保映射到几何体上的texel不受纹理过滤的影响。如果无法保证这一点,那么得到的图像通常会是模糊的,如果纹理过滤方法为最近点取样,那么可能会产生粗糙边缘。为了统一像素和纹理取样,并同时支持图像和纹理过滤, Direct3D的像素和纹理取样规则经过了精心定义,但这也使得把纹理中的texel直接映射到屏幕上的像素成为一个相当有意义却又艰难的挑战。
当然,这个过程随着可编程像素单元问世后变得更加复杂,实时的阴影、光照计算,甚至根据法线贴图做虚拟的3D贴图技术,都是Pixel Shader处理的内容,所以Pixel Shader从问世后就成文显卡中对性能影响最大的一个部分。上一代的R580显示芯片提供了多达48个4D Pixel Shader单元,不过在R600中,弹性的统一渲染架构让可进行Pixel Shader处理的单元最大增加到理论上的64个5D Unifide Shader单元。
第二,对三角形进行像素的填充,将处理好的每一个象素填充到三角形中,在具体的执行操作的时候其实几乎是和Pixel Shader对像素的计算同步运行的。处理一些像素,就填充一些,然后再运行Pixel Shader处理一些象素。
这个过程处理的数据也比较多,如果FPS确定、分辨率一定,数据量也就固定了。当然如果括反锯齿的处理,那么需要的像素数据量也会倍增。这部分在当年3D加速芯片问世的时候也是显卡性能的另一个最重要的指标,直接决定了游戏的显示速度。这也是我们常说的“像素填充率”指标。
在“隐面消除技术”出现之前,这个步骤还要进行根据Z轴信息做Z轴判断,看哪个象素在前面才画出来,哪个象素在后面就不画出来。不过这种低效率的做法早已经被淘汰了。
最后,是光栅处理以及帧缓冲和输出,这个步骤起的作用是将已经着色的象素进行透明度(Alpha)混合等处理,这个过程就相当于最终决定显示什么图像的最后的操作,所以也非常的重要。在这个部分,显示芯片也需要投入大量的运算,所以显示芯片也使用了多个ROP单元同时运行的设计。
经过ROP处理后的数据就是即将显示到显示器上的画面了,显示卡会将这些数据存入一个帧缓冲后再进行输出,由于帧缓冲的速度非常快,所以我们是感受不到的。
到这里,整个显卡管线的处理过程就算是完成了,接下来就是通过RAMDAC转换为模拟信号,通过D-Sub接口输出到显示器上。或者通过TMDS的运算转换为TMDS信号,通过DVI输出到LCD上。
●第二章 第二节:二次革命!R600的统一渲染架构
上面我们介绍了3D图形管线的整个工作过程,那么在这一节中我们将介绍R600的第二代统一渲染架构。
●第二章 第二节 第一小节:传统的显示芯片架构
我们已经在第一节中介绍了3D游戏的处理的全部过程,那么在为大家介绍R600的统一渲染架构之前,我们有必要先了解一下传统图形架构的相关知识。
如前一节所述,3D图形管线是一种顺序处理的过程,这种顺序执行的结构就像是一个管道一样,各种数据就像是管道里的水,不断留向下一级,所以人们也就根据这种特性为这种结构的处理单元起了一个更为形象的名字,这就是“管线”(Pipeline)的由来。
不过在目前的显示芯片中,管线通常有多种类型,比如像素渲染管线、顶点着色管线、像素着色管线。其中,像素渲染管线是一直存在于图形芯片中的,和三角形生成一样成为早期图形核心的标志性功能。目前像素渲染管线演变为ROP单元,也就是说对于目前的GPU,有几个ROP单元就相当与有几条像素渲染管线。
像素着色管线、顶点着色管线是从DirectX8开始被引入,具有可编程性。从此以后像素渲染管线逐渐退居到一个相对次要的地位,顶点着色管线、尤其是像素着色管线成为显卡的决定性因素。
● 第二章 第二节 第二小节,传统架构的劣势和不足
我们注意到,在之前的显示芯片设计的时候,显示芯片厂商在设计的时候并不会将顶点管线和象素管线按照相同的数目去做。而是将顶点管线相对放的少一些,多放一些象素渲染管线。
那么显示芯片厂商为什么要这么做呢?答案是:这样的结构和比例是芯片设计厂商根据常见游戏的情况而决定的。
不同的游戏在开发的过程中,设计的游戏复杂度是不同的,有的游戏就非常简单,3D模型也相对简单,这样游戏就可以在更多的玩家的电脑上运行。有的游戏的3D模型和后期特效就非常复杂,这样在保证了游戏的效果的同时就让很多配置不是那么好的玩家无法运行或者运行起来特别慢。
除去游戏复杂度的区别,游戏的开发商和显示芯片厂商还处在一个更加难以解决的怪圈中,这就是,游戏开发商无法在游戏的资源消耗定向上达成一致,所以带给了显示芯片厂商很大的麻烦。
具体来说就是,有的厂商会开发一些3D模型很复杂,顶点数目很多的游戏,这些游戏就需要耗费很大的顶点渲染管线的资源,这类游戏可以把通常场景很复杂,里面的3D模型的细节非常到位。而另一类厂商则会将焦点放在后期的象素级别的特效,这样的好处就是可以给游戏带来更炫的视觉效果。
Vertex Shader、Pixel Shader负载不均衡
举例来说,上图可以看到一个典型的例子,第一场景(鲨鱼)主要是由框架以及三角形来构成的,因此对于Vertex Shader的计算量是相当高的,而Pixel Shader计算的部分却非常少,Pixel Shader的管线资源被闲置。
而第二个例子描绘的是一个复杂水体模拟场景,是由大量的光影特效都是依靠像素处理实现的,因此对于Pixel Shader单元的要求却非常高,而Vertex Shader的操作早已完成,导致了资源的浪费。这两个例子充分的证明了这样一个事实,大部分的应用中,Vertex Shader和Pixel Shader处理不平衡的现象非常普遍,导致部分Shader单元闲置,从而浪费宝贵的资源。这也正式Shader单元分离式设计显示卡的最大弊端之一。
在这种情况下,显示芯片厂商只能按照最常见的游戏的情况来设计显示芯片,尽最大能力去满足不同的游戏。
而游戏厂商在设计游戏的时候也不能随心所欲的设计游戏,必须满足显示芯片的性能配比,这样才能在消耗性能最小的情况下达到最好的游戏效果。
这个矛盾一天不得到解决,显示芯片最大的效能就不能充分的得到发挥,这也一直是显示芯片的性能提高的最大瓶颈所在,在这样的架构上,不断的加“管线”,提高频率是显示芯片厂商唯一能作的事情。
传统显示芯片架构的缺点
1 游戏厂商无法按照需要设计游戏,必须向硬件性能妥协。
2 显示芯片的利用效率不高,运算单元被闲置的现象经常发生。
统一渲染架构的优点
1.动态分配运算单元,提升利用率
在这样的统一渲染架构下,每个处理单元都可以进行Vertex Shader的运算和Pixel Shader的运算,这样一来,无论是怎样的游戏,都能够充分利用显卡的资源,再也不会有一些处理单元闲置,一些处理单元负载过高的情况出现了。
在需要大量顶点运算的游戏中, Unified Shader将被分配去做顶点的运算,而在需要大量后期象素级别特效的时候, Unified Shader将被安排去做Pixel Shader的事情。
2.并行处理,提高利用效率
除了动态分配方面带来的好处,这样的结构还有利于处理并行性的提升,因为这些处理单元可以并行运行,不像原来的串行的结构那样顺序执行。
● 第二章/第二节/第三小节:ATI的第一代统一渲染架构:XENOS
这一节,我们主要回顾下ATI第一代统一渲染架构:用于XBOX360的XENOS的图形核心。
ATI从2003年9月与MICROSOFT签订协议,为新一代游戏主机XBOX360开发图形核心,由此开始,ATI正式着手研发第一代基于统一渲染架构的图形核心:XENOS。XENOS(研发代号C1)的研制工作于2005年底结束,也成为世界上第一个的统一渲染架构的图形核心
Xenos一共由两个图形运算核心构成,主内核拥有2亿3200万晶体管,核心频率为500MHz,拥有48个Unified Shader。Daughter Die附内核拥有1亿晶体管,由NEC 90nm工艺制造,负责处理所有采样运算,包括色彩读写、混合,多重采样AA,Z轴运算等。
Xenos核心的特点如下:
(1)是世界上首个基于统一渲染架构的图形核心,可以支持更加优化、效率更高的图形算法。
(2)具有硬件线程分派单元,可以充分提高shader单元的利用效率,配合unified shaders使核心的Shader负载更加平衡。
(3)具有智能的内嵌式存储器,可以提供高到320M/S的带宽,具有专门的逻辑控制单元以及加速反锯齿、 alpha blending等操作。
(4)可以和把数据直接读取或写入到CPU的缓存,更加高效的处理流式指令。
(5)Xenos有自己专门的编译器。
点击查看大图
● Xenos的统一渲染架构:
统一渲染架构,从硬件的角度来说,就是指不再有Vertex、Pixel Shader单元的划分,显示核心不再为Shader类型不同而配置不同类型的Shader单元,在统一渲染架构中这两种Shader单元被统一为Unified Shader,所有的Unified Shader单元都可根据需要需要进行处理,不管和是Pixel Shader类型还是Vertex Shader类型。
Xenos具备48个“4D+1D”(矢量+标量)的Unified Shader,其ALU单元为SIMD结构,每16个着色单元被合并为一个着色矩阵,调配哪几组Shader单元负责处理何种指令或者进行什么类型的计算,则由一个被称为thread arbiter(线程仲裁器)的部分来控制。不过,在Xenos中每个矩阵内部同一周期内只能执行同一类别的指令,要么Pixel Shader要么是Vertex Shader,虽然不太灵活,但还是实现了统一着色架构,大大提高了Shader单元的负载平衡。
Xenos具备三组线程控制器,最大可以支持64个并行的线程,可以充分提高shader单元的利用效率,有效掩盖了着色管线的延迟问题。其统一渲染架构具备三组渲染单元(每个渲染单元具备16个Shader单元,总共具备16x3=48个Shader单元),也就是说每一组渲染单元都将具有一组独立的线程控制器,而更多的仲裁器显然可以更加优化Shader指令的分派,根据ATI的测试表明,在通用图形计算中,Xenos的shader array可以达到95%的利用率。
虽然没有引入Geometry Shader,但是Xenos中增加了一个Geometry Tessellation Unit镶嵌处理单元,可以对输入的三角形,矩形、正方形进行分割处理。不过,Xenos的Tessellation单元为固定功能的单元,不具有可编程性,也可看作是Geometry Shader的一个雏形,而Tessellation后来也成为DirectX 10中引入的Geometry Shader的功能之一。由于没有Geometry Shader,Xenos自身并不能生成多边形。不过Xenos中的MEMEXPORT、CPU streaming 技术可以实现类似于DirectX 10中的stream-out功能,所以,Xenos可以把数据发送给CPU的cache,然后通过复用实现生成多边形的目的。值得一提是MEMEXPORT可以直接和系统存储器交换向量数据,它的引入也提高了Xenos的通用计算性能以及可编程性(即扩展了shader program 的长度)。
同时,Xenos的数据流控制效率更高,ATI还为vertex、pixel计算引入了统一指令集,可以更快速的执行一些复杂的图形算法,如高次表面和全局照明等等。
Xenos还拥有16个纹理拾取单元(过滤纹理单元,带LOD)和16个顶点拾取单元(无过滤/点取样单元)。如果需要还可以增加若干的附属纹理处理单元。所有这些元件都是由纹理处理阵列控制,且每一个纹理单元都有自己的纹理地址处理器。每一个过滤纹理单元都具备双线性取样能力,并可以支持三线性或更高的排列过滤技术(如Anisotropic Filtering,各向异性过滤)。由于XBOX36O采用了是UMA控制器类型,因此整个RAM系统都将支持纹理取样。为了弥补10MB eDRAM在进行反锯齿的时候容量不足的问题,Xenos以Tile Rendering 的方式来实现 FSAA。 此外,Xenos也支持Multiple Render Targets (多目标渲染)、Hierarchical Stencil Buffer(层次模板缓冲)、Alpha-to-Mask等主流技术。
● 第三章:DirectX发展回顾以及DirectX10详细介绍
第一节:技术背景——DirectX 的发展回顾和API相关基本常识。
Microsoft发布的DirectX 10代表了自从可编程Shader出现以来在3D API方面的最巨大的进步,也是自DirectX诞生以来,又一次彻底的重新设计。通过一番脱胎换骨般的重建,DirectX 10展现出一系列非常醒目的新特性,包括高度优化的运行时,强大的Geometry Shader,纹理数组等等;这些特性将引领PC实时三维图形进入一个全新的世界。
DirectX总览
在过去的十年中,DirectX已经稳步成为了Microsoft Windows平台上进行游戏开发的首选API。每一代的DirectX都带来对新的图形硬件特性的支持,帮助游戏开发者们视线更惊人的特效。那么我们也就按照DirectX发展的轨迹,以Direct3D为重点,为读者完整回顾下DirectX的辉煌历程。
● DirectX简介
DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染、交互式音乐和环境音效等高要求应用开发服务的。
通常,Windows对硬件访问的管制非常严格,用通常的办法不易访问,但DirectX通过“硬件抽象层(HAL)”给予了开发人员直接访问硬件的能力,HAL不仅解决了硬件及兼容性问题,而且开发人员可以利用它直接访问计算机的某些硬件设备,例如显示设备的直接显存控制和渲染,键盘、鼠标和游戏杆的控制的直接访问控制,音频设备的直接音频混合与输出能力等等,因此开发人员可以充分利用硬件加速将程序的性能优化到一个新的高度,如果目标机器不支持相应的硬件加速,DirectX还可以仿真加速器以提供强大的多媒体环境。DirectX家族包含的成员有Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectSound、DirectDraw、DirectVoice、 DirectVideo和 DirectShow 。
● DirectX发展历程
1.DirectX 1.0
1995年9月,伴随着Windows95的发布,微软推出了DirectX 1.0。其中,来自于ATI的开发团队为DirectX的开发带来了最基础的图形技术。第一代的DirectX很不成功,推出时众多的硬件均不支持,当时基本都采用专业图形API-OpenGL,缺乏硬件的支持成了其进一步扩大影响的最大障碍。DirectX 1.0版本是第一个可以直接对硬件信息进行读取的程序。它提供了更为直接的读取图形硬件的性能以及基本的声音和输入设备功能(函数),使开发的游戏能实现对二维(2D)图像进行加速。这时候的DirectX不包括Direct3D,还处于一个初级阶段。
2.DirectX 2.0/2.0a
DirectX 2.0
1996年,伴随着Windows95的成功,微软实行了一项新计划,以支持在Windows95上运行更多的3D游戏,目标是扩大市PC领域的游戏市场。于是微软收购了英国的Rendermorphics,Ltd.并得到了名为RealityLab的3D API。经重新整理,微软发布了新的3D API——Direct3D,并整合在DirectX2.0中。
DirectX2.0最大的改善是在Direct Draw,而且为当时风靡全世界的《RedAlert》和《Diablo》所支持,《RedAlert》的Windows版本和《Diablo》都是在DirectX的标准上开发的。除了2D以外,DirectX2.0的D3D部分的雏形基本完成,由于当时3D游戏较少,很多都是基于DOS开发的。世嘉公司的VR战士的PC版本就是基于DirectX2.0开发完成的,虽然效果粗糙了一些,但Direct 3D魅力还是可以感受到的。
在DirectX 2.0中,采用了“平滑模拟和RGB模拟”两种模拟方式对三维(3D)图像进行加速计算的。DirectX 2.0同时也采用了更加友好的用户设置程序并更正了应用程序接口的许多问题。从DirectX 2.0开始,整个DirectX的设计架构雏形就已基本完成。但是当时3D游戏程序更多的是基于3DFX的Glide以及ID的QUAKE引擎(OpenGL)开发,支持Direct 3D的游戏很少。
3.DirectX 3.0/3.0a
1996年后期,微软发布了DirectX 3.0,DirectX 3.0是DirectX 2.0的简单升级版,它对DirectX 2.0的改动并不多。包括对DirectSound(针对3D声音功能)和DirectPlay(针对游戏/网络)的一些修改和升级。DirectX 3.0集成了较简单的3D效果,还不是很成熟。
在微软不遗余力的推广下,DirectX的魅力被众多软硬件厂商看好,让D3D有了与OpenGL与Glide格斗的资本。从这个版本开始,很多玩家知道了DirectX存在,也是这个时候开始出现了可以支持Direct 3D的加速卡,如Nvidia的Riva128,Intel的I740。
当然微软在Direct3D的推广中并不是一帆风顺,也出现过不少波折。微软当时拒绝了在Window95上支持OpenGL并采取异常手段收回对OpenGL的MCD驱动接口的支持,这个做法导致了很多游戏开发者的反对。QUAKE之父John Carmack公开声明拒绝D3D,著名游戏制作人Chris Hecker在游戏开发杂志上发表了两套API的全面分析,并以微软应放弃D3D为结论。以John Carmack为首的56名首席游戏开发者曾联名至信微软,要求其发行OpenGL MCD驱动。
微软则坚持自己的一贯立场:Direct3D面向通用(high-volume)、高性能应用,认为OpenGL只面向高精度的专业CAD应用。所以微软继续增加对Direct3D的投资,并继续削减对OpenGL的投入。
4.DirectX 5.0/5.1/5.2
1997年6月,微软公司跳过了DirectX 4.0,直接推出了DirectX 5.0。DirectX 5.0对Direct3D做出了很大的改动,加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,此外还加入了S3的纹理压缩技术。
同时,DirectX 5.0在其它各组件方面也有加强,在声卡、游戏控制器方面均做了改进,支持了更多的设备。因此,DirectX发展到DirectX 5.0才真正走向了成熟。此时的DirectX性能完全不逊色于其它3D API,而且大有后来居上之势。
微软的投入也得到了回报,3DFX的GLIDE API开始逐渐失去了过去在游戏开发领域的优势地位,最著名的两个例子就当时称得上是风靡世界的古墓丽影2和优品飞车2,这两个过去本来是GLIDE的御用游戏,都加入了对D3D API的支持,当时著名的Riva 128等非VOODOO显卡也可以通过D3D接口完美的运行游戏。
5.DirectX 6/6.1
1998年7月,DirectX 6正式发布,它的新特性有:几何形体的灵活顶点格式定义、几何形体的顶点缓冲存储、支持多纹理渲染、自动纹理管理、可选深度缓冲(使用Z Buffer或W Buffer)、通过凹凸环境贴图(ENV BUMP ENVMAP,同级别显卡中只有MATROX的G400支持)为反光面和水波特效提供逐像素的渲染和贴图能力。DirectX 6的3D效果更丰富,而且借助硬件的强大性能,可以渲染出高分辨率下的32位色的图像效果。可以看到,这一时期,DirectX 的技术进步速度也远远超过了GLIDE。
6.DirectX 7/7.1
1999年9月,微软推出了DirectX 7.0。DirectX7最大的进步就是支持硬件T&L(Transforms&Lighting),也就是“坐标转换和光源”。上一章已经有过介绍,此处不再赘述。
DirectX 7的其它新特性有:立方体表面的环境贴图、几何渲染、改进的纹理渲染、自动纹理坐标生成、纹理转换、投影纹理和任意面裁剪、D3DX实用库等。
DirectX 7的发布无疑给了GLIDE的致命的一击,DirectX 7提供的特效更丰,D3D函数库的引入方便了开发人员的使用,迅速得到游戏厂商的青睐。为了挽回局面,3DFX甚至还开放GLIDE源代码,但最终GLIDE还是被广大开发人员所离弃。没有了GLIDE的3DFX最终也以被自己的老对手NVIDIA收购而告终。
7.DirectX 8.0/8.1
2000年9月,微软正式推出了划时代的DirectX 8 ,将可编程的着色管线概念正式引入到GPU,新的shaders(着色器)数据处理方式也是DirectX 8中最具意义的创新。Shader采用了新的数据处理程序模型,这与旧有的预定义模型是不同的。这种模型中,数据是透过virtual machine以一个类似于带有特殊汇编指令集的pre-arranged(事先安排好)程序进行处理的,程序员可以直接对其进行编程。
DirectX 8
凭借可编程几何管线和可编程像素管线,使用者可以自由的控制几何和像素的代码设计。这对于图形开发者是空前的,他们可以通过基本的着色器,利用开发工具,产生全新的,极具创造力的效果。也正是可编程管线的引入,为GPU发展翻开了新的篇章,GPU开始向SIMD处理器方向发展,凭借强大的并行处理性能,使得GPU开始用有了部分流式处理器特征,逐渐开始被用于工程方面的通用计算。
DirectX 8的其他特性:编写定制的硬件着色器,例如通用纹理组合公式,逐像素光照(凹凸贴图),适用于实现照片(真实)级镜面效果的逐像素环境贴图或者任何其他开发者定义的算法。 支持多重采样渲染 、高性能的粒子系统渲染、 3D空间纹理 、允许范围衰减、包含了用于输出Direct3D蒙皮网格的三维内容创建工具插件,使用了Direct3D多种不同技术,多分辨率层次细节(LOD)几何、索引顶点混合 、扩充了Direct3DX实用库。
2001年底,Microsoft推出了DirectX8.1,主要的改进是增加了PixelShader 1.2/1.3/1.4。在此之前,Microsoft差不多每年推出一个DirectX新版本,到DX8以后,这个速度开始减缓,以后的DirectX9也是如此。主要的原因是自 DirectX 7以后,每一个版本(major release)实际对应于一代新的显示核心,硬件的更新周期要长于软件,所以作为图形API的DirectX要照顾到软件更新的速度。另外,游戏开发的复杂程度也越来越高,开发周期也越来越长,而游戏开发人员并不希望在开发过程中更新API。
8.DirectX 9.0/9.0b/9.0c
2002年底,微软发布DirectX9.0。DirectX 9中Shader的渲染精度已达到浮点精度,为GPU向通用计算领域的发展迈出了决定性的一步。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。全新高级着色器语言的引入,使得程序员从底层代码中解放出来。
PS 2.0具备完全可编程的架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。
VS 2.0通过增加Vertex程序的灵活性,显著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。
DirectX9的出现使得OpenGL API在游戏开发领域的应用走到了尾声。目前,除了ID SOFTWARE自家的DOOM、QUAKE系列,基于OpenGL API开发的游戏已经屈指可数了。微软把OpenGL API的应用限制在专业工作站领域的目的已经达到。
DirectX9也有DirectX9.0b和DirectX9.0c两个版本,由于篇幅关系,此处不再详细介绍。
● 第三章 第二节 DX10的架构特性 以及带来的好处。
DirectX之所以在广大的开发者中流行,是得益于它的简单易用和丰富的功能特性。然而,DirectX一直被一个主要的问题所困扰,那就是高CPU负载。
在图形编程API出现之前,三维程序直接向图形硬件发送图形命令来完成绘制工作。虽然这样绘制效率相当高,但是程序中要应对各种不同硬件上的不同命令,这使得开发工作十分困难,且程序中很容易出错。当越来越多不同的图形硬件冒出来的时候,这就成了一件十分不能忍的事。
于是便出现了像DirectX和OpenGL这样的图形API。它们在图形硬件和应用程序之间架起了一个中间层,这样,应用程序可以使用统一的图形编程代码,而对底层各种硬件的适应,则由图形API来完成。这就将游戏程序员们从与大量的图形硬件交换意见的恶梦中解救出来,使他们能够将精力集中在“制作伟大的游戏作品”上面^_^
但是这样就完美了么?不是的。每次DirectX从应用程序那里接收到一条命令,它就需要先对这条命令进行分析和处理,再向图形硬件发送相对应的硬件命令。由于这个分析和处理的过程是在CPU上完成的,这就意味着每一条3D绘图命令都会带来CPU的负载。这种负载给3D图象带来两个负面影响:限制了画面中可以同时绘制的物体数量;限制了可以在一个场景中使用的独立的特效的数量。这就使得游戏画面中的细节数量受到了很大的限制。而使图像具有真实感的重要因素,偏偏是细节量。
DirectX 10的一个主要目标就是最大地降低CPU负载。它主要通过三个途径来达到这个目的:第一,修改API核心,使得绘制物体和切换材质特效时的消耗降低;第二,引入新的机制,降低图形运算操作对CPU的依赖性,使更多的运算在GPU中完成;第三,使大量的物体可以通过调用单条DirectX绘制命令进行批量绘制。下面我们就来仔细的看一下这三种方式:
1.降低绘制消耗
第一种方式的一个重要例子就是DirectX 10中对三维数据和绘制命令进行验证过程的修改。所谓三维数据和命令的验证,是指在DirectX绘制图形之前,对传给它的图形数据和绘制命令进行格式和数据完整性的检查,以保证它们被送到图形硬件时不会导致硬件出问题;这是很必要的一步操作,但是不幸的是它会带来很大的性能开销。
从上表我们可以很容易的看出,在DirectX 9中,每次绘制一帧画面之前,都会对即将使用的相关数据进行一次验证。而DirectX 10中,仅当这些数据被创建后验证一次。这很明显是可以大大提高游戏进行中的效率的。
2.降低CPU依赖性
在降低CPU依赖性方面,DirectX 10 引入的三个重要机制就是:纹理阵列(texture arrays)、绘制断言(predicated draw)和数据流输出(stream out)。不要被这三个晦涩的名词吓倒,实际上它们是三个不难理解的机制。
首先我们来看纹理阵列。传统的DirectX在多张纹理中进行切换的操作是一个很消耗CPU的操作,因为每切换一次,都要调用一次DirectX的API函数。而每绘制一个使用新纹理的物体,就要进行一次这样的切换操作;有时为了实现特殊的材质特效,绘制一个物体时可能就要切换好几次纹理,开销很大。
所以,以前游戏美工们经常索性将大量的小纹理拼合到一张大的纹理中,通过给不同的三维物体分配这张大纹理的不同局部以期减少纹理切换,提高游戏运行效率。然而,想想也知道,这件事做起来会非常麻烦,而且DirectX 9中对纹理的尺寸的限制是4048×4048像素,也就是说,如果要容下更多的小纹理块,可能就得开辟很多张这样的大纹理。
DirectX 10引入的新的纹理阵列机构,将允许在一个由显卡维护的阵列中容纳512张单独的纹理,而且,在shader程序中可以使用一条新的指令来获取这个阵列中的任意一张纹理。而这种shader指令是运行在GPU中的;这样,就把原来要消耗很多CPU时间的纹理切换工作轻松地转给了GPU。由于纹理一般是直接放在显存中的,所以这件事由同显存一起放在显卡上的GPU来完成真是天经地义,大快人心^_^。现在,在应用程序的层面,只要一开始设置好纹理阵列中的纹理,然后每次绘制一个物体时为它指定一个纹理的索引号,并同物体三维数据一起传递到shader中,就可以放心的让GPU来给物体选纹理了。
然后说说绘制断言。在一般的三维场景里,很多物体都是完全被别的物体挡在后面的。这时候如果要显卡绘制这些物体就是白费力气。尽管高级的GPU可以通过硬件算法将场景画面中被挡住的像素(注意是像素)预先剔除,但是仍然会有一些处理消耗。例如,一个完全被挡住的复杂的角色模型,它的身上可能有几千个顶点,需要做复杂的骨骼皮肤动画处理、顶点光照运算等等——然而,GPU是在处理完这些顶点之后,并要把这个角色模型一个像素一个像素地画到画面中时,才开始判断每个像素是否需要画——当所有的像素都被剔除了时,之前做的顶点处理也就全白费了-_- || 于是,游戏开发者们想出了一个方法来解决这个问题,这就是绘制断言。
简言之就是用一个可以代表某个复杂物体的简单物体来判断这个物体是否被全部挡住了——例如用一个可以罩住刚才那个角色的大盒子,当绘制这个盒子时,如果所有的像素都被P掉了,也就说明这个盒子肯定完全看不见,更甭说里边的角色了,也就不用做什么骨骼皮肤运算啦之类的操作了。一个盒子顶多有八个顶点,这学过初中几何的人都知道,相比处理几千个顶点,开销小得多。但是,以前这步中有些部分也是要在CPU中完成的。现在,在DirectX 10中,已经彻彻低低的交由GPU来做了^_^。真是很周到啊。
最后来看看数据流输出。这是一个DirectX 10中的非常重要的特性,它允许GPU上的Vertex shader或Geometry shader向显存中添加数据!您也许觉得这感觉没什么,然而在以往的vertex shader中是比较独特的。以前的DirectX中,vertex shader只能读取显存中已有的顶点数据;而DirectX 10中引入的新的Geometry shader,不但能读取显存中的顶点数据、几何(点、线段、三角形)数据,还可以生成新的几何数据放回显存。鉴于其重要性,这一机制我们将在第四节:几何Shader以及Stream Out中单独介绍。
3.批量绘制
在DirectX 9中,对渲染状态的管理一直是一个十分消耗CPU时间的操作。所谓渲染状态,是指显卡进行一次绘制操作时所需要设置的各种数据和参数。例如,要绘制一个人物角色,就需要先设置他的几何模型数据的数据格式、纹理过滤模式、半透明混合模式等等——每设置一项,都要调用一次DirectX API,占用大量CPU时间,极大的约束了渲染的性能。
为了使这些操作能够批量的进行,DirectX 10中引入了两个新的结构——状态对象(state object)和常量缓冲(constant buffers)。
状态对象就是将以前的零散状态按照功能归结为几个整体,这样,当要设置一系列相关状态时,无需为每一个状态来调用一次DirectX API,只需要调用一次将这些状态统统设置到显卡中去。
而常量缓冲是另一个十分有意义的机制。在绘制模型前的准备工作中,渲染状态的设置只是一小部分。还是拿绘制人物角色来说,能照亮这个人的光源的颜色、位置、类型、范围等等,都要提前设给显卡;为了通过骨骼来带动他的皮肤做出姿势,还要设置骨骼的位置信息等等——总之是很多东西;而这些东西主要都是通过GPU中的常量寄存器(constant registers)来传递给它的。每个常量寄存器可以存储一个4维的浮点型向量(即四个浮点数)。常量寄存器是游戏程序向GPU输入游戏场景中数据的重要途径。在DirectX 9中,这种常量寄存器的数量是十分有限的,这在下文中的对比图表中我们也可以看到;而且每次更新一个寄存器,都需要调用一次DirectX API函数。而DirectX 10中,使用了常量缓冲(constant buffer)这种结构;在每个constant buffer中都可以容纳4096个常量,而且只需调用一次API就可以更新一大批常量。
采用constant buffer绘制的大量克隆物体。
图片来源:Microsoft DirectX 10 SDK
举一个具体些的例子来对比一下:在以前,如果程序中想在场景里画很多的树木和杂草,可以采用一个类似于“克隆”的方法:先做好一棵或几棵树、草的三维模型,然后在画一帧画面时,不停的在不同的位置、方向,用不同的大小为参数,调用DirectX API的绘制函数来画这些模型,就可以画出很多草木来;但是每画一棵,都要设置一大堆参数后调用一次API;这是很耗CPU时间的,所以在以前的游戏中很难有大规模且细节丰富的森林场景。
而在DirectX 10中,我们可以先把树、草的几个模型设给显卡,然后将所有要画的树木的位置、方向和大小一次性的写入到constant buffer中,然后告诉DirectX——画!显卡就一下把所有的树木和草都一起绘制出来了^_^ 这样,像Far cry 2 那样的游戏,才能营造出十分逼真的森林效果。
总结
总之,DirectX 10降生到这个世上,就是为了带走由于CPU负载过大而给游戏图形效果带来的苦难。通过提前数据验证、纹理阵列、绘制断言、数据流输出、状态对象、常量缓冲等机制,帮助游戏的效果和效率上升到一个新的高度。
● 第三章/第三节:ATI 3Dc功能回顾
1.纹理压缩技术
纹理贴图是贴在3D对象上的位图,它可以在不增加3D场景中几何体复杂性的前提下得到逼真的表面细节。纹理贴图可以从木纹、大理石一直到复杂图形如人物、建筑、树木等等。为了模拟现实生活中的场景,必须利用大量细致的纹理贴图来实现。这些纹理贴图会占用大量系统或显存。纹理压缩就是将预备贴到3D模型上的贴图进行数据压缩,从而节省传输、存储它们所占用的显存的带宽、容量。
据个例子来说。对于一个最大尺寸是4096×4096像素的图片来说。如果按照32位色来存储,这个贴图文件的大小是:4096×4096×32=536,870,912bit,也就是67,108,864Byte,合算是67MB。这意味着什么?这意味着256MB的显存也只能放上不到4张贴图。所以纹理压缩显得非常必要了。纹理压缩的原理就是将这些贴图进行压缩后存储进显存,这样就能大大的减小对显存容量的依赖。
最开始的纹理压缩技术并不是微软在DirectX中提出的,这种技术的渊源要追溯到5年以前了。最开始采用纹理压缩技术是S3在OpenGL中首先提出的,最初的名称叫做S3TC。
到了1999年,微软吸纳了这种做法,在他们的DirectX中加入了纹理压缩技术,并且取名为DXTC(DirectX Texture Compression)。
纹理压缩的技术虽然看似简单,但是将压缩后的数据存储进显存并不是终结。重要的是需要用显示芯片把这些压缩后的数据进行解压缩,再经过运算贴图到3D模型上。这个过程就需要显示芯片在硬件上支持了,如果不支持,对于压缩后的数据无法识别,照样不能完成纹理压缩,也不能发挥出纹理压缩的优势。
纹理压缩应用的算法由于涉及硬件复杂度、解压效率、色彩空间变换等等技术问题,要比单纯的压缩图片复杂的多了。就拿我们刚刚提到的DXTC来讲,这其中就包含着5种不同的算法,DXT1一直到DXT5,这5种不同的算法是根据5种不同的情况来使用的。
当然然而,DXTC纹理压缩技术虽然能够带来性能上的提升,但是这种压缩技术却是一种有损压缩,这也就意味着在压缩→存储→解压的过程中势必会对细节有一定的损失,但是这个损失的幅度并不是很大,所以人们也就接受了这种折中的做法。DXTC技术得到了充分而广泛的应用,几乎所有游戏都采用了这种技术。
随着技术的发展,normal mapping技术成为了游戏中逐渐流行的贴图技术,它用很少的多边形就可以表现非常高的表面纹理细节。由于法线贴图RGB通道中存贮的是法线向量,在使用传统的压缩算法的时候就遇到了麻烦。
法线贴图中每个点的颜色反映的是该点法线的角度,也就是该点的凹凸的信息,如果这些信息丢失了,带来的结果就会糟糕的多——阴影失真是小,甚至可能造成贴图错误,因此,ATI研发了3Dc技术,以解决法线贴图的压缩问题。
2.3DC技术原理
首先,3Dc压缩算法是一种基于“块”的压缩方式。什么叫做基于“块”呢?就是指压缩的过程中将要压缩的内容进行分块,再对每一个单独的“块”进行压缩。
在3Dc技术中,ATI选择了将一个法线贴图分成若干个4×4像素(纹素)的块,每个块拥有16个像素。为什么这样分,这其中也是有一定的道理的。
因为作为一个法线贴图来讲,虽然每个点表示了相应位置的凹凸情况。但是,一个平面的凹凸通常不会太细,即使有小尺寸的凹凸情况,也不会比贴图上4个像素还要小。所以ATI选择了以4×4个像素为一个基本的单元,然后对这个单元内的信息进行压缩。
接下来的步骤就是要进行插值运算了。所谓插值运算,就是在这两个数之间插入一些经处理器生成的数值。具体到3Dc算法中,他们采用了在这最大值和最小值之间等分7份,然后将中间的6个值插进刚刚统计得来的最大值和最小值之间。
有了插值运算的基础,我们接下来就不难理解其中压缩的实现方法了。因为我们在记录数据的时候就能够摒弃原来的16个数了,转而使用两个数(最大值和最小值)就能表示了,两个数自然要比16个数占的空间要小,这也就是压缩的意义所在。
当然,这个过程中还有特别重要的一点就是将原数据和插值后的数据进行比较,从而让计算机知道那些不是最大值也不是最小值的点,究竟应该取这8个数值中的哪一个。
3Dc技术根据Z轴向量是一个仅仅表示方向的向量的特点,将向量的长度取“256,然后利用公式X2+Y2+Z2=2562,将Z在后期算出。
3.3DC技术的优点
● 压缩比比较大,体现了压缩的优势
我们看到,3Dc技术对于法线贴图的压缩比是恒定的4:1,这个比例相对于DXTC压缩技术中的6:1的压缩比要小一些,但是对于原数据来讲,能够将原来占用的空间缩减到1/4,压缩的意义也是非常大的。
● 压缩失真小
我们看到,在3Dc算法中其实是有一定的失真的,这一点也不必隐晦,因为如果在一个取样范围较大的空间实现压缩的话,失真是在所难免的,这16个点中每一个色彩通道的取值范围均有256个,3Dc算法仅仅使用了8个数来表示这些值,其中就有可能舍掉了248个数。
但是由于我们采用的8个数值在这个空间中是平均分布的,而且每个值都用了和原数据最为接近的一个值来表示,所以每个数值失真的幅度就被控制在了[0,16]的闭区间上。由于实际情况中在一个4×4的块中两个极值的差通常会比较接近,所以实际应用中3Dc的失真的影响也会比较小。
● 算法简单,效率高
这个算法的具体操作过程非常简单,这些步骤在通过CPU和显示芯片运算的过程中耗费的资源相对于其他的步骤来讲比较小,所以CPU和显示芯片就能够在更短的时间内完成更多的操作,从而提升了效率,反映在用户的直观感受上就是看到了3D效果但是显示的帧速率并没有太大的降低。
有鉴于3DC技术的出色表现,Microsoft在2004年发布的DirectX 9.0c加入了对ATi 3dc纹理压缩技术的支持,3DC成为得到业界公认的技术标准。3Dc 技术最初是伴随着X800系列显卡问世界,成为DirectX 9.0c标准的压缩技术后,对手NVIDIA也在GeForce 7800 GTX系列显卡上使用了3Dc压缩技术。
不止3DC技术,ATI也率先支持的tesselation功能(上一章介绍),ATI对新技术的追求也是孜孜不倦,为图形核心的发展做出了自己的贡献,也赢得了业内人士的尊敬。
● 第三章 第四节 Shader Model 4.0
当Shader Model 3.0的光彩尚未退去的时候,在DirectX 10中,又引入了Shader Model 4.0。它包含下面几项革新:
1 加入了一种新的Shader——Geometry shader
通过它可以编程操纵几何图元;为vertex、geometry、pixel shader采用了统一的Sahder架构。Geometry shaders是可编程图形流水线的一大进步。它第一次允许由GPU来动态的生成和销毁几何图元数据。通过和新的数据流输出功能配合使用,许多以前无法实时使用的算法现在都可以在GPU中使用了。在下一节,将仔细讨论Geometry shaders。
2 统一的Shader架构
在DirectX 9中,Pixel shader总是在各个方面落后于vertex shaders,包括常量寄存器个数、可用的指令个数、shader长度等。程序员需要区分对待这两种shader。
而在shader model 4中,这vertex、geometry和pixel shader有着统一的指令集、同样的临时/常量寄存器个数。它们将平等的共享GPU中的所有可用资源。在游戏程序中不用再考虑每种shader自身的限制了。
3 百倍于DirectX 9的可用资源
对于shader中可用的资源,在Shader model 4.0中比原来有了惊人的扩充。就像早期的程序员们绞尽脑汁的省着用可怜的640k内存一样,在使用以前的DirectX开发游戏的过程中,程序员需要小心翼翼的分配珍贵的shader寄存器资源。寄存器的数量,直接影响着shader程序的复杂度。这和在640k内存的机器上,怎么也不可能写出Microsoft Office这样的大规模软件是同一个道理。而在DirectX 10中,将临时寄存器由原来的32个扩充到了4096个,将常量寄存器由原来的256个扩充到了65536个!而这些并不仅仅是DirectX给出的理论值——在Geforce 8800架构中,它们都是实实在在的在显卡上面的!
4 更多的纹理
在Shader Model 4.0中提供了对纹理阵列(Texture arrays)的支持。在前文中已经对纹理阵列有了比较详细的介绍,在这里只着重介绍一下与shader相关的部分。在每个纹理阵列中,最多可以保存512张同样大小的纹理。而且每张贴图的分辨率被扩展到了8192×8192。更大的分辨率意味着纹理中更丰富的细节。在一个shader中能够同时访问的纹理个数被增加到了128个,也就是说在每次执行同一个shader时,可以使用一个纹理阵列的512个纹理中的128个。所以说,在DirectX 10中,纹理的多样性和细节程度将会有大幅的提升。
使用纹理阵列实现细致的纹理
5 更多的渲染目标(Render Target)
所谓渲染目标,就是指GPU可以把画面绘制到的目标,我们可以把它理解为GPU的画布。一般来说,渲染目标被输出到屏幕上,这样我们就能看到画好的画面了;但是有时为了实现一些特效,某些渲染结果并不直接画到屏幕上,而是再返给GPU做进一步的特效处理;而且渲染目标中也不一定是画好的画面的颜色信息。
根据特效的需要,它们可能是每个物体距离屏幕的远近,或者物体表面上每个像素的方向,或者每个物体表面的温度(为了实现《分裂细胞》中那种热能感应器的效果)…总之为了实现特效,可以按需要在其中绘制任何信息。为了提高这种情况下的效率,很多新的显卡都支持在同一遍Shader执行结束后,同时把不同的信息绘制到不同的渲染目标中。在DirectX 9中就已经支持这种机制了,但是它约束最多同时向四个渲染目标绘制。而DirectX 10将这个数量提升了一倍。
6 新的HDR颜色格式
要说这些年来在实时图形界炒得最热的概念,应该是HDR了。它通过采用浮点格式的颜色格式来为纹理、光照等计算提供极大的精度和颜色范围(以前的纹理一般都是采用整数型的颜色格式)。尽管最后显示到屏幕上还是每个颜色通道8位的整数格式,但是以前由于在材质、光照计算中纹理也是用每通道8位的格式来参与计算,所以在显示到画面之前,很多细节就在低精度的运算中丢失了。
而采用每颜色通道16位浮点数的纹理,能够保证在运算过程中几乎没有颜色细节信息的丢失。另外,采用16位浮点格式的颜色通道,可以表现更大的颜色范围。这些就是HDR的优越性。对于玩家来说,当游戏中的画面罩上一层HDR效果后,立刻显得和真正的照片一样,有朦胧的光晕、细致的高光和十分自然的色调。在玩《优品飞车9》时,充满风格的色调让人有一种置身于电影里的感觉。
HDR(高动态范围)渲染。图片来源:Futuremark
然而,采用每个颜色通道16位浮点数的格式,比采用每通道8位的整数格式的纹理要多占据一倍的显存;这给绘制的效率带来了负面的影响。所以在DirectX 10中引入了两个新的HDR格式。第一种是R11G11B10,表示红色和绿色通道用11位浮点数,而蓝色通道采用10位浮点数表示。那么,为什么不都用11位呢?这是为了凑32这个整数。学过计算机的人都知道,当内存中一个数据单元的宽度是32位时,对它的操作效率最高;而且在纹理数据中一般要求每个像素的数据宽度是2的倍数,如2,8,16,32,64等等。又因为人眼对蓝色的敏感度不如对红色和绿色,所以它比其他两个通道少用了一位。
另外一种格式是采用每通道9位尾数、所有通道共享5位指数的形式(众所周知,在计算机中,浮点数是采用尾数附加指数的形式来表示的),加起来还是32位。这些新的格式使得纹理能够与原来占用同样多的显存空间,避免了大的空间和带宽消耗。同时,为了适合需要精确的科学计算的场合,DirectX 10和Geforce 8800 GTX完全支持每通道32位(4个通道加起来128位)精度的浮点数纹理。
总结
上面提到的这些扩充和提高,对于图形程序员来说是一件非常爽的事。他们可以摆脱束缚,创建出包含前所未有的细节度的实时游戏场景;对于玩家来说也是一件非常爽的事,因为他们的眼球有得养了。
● 第三章 第五节 几何Shader以及 Stream Out
直到现在,图形硬件只有在GPU上操作已有数据的能力。顶点着色器(Vertex Shader)和像素着色器(Pixel Shader)都允许程序操作内存中已有的数据。这种开发模型非常成功,因为它在复杂网格蒙皮和对已有像素进行精确计算方面都表现的很出色。但是,这种开发模型不允许在图像处理器上生成新数据。当一些物体在游戏中被动态的创建时(比如新型武器的外形),就需要调用CPU了。可惜现在大多数游戏已经很吃CPU了,游戏进行时动态创建庞大数量新数据的机会就变得微乎其微了。
Shader Model 4.0中引入的几何着色器(Geometry Shader),第一次允许程序在图像处理器中创建新数据。这一革命性的事件使得GPU在系统中的角色由只可处理已有数据的处理器变成了可以以极快速度既可处理又可生成数据的处理器。在以前图形系统上无法实现的复杂算法现如今变成了现实。使用DirectX 10和Geforce 8800 GTX,类似模板阴影(Stencil Shadow)、动态立方体贴图(Dynamic Cube Map)、虚拟位移贴图(Displacement Mapping)等依靠CPU或多通道渲染(Multi-Pass Rendering)的算法效率提升了很多。
DirectX 10流水线加入了几何着色器和数据流输出(Stream Output),使GPU可以在不用CPU干涉的条件下进行反复运算。
几何着色器被放在顶点着色器和光栅化阶段(Rasterizer)中间。所谓光栅化,就是一行一行的扫描每个三角形,把它们一个像素一个像素的绘制到画面上。几何着色器把经过顶点着色器处理过的顶点当作输入,对于每个顶点,几何着色器可以生成1024个顶点作为输出。这种生成大量数据的能力叫做数据扩大(Data Amplification)。同样的,几何着色器也可以通过输出更少的顶点来删除顶点,因此,就叫做数据缩小(Data Minimization)。这两个新特性使GPU在改变数据流方面变得异常强大。
1 细分的虚拟位移贴图(Displacement Mapping with Tessellation)
几何着色器终于让虚拟位移贴图可以在GPU上生成了。虚拟位移贴图是在离线渲染系统中非常流行的一项技术,它可以用一个简单的模型和高度图(Height Map)渲染出非常复杂的模型。高度图是一张用来表示模型上各点高度的灰度图。渲染时,低多边形的模型会被细分成多边形更多的模型,再根据高度图上的信息,把多边形挤出,来表现细节更丰富的模型。
因为在DirectX 9中,GPU无法生成新的数据,低多边形的模型无法被细分,所以只有小部分功能的虚拟位移贴图可以实现出来。现在,使用DirectX 10和R600的强大力量,数以千计的顶点可以凭空创造出来,也就实现了实时渲染中真正的细分的虚拟位移贴图。
2 基于边缘(Adjacency)的新算法
几何着色器可以处理三种图元:顶点、线和三角形。同样的,它也可以输出这三种图元中的任何一种,虽然每个着色器只能输出一种。在处理线和三角形时,几何着色器有取得边缘信息的能力。使用线和三角形边缘上的顶点,可以实现很多强大的算法。比如,边缘信息可以用来计算卡通渲染和真实毛发渲染的模型轮廓。
使用几何着色器的非照片模拟渲染
(Non-Photorealistic Rendering - NPR)
3 数据流输出(Stream Output)
在DirectX 10之前,几何体必须在写入内存之前被光栅化并送入像素着色器(pixel shader)。DirectX 10引入了一个叫做数据流输出(Stream Output)的新特性,它允许数据从顶点着色器或几何着色器中直接被传入帧缓冲内存(Frame Buffer Memory)。这种输出可以被传回渲染流水线重新处理。当几何着色器与数据流输出结合使用时,GPU不仅可以处理新的图形算法,还可以提高一般运算和物理运算的效率。
在生成、删除数据和数据流输出这些技术的支持下,一个完整的粒子系统就可以独立地在GPU上运行了。粒子在几何着色器中生成,在数据扩大的过程中被扩大与派生。新的粒子被数据流输出到内存,再被传回到顶点着色器制作动画。过了一段时间,它们开始逐渐消失,最后在几何着色器中被销毁。
● 第三章 第六节 高级渲染语言(HLSL 10)
DirectX 10 为以前的DirectX 9中的“高级着色语言”(High Level Shading Language )带来了诸多功能强大的新元素。其中包括可以提升常量更新速度的“常量缓冲器”(Constant Buffers),提升渲染流程中操作数据的灵活性的“观念”(view),为更广泛的算法所准备的“整形与位指令”(Integer and Bitwise Instructions),添加了switch语句。
1 常量寄存器(Constant Buffers)
着色程序同普通的程序一样需要使用常量来定义各种参数,例如光源的位置和颜色,摄像机的位置和投影矩阵以及一些材质的参数(例如反光度)。在整个渲染的过程中,这些常量往往需要频繁的更新,而数以百计的常量的使用以及更新无疑会给CPU带来极大的负载。DirectX 10中新加入的常量缓冲器可以根据他们的使用频率将这些常量分配到指定的缓冲器中并协调的对其进行更新。
在一个着色程序中DirectX 10支持最多16个常量缓冲器,每一个缓冲器可以存放4096个常量。与其相比DirectX 9实在是少得可怜,因为它在每个着色程序中同时最多只能支持256个常量。
相比DirectX 9,DirectX 10不仅提供了更多的常量,最主要的是它大幅的提升了常量更新的速度。对那些被分配到同一个缓冲器中的常量,我们只需进行一次操作就可以将它们全部更新完毕,而非单个单个的去更新。
由于不同的常量更新的时间间隔各异,所以跟据使用的频率来对他们进行组织就可以获得更高的效率。举例来说:摄像机的视矩阵只在每一祯之间发生改变,而像贴图信息这样的材质参数却会在图元切换时发生改变。于是这些常量缓冲器被分成了两个部分——那些每祯更新的常量缓冲器专门存放那些需要在两祯间更新的常数并在两祯间一次把他们全部更新,另外的图元切换更新的常量缓冲器也同理。这样就会将更新常量过程中的一些不必要的工作消除,以便让整个着色器脚本比在DirectX 9中运行的更加顺畅。
2 Views
在DirectX 9中,着色器(shader)中的数据的类型是被严格划分开的。例如,顶点着色器用到的顶点缓冲器中的数据不能当作贴图的数据来让像素着色器使用。这样就将特定的资源类型同其相对应的渲染流程中的特定步骤紧密地结合了起来,同时限制了资源资源在整个渲染流程中可以使用的范围。
DirectX 10舍弃了“严格区分的数据类型”这一概念。当一段数据被创建,那么DirectX 10所做的仅仅是将其简单的当作内存中的一段比特域(bit field)来对待。如果要想使用这一段没有定义类型的比特域数据就必须通过使用一个“view”。 使用“view”,相同的一段数据就可以有各种各样的方法来读取。DirectX 10支持对同一段资源在同时使用两个“view”。
通过这种多重“view”的手段,就可以在整个渲染流程的不同部分以不同目的使用同一段数据。例如:我们可以通过像素着色器将一段几何数据渲染到一张纹理上,之后顶点着色器通过一个“view”将这张纹理视为一个顶点缓冲器并将其中的数据作为几何数据渲染。“view”通过在整个渲染流程中的不同步骤重复使用同一段数据为“数据处理”带来了更大的灵活性,帮助开发者实现更多更有创意更精彩的特效。
3 整形与位运算指令 (Integer and Bitwise Instructions)
在新的高级着色器语言中添加了“整形与位指令”。这样把“整形与位运算指令”的操作加入其基础运算函数的好处在于帮助一些算法在GPU上的实现。开发者终于可以直接使用整形而非从浮点中强转来计算出准确的答案。数组的索引号现在可以轻松的计算出来。GPU无整形运算的时代终于被终结了。这将为shader程序的开发带来很大的便利。
4 Switch 语句(Switch Statement)
终于,HLSL 10可以支持switch语句了!!!这将大幅简化那些有着大量判断(分支)的着色器脚本的编码。一种用法就是建立一个“航母级的着色器(shader)程序”——包含了大量的小型着色器程序并且自身体形巨大的着色器程序。在这个“航母级的着色器程序”,我们可以通过设定一个材质ID在switch语句中判断来轻松的在渲染同一个图元时切换不同的特效。也就是说,现在一个军队中的每个士兵身上都可以拥有各自不同的特效了。
● 第三章 第七节 其他改进
● 第三章 第七节 第一小节 alpha to coverage
在游戏中,经常使用带有半透明信息纹理的多边形模型来模拟复杂的物体,例如,草、树叶、铁丝网等。如果使用真正的模型,一颗边缘参差不齐的小草可能就要消耗掉几百个多边形;然而采用透明纹理,可以只用2~3个多边形就解决了。
半透明纹理示意——一片树叶
然而,当使用这种有半透明信息的纹理时候,它的不透明和透明部分的边界线上,常常会出现难看的锯齿。采用半透明混合技术可以解决这个问题,但是它需要把场景中所有这类物体按照由远到近的顺序来绘制,才能保证它们的遮挡关系是正确的——这是十分消耗CPU时间的,所以很不可取。在以前,alpha测试和混合简直就是图形程序员的噩梦。
在DirectX 10中,使用了一种新的技术叫做Alpha to coverage。使用这种技术,在透明和不透明交界处的纹理像素会被进行多极取样(Multi-sample),达到抗锯齿的效果。这就在不引入大的性能开销的情况下华丽的解决了这个问题^_^ 室外场景的游戏将大大受益于这种技术。树叶、铁丝网、草的边缘将会更加柔和、圆滑。
使用Alpha to coverage技术,叶片的边缘更加平滑。
● 第三章 第七节 第二小节 shadow map filtering
阴影图(Shadow map)技术已经逐渐成为了渲染真实感阴影的流行技术。在包括《战争机器》、《分裂细胞:双重特工》、《Ghost Recon》、《刺客信条》等的各大次世代游戏中都能看到它的身影。然而,由于shadow map的尺寸限制,用它实现的阴影边缘往往有明显的锯齿。在DirectX 10中,提供了对shadow map进行过滤的功能的正式支持。经过过滤后,阴影的边缘将会变得更加柔和。
● 第三章 第八节 游戏效果
DirectX 10为游戏开发者提供了很多新的特性,采用这些特性可以用来开发大量的次世代图形效果。然而,由于这是基于强大、灵活的可编程特性基础上的,所以很难简单的指出这些特性都带来了哪些效果。实际上,很多图形效果都是对这些特性进行综合运用的结果。在这一部分,让我们来仔细的看一下几种次世代特效技术,感受一下新的DirectX 10特性在其中起到的作用。
● 第三章 第八节 第一小节 次世代Instancing技术
在上文中,我们已经用这张图来说明DirectX 10的常量缓冲器特性。其实,这里采用的技术有一个学名叫做Instancing,大意就是通过一个或几个模型来复制出它们的很多实例,实现满山遍野的树木、敌兵那样的效果。这种技术在DirectX 9时代就已经出现了,但是有很多的限制,例如模型不能有动画,所有的模型实例必须使用同一张纹理贴图和同一种材质效果,等等。这就给这项技术带来很多遗憾的地方——玩家肯定不喜欢看见游戏里满山遍野的敌人或树木都长成一个模样,或者只有那么几种模样。
在DirectX 10中,通过常量缓冲器、纹理阵列、动态shader执行分支等特性,将Instancing技术从这些局限中解放了出来。模型的实例没必要使用同一张纹理贴图;它们可以通过自己本身的纹理来从纹理阵列中取出各自的纹理;它们甚至可以有不同的特效——程序员可以写一个包含很多特效的“超级”shader,然后为每个模型实例运用这个shader程序的不同执行分支部分,从而给不同的模型赋以不同的材质特效。甚至连为每个模型实例使用骨骼蒙皮动画这种需要大量变换矩阵操作的问题,在16×4096常量寄存器的强大攻势下都可以迎刃而解。
“克隆人”的时代已经结束了^_^ 通过DirectX 10的高级特性,Instancing将允许每个模型实例拥有它的个性:纹理贴图,pixel和vertex shader,以及动作动画。每个实例都将会有它自己的生命。
● 第三章 第八节 第二小节 基于象素级别的位移贴图技术
在介绍这项技术之前,首先请允许我对工作在坐落于北京海淀区知春路的微软亚洲研究院/工程院的工程师们致以崇高的敬意\\ ^ ^ /。因为这项技术的实现方法,是由这些中国的工程师们研究、创造出来的。
实时每像素位移贴图。图象来源:Microsoft DirectX SDK。
位移贴图技术,用过3DS MAX的读者可能不会感到陌生。在3DS MAX中,这种技术有时也被翻译成“置换贴图”,其核心思想就是在制作三维模型时采用比较低的细节,然后给这个模型赋上一张表面高度图;在渲染时,会根据这张高度图来修改模型的表面,使它们隆起或凹陷——这样,就可以十分省力的给模型表面加上真正的凹凸不平的效果。毕竟,在3DS MAX里一个点一个点的修改模型表面来添加凹凸细节,要比直接拿Photoshop绘制一张高度图麻烦的多。
位移贴图要比单纯的normal map技术的凹凸贴图逼真——因为它是真正的将模型的表面进行修改,抬高或降低它们。然而,由于它需要在渲染时将模型表面进行细分,即将原来的一个多边形分成大量的小多边形,这样才能有足够多的顶点来进行移动。这在原来的DirectX中是不能实现的,因为那时没有geometry shader,不能动态生成多边形图元,也就不能实现动态的多边形细分。即使在有了geometry shader以后,将多边形细分也是一个消耗性能很大的操作。
然而,微软亚洲工程院/研究院的工程师们另辟蹊径,创造了一种新的每像素位移贴图技术。它的大致过程是,将简单模型表面的三角形向上拉伸,成为一个三棱台,这样它就具有了一定的体积;而它的高度,就是模型表面根据高度图进行位移后能达到的最大高度。然后在填充三角形的每个像素时,通过将观察者的视线和这个三棱台进行求交,得到一个相对于这个三棱台的交线段。
由于高度图是相对于这个三棱台的,只有同样使用相对于这个三棱台的交线段,才能正确的求出线段和高度图所代表的表面高度的交点。然后再通过这个交点来计算应该把颜色纹理中的哪个点绘制到屏幕上。在这里只是简单介绍了一下这种技术的大体原理,实际的实现算法比这个要复杂,因为需要克服各种各样的问题。
每像素位移贴图原理示意。图片来源:Microsoft DirectX SDK
第四章\\第一节 集众家之长,R600架构总览
Command Processor(指令处理器)
Setup Engine(装配引擎)
Ultra-Threaded Dispatch Processor(超线程分配处理器)
Stream Processing Units(流处理器)
Texture Units(纹理单元及缓存)
Cache & Buffer(缓存及缓冲区)
Shader Export & Render Back-Ends(像素输出部分)
Memory Control(显存控制器)
第四章\\第三节 Command Processor(指令处理器)
Command Processor负责从PCI-E总线发出或者接受指令流,让GPU在驱动程序给定的时间间隔中完成恒定数据流操作,此过程需要通过Parallel DMA Engine,调用系统内存或者是本地显存的相关资源。
DMA引擎能够最大化PCI-E总线带宽利用率,确保GPU和CPU并行工作,消除显示系统的瓶颈。
R600改进的指令处理器能够降低30%以上的CPU占用率,尤其是在处理大批量小数据流时的效果尤为显著,由此可以将CPU编译驱动指令的负载降低到5%-10%,让CPU可以在复杂的3D游戏中发挥更大的作用。
第四章\\第四节 Setup Engine(装配引擎)
Setup,通常这个词用于程序安装,在这里我们可以理解为GPU负责指令分配和安装的模块,主要负责给流处理器将要执行的指令准备数据,我们将其称之为装配引擎。
ATI从R520到R580核心,将像素渲染单元翻了三倍之多,但纹理单元的数量和性能没有改进,因为ATI认为今后的游戏中纹理操作指令并没有增多,而且所占比重逐年下降。到了DX10时代,ATI为R600设计了恐怖的320个流处理器,那么纹理单元有何变化呢?
第四章\\第七节 Texture Units(纹理单元)
首先来看看R600的对手——G80在纹理单元部分有些类似于传统的管线式架构,只不过传统GPU是每个ALU绑定TMU,而G80是每组流处理器(16个)阵列绑定一组TMU&L1&L2,这种架构非常灵活,也很容易衍生出一系列产品。
与G80每组流处理器阵列绑定纹理单元&缓存不同,R600的纹理单元与流处理器部分是分开的,都受到Thread Processor的统一调度,这种架构沿用R520/R580的设计,但在结构部分改动特别大。
R600拥有4个纹理单元(R580也是4个,4×4结构),但在每个纹理单元内部包含了8个纹理寻址单元(黄色,共32个,R580的2倍),20个32位浮点纹理采样单元(橘黄色,共80个,R580的5倍),和4个纹理过滤单元(深红色,共16个,与R580相等)。
再来看看细节部分,可以看到8个黄色的纹理寻址单元和20个FP32纹理采样单元还要区分大小,这是因为顶点着色只能使用到其中4个小纹理寻址单元进行纹理采样,而像素/几何着色则可以使用全部的8个;顶点着色只能使用其中4个小FP32纹理采样单元,而像素/几何着色则可以使用全部的20个。
可能很多人都比较奇怪R600怎么会有这么多的FP32纹理采样单元,这是因为Shader Mode 4.0只能支持128Bit色彩精度(IEEE FP32)纹理采样,而且Textures和Samplers现在是各自独立的,程序会大量使用Sampler指令,因此独立、大规模的FP32纹理采样单元可以大幅提升纹理贴图效率和高分辨率纹理精度。
● 纹理单元特性:
FP16 HDR纹理全速双线性过滤(X1000系列的7倍)
FP32浮点纹理半速过滤
支持所有格式的三线性和各项异型过滤
驱动默认高品质各项异型过滤
软边阴影着色性能提高
支持分辨率高达8192×8192的纹理贴图
Fetch4纹理样本过滤器,采样速度提升四倍
第四章\\第八节 Shader Export & Render Back-Ends(像素输出部分)
ATI的Render Back End(后期渲染)其实就相当于NVIDIA的ROP(Raster Operation Processor光栅操作处理器),其主要作用就是像素输出,但是它还担负了Z(深度)操作、抗锯齿取样等繁重任务,在DX10中被称作“Output Merger”。
R600拥有4个后期输出模块
与G80相同,R600也提供了最大8个MRT(Multiple Render Target),直接支持8xMSAA。其最大的特点就是可编程AA模式,可以在2/4/8xMSAA的基础上衍生出N多种高效率的CFAA(最大24x),这部分内容将在后文章详细介绍。
R600可以在一个时钟周期内采样32个Z/模版,速度翻倍,而且深度/模版是分开处理的,执行效率更高。
深度/模版压缩率提高至16:1,到达了X1000的两倍,在8xMSAA模式下更是可以达到128:1的超高压缩率。
第四章\\第九节 独立的专属缓存
GPU所要处理的几乎所有数据和指令都是被存储在海量的显存之中,虽然显存速度逐年增长、512Bit总线将带宽翻了两倍、环形总线也有效的降低了延迟,但始终不可能与GPU同步运行,因此片内缓存依然是必备之物。其设计理念与CPU的L1/L2、数据/指令缓存完全相同。
从R600的架构图中可以看到,几乎每一个模块都配备了大量的缓存,这些缓存各自独立、各司其职,如图深黄色部分,接下来简要介绍各部分缓存的用途及相关技术:
超线程分配处理器配备了独立的着色常数缓存和指令缓存,使得代码长度几乎可以不受限制,而且可以在队列中存放更多条优先级较低的指令。
纹理缓存(Texture Cache)部分,R600的L1和L2分别是一个整体(而G80被分割为8块,因为有8个Shader阵列,加起来是384KB),四个纹理单元共享256KB的容量。RV630的L2减半,RV610则没有L2。
顶点缓存(Vertex Cache)容量达到R580的8倍!
颜色缓存(Color Cache)其中内容可以是颜色索引或者RGBA数据,很多时候拥有左右两个甚至上下左右四个缓存,用以实现立体图。
模板缓存(Stencil Cache)用以保持屏幕上某些位置图形不变,而其他部分重绘。例如大家熟悉的开飞机和赛车的游戏的驾驶舱视角,只有挡风外面的景物变化,舱内仪表等等并不变化。
除此之外,R600的Z缓存和模板缓存压缩比率提高到16:1(达到X1000的2倍),打开8xMSAA时压缩率高达128:1!R600中模板缓存和深度缓存依然是一个整体,但两者是单独压缩独立存取的。压缩信息可以存放在片内缓存或者是显存当中,这使得模板和深度压缩几乎可以被无限制的使用。
显存读写缓存(Memory Read/Write Cache),与CPU相同,GPU并不能直接访问庞大的外部显存,也是通过一块映射缓存充当内存的镜像后访问。
数据流输出缓冲(Stream Out Buffer),以往几何体必须在写入显存之前是被光栅化之后送入Pixel Shader。而Stream Out技术允许数据从VS或PS中直接传入Buffer或者显存,这种缓存可以被传回Shader重新处理,允许GPU重复利用已有的结果从而减少重复计算。DX10新纳入的几何着色器通过顶点信息批量处理几何图形,快速生成大量多变形,在此过程中会生成大量重复性数据,此时Stream Out Buffer就能起到事倍功半的作用,大幅提高新图形算法及物理运算的效率!
如此众多的片内缓存有效的提高了芯片个部分模块的运行效率,但同时也让R600的晶体管规模膨胀。
ATI片内缓存相关技术:
- 纹理、颜色、Z轴及模板缓存全面相联:
早期显存读写缓存采用的是直接映射方式,显存是分块被直接映射到缓存上的,这样如果有数据更新,整个缓存的数据就要清空,重新映射其他的区域,这样就会有大量的失效的情况发生。从X1000开始ATI将缓存和显存的映射已经变为完全自由的映射关系,自由度增大,数据刷新只需要更新局部的数据就可以了。
如此一来,就能大幅提高显存读写命中率,减少显存带宽消耗。纹理、颜色、Z轴及模板缓存都与显存读写缓存相互关联,这样可以降低有限的缓存占用量。
- 3Dc+纹理压缩技术
所有的缓存在存取时都要经过压缩和解压过程,而且压缩率也在不断改进中,比如ATI著名的3Dc纹理压缩技术就被微软纳入DX9c的范畴,成为GPU标准规范之一。
- 强化Z轴缓存压缩技术:
与Z轴缓存息息相关的就是隐面消除技术(HSR,Hidden Surface Removal)。当GPU在渲染和构架两个互相遮挡在一起的3D物体之时,一般是分别对这两个物体进行转换,然后计算它的光源和进行纹理贴图等等。GPU是在最后阶段才对2个相互遮挡的图形进行叠加。这样的运作流程会使得那些被遮挡、我们无法看到的图形部分也消耗运算资源。而HSR的作用则是先行运算出哪些面是可见的,然后直接剔除那些不可见的,从而降低GPU的无效渲染提升性能。
减少了无效渲染就意味着性能提升。ATI的HyperZ技术(Hierarchical Z,多级Z缓冲模块)就是为此而生,在GPU完成坐标转换之后Hierarchical Z会不断对比各个顶点的Z轴位置,一旦Hierarchical Z发现这个顶点不需要显示,将会直接将其剔除避免后续无效渲染。
ATI在R520核心中首次使用Hierarchical Z模块,R580将Hierarchical Z的缓冲区容量增加了50%,进一步提升高分辨率下的效能。而R600进一步改进了Hierarchical Z缓冲区,新加入Hierarchical模版,用以提升多重阴影的着色性能。
改进的Hierarchical Z技术大幅减轻了Z Cache的压力,同时有效的节约显存带宽。
自从ATI在R300(9700)上面首次使用256Bit显存位宽之后,高端显卡的显存控制器已经连续五年停滞不前,显存带宽的提升只能依赖于DRAM厂商生产出速度更快的显存颗粒,从GDDR1一直发展到GDDR2/3/4,高频显存对显卡的PCB和散热设计提出了很高要求,显存在显卡成本中所占比例也越来越高,显卡性能一定程度上受到了显存带宽的制约。新一代DX10游戏对显存带宽需求变本加厉,所以NVIDIA和ATI不约而同的升级了显存控制器,G80支持384Bit,而R600则是翻了一倍达到512Bit!
第四章\\第十节 Memory Control(显存控制器)
G80的显存控制器很容易理解,与G71相比就是添加了两组64Bit控制器,每组显存控制器都与ROP绑定,从而组成了384Bit的位宽,依然是(Crossbar)交叉式结构。之所以不用512Bit,一方面是出于显存成本方面的考虑,当然还有一个原因就是交叉存取的结构在规模较大时管理非常复杂,PCB布线难度大增,信号延迟容易增大。
G80的ROP和显存控制器
这就是ATI引入环形总线的原因,从R520开始我们就接触到了Ring Bus这个词,R520内部显存总线其实是512Bit(即两个256Bit环形管道),4个环站和8组32Bit显存组成:
R520的显存控制器
为什么要这么设计呢?主要是在提高带宽的同时减缓显存控制器的压力。当程序指令提出显存读取要求时,显存控制器会安排数据从显存颗粒中读取,但数据不会回传至显存控制器,而是只把数据放在环形总线之中,然后程序自行通过环站取回所需数据包,从而减轻控制器的压力。这种方式对于单个的存取操作有可能会使延迟变大,但总体来说能够降低大多数操作的延迟,而且提高数据命中率!
环形总线围绕在控制器的外围,这样可以简化线路设计使连接处于最优化状态。这意味着任何时候内核各部件都能处于最短的连接线路状态,这样在显存进行数据写入操作过程中有效降低延迟及降低信号品质。当然环形总线的另一大优势就势可以轻松达到高频率,传统显存控制器则由于显存控制器内部线路之间的串扰等原因很难保证GDDR4这种高频显存的效能!
ATI显存控制器的演化
但是,X1000系列的显存控制器并非是真正的环形总线,它只是通过引入两条环形管道来分担中央控制器的压力,这可以说是ATI做出的一个大胆尝试,X1000系列属于半分布式的混合型控制器。而在R600上面,ATI真正实现了全分布式的环形总线:
R600的显存控制器拥有2条512Bit环形通道和四个环站,每个环站控制两个64Bit显存通道,可以看到R600不存在中央控制器,所有显存读写操作都由四个环站经过仲裁器判定后执行:
可以这么认为,如果是传统交叉式显存控制器的话,必须统一指挥8个64Bit通道,而R600的4个环站只需各自管辖2个64Bit通道就可以了,然后四个环站通过1024Bit(读写各512Bit)内部总线连接起来,所有操作都通过仲裁器优化和排序后执行,比起混乱的交叉操作更加有序和高效!
如此一来,R600的环形总线可以达到更低的延迟、更高的频率、更大的带宽。同时也可以一定程度上降低PCB布线难度,将16颗显存之间的干扰降至最低,稳定性更容易保证,对于GDDR4提供了完美支持。在现有的技术条件下,R600可以轻松实现1GB 512Bit和512MB 512Bit两种实用的组合方案,今天发布的HD 2900XT就是512MB 512Bit(16颗8M×32Bit颗粒)的规格,未来还会有1GB 512Bit GDDR3/4的XTX版本。
另外,ATI的双向环路总线是可编程设计的,显存仲裁操作可以交由驱动程序控制,或者是用户通过驱动程序的“CATALYST A.I(智能参数设定)”功能为特定的应用程序设定仲裁优先次序,以便GPU可以优先处理最迫切、对性能影响最明显的数据读写请求。
第五章 R600的神工鬼斧——Tessellation技术
作为ATI和AMD合并后最重要的一款显示芯片,R600身上的意义可以说是非常的重大,前面我们已经介绍了第二代统一渲染架构,还有DirectX10的一些技术特性。
这一章我们主要介绍一下这次R600所独有的一种技术,Tessellation技术。这个技术是超越了DirectX10标准的一种技术,能够为未来的图像处理带来超乎想象的发展空间。
第五章\\第一节 Tessellation技术简介
截至笔者从AMD的技术培训会上了解到这项技术的时候,Tessellation技术一直还没有一个准确的中文译名,如果直译过来,Tessellation这个词本身的意思是“镶嵌”的意思。而根据笔者的理解,将其翻译成为“拆嵌”可能更为妥当。
Tessellation技术如果用一句话来说明的话就是:“一种能够在图形芯片内部自动创造顶点,使模型细化,从而获得更好画面效果的技术。”
Tessellation技术是一种超越了DX10标准的技术,这种技术并不是DX10标准中规定图形芯片必须具备的一种技术,可以说是一种提前设计并且实现的技术。
Tessellation技术的精妙之处是在于R600图形芯片能够根据3D模型中已经有的顶点,根据不同的需求,按照不同的规则,进行插值,将一个多边形拆分成为多个多边形。而这个过程都是可以由编程来控制的,这样就很好的解决了效率和效果的矛盾。
看到这里,可能一些资深的玩家会感到似曾相识,不错,Tessellation技术就是由Radeon 8500时代的TRUFORM技术发展而来的。
第五章\\第二节 传统的虚拟3D技术回顾
在了解Tessellation技术之前,我们是有必要了解一下一些技术背景的,这一节,我们会介绍一些在Tessellation技术之前的图形图像学的技术。
前面我们已经详细介绍了一个3D程序是如何被创作出来的,是如何被一个图形芯片运算并且显示出来的。但是,在图形图像学发展的过程中,最大的矛盾还是性能和效果的矛盾,也就是说如果3D程序设计师需要创作出非常逼真的画面的时候,就必须使用更加复杂的3D模型,而这就需要图形芯片具备更高的性能,这当然也是显卡和显示芯片行业发展的最大的动力所在。
但是随着时间的推移,随着显示芯片技术的发展,我们却看到了另外一些情况,这就是3D图形设计师在开发程序的时候,不得不考虑他们的软件的通用性是不是够高,因为如果设计的游戏只有R600或者G80能够运行的东的话,可能他们的软件或者游戏根本就卖不出去了。还有一个因素是设计更加复杂的3D模型无疑会给游戏开发带来更大的成本问题。
在这样的背景下,图形芯片厂商以及微软,早就开始算计这件事情了,他们想出了各种各样的方法来让3D模型保持简练的同时来获得更加逼真的效果。
第五章\\第二节\\第一小节 通过纹理贴图获得“质感”
在3D图形诞生的第一天可能就有的技术就是通过最普通的贴图做这件事情。我们知道,绝大多数表面都是有凹凸的质感的,图形学最初的解决方法其实就是利用纹理贴图的处理来让模型看起来更真实。
例如一个砖墙的墙面的纹理贴图,游戏开发者会在做贴图处理的时候就通过将处于阴影位置的变暗,将迎光面做亮等手段来表现一个表面凹凸的情况。
当然,这种做法是最原始的,也是效果最差的,因为游戏开发商做的都是具备交互功能的3D游戏程序,而不是静态的画面,所以一旦玩家面向贴图面的视角改变,就丝毫体会不出立体的效果来了。所以这种技术甚至可以不算是虚拟3D技术的范畴。
第五章\\第二节\\第二小节 凹凸贴图 Bump mapping
真正开创虚拟3D技术先河的其实是凹凸贴图技术。这种技术一直到现在仍然在广泛的应用,这种技术能够获得非常好的效果,但是对资源的消耗并不是很大。
凹凸贴图技术简单说起来是一种在3D场景中模拟粗糙表面的技术,将带有深度变化的凹凸材质贴图赋予3D物体,经过光线渲染处理后,这个物体的表面就会呈现出凹凸不平的感觉,而无需改变物体的几何结构或增加额外的点面。例如,把一张碎石的贴图赋予一个平面,经过处理后这个平面就会变成一片铺满碎石、高低不平的荒原。当然,使用凹凸贴图产生的凹凸效果其光影的方向角度是不会改变的,而且不可能产生物理上的起伏效果。(来源 百度百科)
光照因角度不同而呈现不同的明暗
凹凸贴图技术严格来讲,是一类技术的通称。这种技术有很多的算法和衍生产物,应用这一技术的3D游戏和程序非常常见。
我们来看一下凹凸贴图的原理:
让我们来先解释一下有关错觉的问题。先看下面左边这幅图,不用怀疑,绝大多数人(为什么这样说,后面会提到)都会马上分辨出这幅图凹凸效果。而这仅仅是用了几根白色和黑色的线条勾勒出来的。好,千万不要理所当然的认为这是这幅图的固有特性。
同一幅图,不同的放置方法能带来不同的视觉感受
我们所生活的环境,光源通常都来自上方(当然,除了象我们这些整天都坐在电脑前的人来说,光源来自正前方)。所以,我们在看左图的时候,眼睛将亮边缘和暗边缘的信息传达到大脑,在没有任何光源提示的情况下,大脑会假定光源来自我们的上方,然后经过快速的经验判断,告诉你它的凹凸性。
好了!有了以上的认识,相信你对凹凸贴图已经有了一些了解。 我们知道,与光线方向垂直的面,颜色将最亮,而与光线方向平行的面,颜色将最暗。
上面介绍的这个算法是典型的凹凸贴图的算法,凹凸贴图的算法还有很多中,这些算法并不是规定死的,任何一个图形学程序员都可以对算法进行改进和调整。
凹凸贴图的优缺点:
凹凸贴图的好处就是算法简单,运算量小,确定凹凸贴图只要根据每个点周围的点的颜色就可以确定。
凹凸贴图在今天看来已经是老的不能再老的一种技术了,虽然能够获得凹凸的效果,但是凹凸的程度非常受限制,基本上只能做出一些简单的浮雕效果来。这种技术通常用在一些观察视角很小的情况上,例如地面,墙壁,远处的一些模型等等。
第五章\\第二节\\第三小节 法线贴图(normal mapping)
法线贴图也是一种很常见的虚拟3D技术。不过有的时候一些媒体和一些词典翻译的并不准确,因为Normal这个词在英文中有“标准的,普通的”意思,所以就连金山词霸也将这个专有词汇翻译成什么“正规映射”的意思。
其实,Normal是指“法线”的意思,法线就是垂直于一个平面的一个向量,如果您连法线,向量这些基础概念也没法理解的话,那就请原谅我在这里实在没有篇幅为您解释了,您还是继续去把大学读完吧。
法线贴图技术是个非常有意思的技术,笔者在三年前介绍前ATI的3Dc技术的时候就曾经为大家详细介绍过。链接请见:http://www.pcpop.com/doc/0/39/39366.shtml
简单来说,法线贴图就是把一个表面的凹凸情况用每个点的法线向量记录下来,在贴图的时候根据法线贴图做光影的变换,从而实现凹凸效果。
法线贴图如果我们在电脑上看的话,颜色通常会看起来怪怪的,这是因为法线贴图的RGB值取的其实不是颜色,而是每个点的法线向量的三个分量。
Doom3中的一张纹理贴图和这张贴图对应的法线贴图
法线贴图的好处有很多,不仅仅能表现出哪里凹,哪里凸,还能表现出很多不同斜率的曲面的情况。所以法线贴图技术能够带来更好的效果。
这里需要提一下的是在R520的时代,ATI当时提出了一个叫做3Dc的技术,这个技术就是对法线贴图技术的一种补充,是对法线贴图进行压缩的一种技术。3Dc技术的压缩率为4:1,而解压后的效果明显好于微软DX标准中的DXTC技术。
法线贴图的优缺点:
法线贴图比起凹凸贴图而言,能够实现的效果更加好了,相对的就是运算量更大了,每个象素的光照情况都需要计算这个点的法线向量和光照情况的夹角计算该点的亮度和颜色。
当然,法线贴图技术同样不是完美的,它也有着自己的不足,凹凸贴图没有能够解决的切向效果问题肯定是仍然不能够得到解决。
此外,就是法线贴图技术不能够解决解决更大的凹凸情况的效果。大家如果去观察的话,法线贴图效果能实现的通常是一些内凹或者外凸不是很严重的表面效果。
第四小节 视差贴图技术parallax occlusion mapping
上一节我们介绍到的法线贴图在解决比较深的内凹的情况的时候不能够达到的效果被ATI打破了,这个技术就是视差贴图。
视差贴图技术(parallax occlusion mapping)是一种比法线贴图技术更加先进的技术,它能够获得更好的“高度”的视觉效果。视差贴图技术我们曾经在X1900发布的时候就已经看过了,最著名的就是《Toyshop》的demo,它是当时ATI随着X1900发布所曾经做过演示的一种技术。
视差贴图技术我们其实应该称之为视差遮蔽贴图技术,因为在这一技术中,会对纹理的坐标做变换,一些凸出的纹理会遮蔽到其他的纹理,这样就会看起来具备更好的凹凸的感觉了。
正如我们在上图看到的情况一样,地面上的石块的凹凸感觉非常好,前面的石块已经对后面的石块进行了局部的遮蔽。
不过视差贴图技术的实现原理,其实和法线贴图是一样的,都是根据法线贴图进行的处理,所以我们可以把它当作是法线贴图的一种衍生技术。
视差贴图技术的实现是和硬件没有必然联系的,这个技术的概念的诞生其实也非常早,只不过在实际程序中应用的并不是很早,这是因为视差贴图技术的运算量要比法线贴图大了不少,原来的显示芯片基本上都运行不了,只有到了X1900时代,GPU的能力才足以满足它的需求。
视差贴图技术的优缺点。
对于不牵涉模型改变的虚拟3D技术而言,视差贴图技术其实已经走到了接近于极限的边缘。因为它实现的效果已经足可以乱真了。目前视差贴图技术在整个图形图像界已经有了比较广泛的应用。
对于视差贴图的效果,我用的是“乱真”这个词,也就是说它还是不能够获得最好的效果。为什么 呢?这就是视差贴图技术的根源所决定的了,也就是所有的虚拟3D技术最大的遗憾——侧面看永远是平的。
因为没有模型的改变,当玩家的视角和平面的夹角接近于平行的时候,无论是法线贴图,还是视差贴图,都必须弱化他们的处理效果,当达到平行的时候,凹凸的感觉就会荡然无存。
第五小节 位移贴图(displacement mapping)
图形图像学的专家们和图形芯片的厂商其实早就看到了 前面几种技术的局限性,早就在考虑用什么方法能够获得真正的更加细腻的效果了。
当然最传统的想法就是增加模型的细节了,电影走的就是这个道路。随着电影中用到3D虚拟形象的增加,电影中的模型的细节程度也在不断的增加。从早期的《玩具总动员》到最新的《蜘蛛侠3》《金刚》等等影片,我们可以看到他们的区别。
但是这种“解决方案”就是没有解决问题,因为电影公司可以用成百上千台工作站做长达数个月的渲染。而我们需要的是能够互动的实时运算。
我们知道,如果3D模型需要做的更细腻,就需要用更多的多边形,也就是需要有更多的顶点来描述一个模型。更多的顶点带来的问题就是运算量的增加,和数据传输的瓶颈效应。
我们知道,早期的图形芯片只能处理象素信息,后来才能够处理顶点的几何位置变换。但是顶点的信息全都需要从CPU传输到显卡上,几年前,还是AGP时代的时候,过于复杂的模型的顶点势必会和纹理数据抢带宽。因为我们所运行的不是静态画面,而是动态的3D程序,里面的每个顶点都会发生位移,每个时刻都有海量的顶点位置信息需要产生,需要去传回CPU做游戏逻辑和物理模型的处理。
鉴于这种情况,显示芯片厂商早就想出了一种非常巧妙的解决方法,这就是位移贴图(Displacement Mapping)。位移贴图的核心就是在显示芯片内部创建新的顶点,使之具备更高的细节。而这些顶点的创建完全是显卡完成的,它们的位置也是已有的模型的顶点决定的。
位移贴图(Displacement Mapping)的原理是这样的:
首先游戏开发者会提前准备一个高度图(height map),这个高度图的意义有点类似于法线图,但是它表示的是一个平面上各个凹凸的点距离基础平面的高度情况。高度图通常是一张黑白的图,用灰度来表示高度的值。
当这个模型被读到显卡里面以后,首先需要进行的是对网格进行细分,细分的结果就是创建了很多新的顶点,显示芯片然后根据高度图将这些顶点的位置重新定位,顶点的位置坐标正是由高度图所决定的。
这样的好处是,这些诞生的顶点是真实存在的,但是并不会牵涉到大量的数据传输的需求,每个时刻这些顶点都是重新诞生的。而从效果而言,这样达到的效果和使用更复杂的效果是完全一致的,所以位移贴图达到的效果是前面的技术望尘莫及的。
位移贴图的优缺点
位移贴图的有点就是效果是最好的,它产生的顶点都是真实存在的,而且比单纯的增加模型的复杂程度的方法来的要好,要节约一定的运算资源。
但是毕竟位移贴图需要大量的顶点运算工作需要做,所以效率并不是很高,这一概念截至目前只有一些演示程序能够使用这一技术,游戏开发商还是不愿意将鸡蛋放到这个篮子里。
位移贴图需要和大家说明的是,虽然顶点的创建和显示全是在显示芯片中完成的,但是处理器在这个过程中仍然要做不小的运算。这在微软的DX10提出之前都是必须要做的。
第六小节 ATI的独门秘籍 Trumform
本节将介绍一个非常有创意的技术,这个技术可以说是R600的Tessellation技术的前身,在将这个技术之前笔者先给大家讲个小故事:
话说2001年七月的时候,微软即将推出DirextX最新的8.1版本,所以就在Meltdown2001会议上把ATI,NVIDIA等公司叫来开会,一起商定DX8.1的一些技术细节。当时这次会议可以说是图形图像界的“华山论剑”,当时不光有主办的厂商参加,媒体甚至也可以买票入场,票价是650美元,当时TheInquirer网站就参加了这次会议。据他们报道,当时NVIDIA和微软的关系搞得有点僵,据他们称是由于NV当时拒签当时正在开发的DX9的协议。
所以这次会议上ATI无疑成为了微软非常好的的合作伙伴。
讲这段八卦的历史并不是讨论谁和微软更近,而是因为这次会议上其实就决定了DX8.1的标准。微软这次在DX8.1的规范中提出了一个技术叫做“N-Patch”技术,这个技术相比前面我们提到的各种虚拟3D技术和位移贴图技术而言是一种非常精妙的技术。它能够像位移贴图那样创造顶点,但是却不需要高度图来做参数,使模型自动的变得光滑。
N-Patch技术的原理是这样的:显示芯片在读取了一个模型之后,判断每个三角形三个顶点的法线向量,再根据这三个向量算出插入的顶点的位置。
NPatch技术非常适合于将一个模型变得“圆滑”。因此非常适合于一些有很多曲面的模型。因为对于曲面的表现,通常的表现方法只是尽量多的使用内割多边形或者外切多边形来模拟曲面的效果。
N-Patch技术的巧妙的地方在于算法简单,只要进行多次递归运算,就能将一个面做成一个高次曲面,N-Patch这个词的本意也就是一个N次曲面。
在ATI的Radeon 8500显示芯片中,就率先采用了这个技术,在ATI自己的官方介绍中称之为“TruForm技术”
TruForm技术的优缺点
这个技术的好处是效率会比位移贴图要高,而且实现的效果也算是不错。不过呢,这个技术比较适合于海豚,赛车,表面为曲面的模型上,而如果这个技术应用在坦克等不需要做曲面化的模型上的时候,效果就会变得相当的滑稽。
第三节 Tessellation技术
N-Patch技术的创意虽然不错,但是只能简单的生成一种曲面,这是非常不够的,所以在R600的Tessellation技术中就对这些问题进行了满足。
Tessellation技术的原理和前面所说的TruForm技术是类似的,但是功能和效果却有着不小的不同。
首先,是Tessellation技术在对一个网格进行细分的过程中具备更加智能的分法。我们前面在介绍位移贴图的时候也介绍过网格细分,不过在位移贴图技术中的网格细分是采用的等分的方法,其实在位移贴图中采用的网格细分的过程也是tessellation这个词的动词形式tessellate,但是我在前面均避免了采用这个词,是担心大家混淆概念。我们现在介绍的第一个字母大写的Tessellation技术是一个专有名词,是一套技术的合称。
言归正传,在Tessellation技术中,采用的网格细分的方法是智能的,有的地方做细分网格,有的地方根本就不用做细分的就不作。
第一小节 Tessellation技术的网格细分算法:
在Tesselation技术中,采用了三种不同的网格细分法则。
第一种:离散算法
这种方法在创建顶点的位置的时候使用的是等分的方法,创建的点之间的距离都是一样的。这种网格细分的算法的参数是整数,每个边上插入的顶点的数目就是参数。
连续算法的特点是能够使用浮点数作为参数,如果参数的小数部分为零,这种算法和前面说的离散算法是一样的,如果小数部分有值,会将以中心部分的边继续细分。
第三种:自适应算法
自适应算法的功能就更加强劲了,它在细分网格的时候,能够对不同的边采用不同的级别进行细分。这样的好处就是节省了资源。
自适应算法的的参数也是浮点数,不过对于每条边可以有不同的参数,在这个算法中,参数范围是1.0到15.0。
神奇的小数点——细分网格算法中小数位的意义
在前面介绍的三种算法中,后两种算法采用的参数都是浮点数,为什么要这样呢?难道只是简单的区别是否在中心部分继续细分么?小数部分的数值究竟起什么作用呢?
在R600的Tessellation技术中,参数的小数部分表示的是第二次网格细分的位置。如果参数是1.1,那么第一次细分就是在两个顶点中心,第二次细分就是在距离中心全长的1/40处,如果是1.5,第二次细分就是在距离中点全长的5/40处。如果参数达到了2.0,就正好是做了两次等分。
早期的图形芯片都采用了SuperSampling(超级采样)的算法,代表产品为GeForce 256/GeForce 2/Radeon 7000/7500,其实更老的VOODOO显卡也能够支持这种算法。
超级采样就是将一个像素拆分为几个像素(也就是进行多次采样,Subpixel),然后进行独立的处理并写入缓存。超级采样利用更多的取样点来增加图形像素的密度来改善平滑度,如此一来图形芯片所处理的图像分辨率比实际输出图像分辨率大的多!因此SSAA的画质改善是有目共睹的,但以当时芯片的实力来看最终性能却是惨不忍睹!
超级采样虽然非常原始,但这种模式至今仍然被保留了下来,因为后期出现的很多抗锯齿算法在面对特殊物体时无能为力,因此不得不请出低效率的超级采样来帮忙(比如NVIDIA的透明抗锯齿超级采样)。我们可以把超级采样看作是“无损压缩”的算法,画质最高但性能损失最大,因此使用的情况并不多。
MSAA虽然得到了大量使用,但有一个重要缺陷就是不能处理Alpha材质,因此在一些栅栏、树叶、铁丝网等细长的物体上就不能起作用了。为了解决这种问题,NVIDIA在GeForce 7系列加入了透明(Transparency)抗锯齿,ATI在X1000系列加入了自适应(Adaptive)抗锯齿,通过额外的多重采样甚至是超级采样来强制提升画质。
普通的抗锯齿(左图)与透明自适应抗锯齿(右图)
自适应抗锯齿可以专门针对Alpha材质选择性的进行多级或是超级采样,这样就比完全采用SSAA拥有更低的性能损失,画面质量依旧完美!
NVIDIA GeForce 8系列显卡抗锯齿模式 | ||||||
抗锯齿模式 | 2x | 4x | 8x | 8xQ | 16x | 16xQ |
色彩/深度值采样数 | 2 | 4 | 4 | 8 | 4 | 8 |
覆盖采样数 | 2 | 4 | 8 | 8 | 16 | 16 |
第七章 ATI显卡产品形象代言人——Ruby四度出击
无论ATI还是NVIDIA,每次有新显卡发布都会同时公布一个或者多个用显卡实时渲染而成的DEMO。这些美轮美奂DEMO的设计初衷就是通过完美的3D效果征服每一位观众,让大家对新显卡的性能和技术充满憧憬和期待。所以ATI和NVIDIA必定会使出浑身解数,在DEMO中大量采用显卡最新、特有、特长技术。
第七章\\第一节 DEMO升华到产品形象代言人
● NVIDIA的美女策略,四代产品形象代言人
NVIDIA四代产品的形象代言人
NVIDIA的每一代产品都更换形象代言人:GeForce FX系列是蝴蝶仙子、GeForce 6系列是美人鱼Nalu、GeForce 7系列是纯情小美女Luna,到了GeForce 8系列则是真人美女模特Adrianne Curry,总的来说美女策略是坚持不变的!
● ATI四代Radeon统一使用Ruby,技术见证虚拟人物的进化
ATI则是从X800开始启用数字虚拟美女Ruby作为Radeon显卡的产品形象代言人,ATI通过多个故事型的DEMO将Ruby的形象生动活泼的展现了出来,此后ATI在X800、X850、X1800、X1900、X1950等连续几代产品都坚持使用Ruby作为形象代言人,各种ATI相关的活动也大量使用真人Ruby Cosplay,这使得Ruby的形象更加深入人心!
ATI Ruby人气很高!
● Radeon HD 2000系列提出Perfect 10的概念:
从虚拟形象的角度来看,Ruby的确是大获成功,因此即便是ATI被AMD收购之后,ATI图形部门及其Ruby代言人不但没有被取消,反而被AMD发扬光大。在最新发布的Radeon HD 2000系列产品上,AMD-ATI再次启用Ruby作为形象代言人,在Radeon HD 2900XT DX10 DEMO中,Ruby第四次出击!
在介绍R600全新Ruby之前,我们首先对ATI的前三款Ruby DEMO做一个简单的回顾,从历代Ruby的进化就可以了解到显示技术的发展和显示芯片的强大实力。
第七章\\第二节 X800 Ruby:The DoubleCross
Ruby首次出现在The DoubleCross这个Demo当中,ATI使用了大约8万个多边形构建而成。为了充分展示Radeon X800显卡的能力,ATI找来图形工作室RhinoFX作为合作伙伴。RhinoFX制作出了一个简短而逼真、大片般的打斗场景,在这个仅有1分40秒的过程当中,Ruby不但要蒙骗她的敌人Optico,而且不得不打败Optico的Ninja,最终顺利脱逃。
ATI的DEMO制作小组则把动画序列转换为即时的图像DEMO。整个演示动画应用了电影级别的特效技术,例如景深效果、动作捕捉,更大量采了Radeon X800支持的特效,如像素纹理渲染、柔和的动态阴影、3Dc纹理压缩技术等等,几乎每个物体表面都使用了一个或者更多的渲染层次,从而给人真实感,从皮革到皮肤,甚至是刚刚打过蜡的地板都不例外,尤其Ruby的嘴唇渲染得柔和润泽,极为经典。
名称:Ruby: The DoubleCross
下载:http://www2.ati.com/misc/demos/ATI-Demo-DoubleCross-v1.4.exe
大小:EXE格式,131MB
第七章\\第三节 X850 Ruby:Dangerous Curves
X850与X800其实并没有实质性的差别,不过ATI还是为其准备了一个全新的Demo来展示性能上的提高,这个Demo中人气正旺的Ruby再次登场!
Dangerous Curves继续展示了Ruby的冒险经历,此次的Demo总共只有45秒,Ruby在逃亡过程中遭到了Optico的追杀。高机动性的摩托车在狭窄的隧道内高速疾驶,无数机器人炸弹正在追赶,情况十分危险!
名称:Ruby:Dangerous Curves
下载:http://www2.ati.com/misc/demos/ATI-Demo-DangerousCurves-v1.3.exe
大小:EXE格式,179MB
第七章\\第四节 X1800 Ruby:The Assassin
X1800系列的隆重登场打响了ATI对抗NVIDIA 7800的反击战,以当时的形势而言多次延期的X1800并不乐观。但首次支持SM3.0规格、全新的架构、超高的频率以及超强的性能都需要强大的宣传攻势体现出来!
鼎鼎大名的Ruby再次出现在了X1000系列的Demo当中,此次的剧情进一步发展,而Ruby的对手也比以前更为可怕:
下载:http://www2.ati.com/misc/demos/ati-demo-theassassin-v1.0.exe
大小:EXE格式,131MB
技术:DirectX 9.0c,SM3.0
第七章\\第五节 HD 2900 Ruby:Whiteout高清截图赏析
伴随着R600的发布,ATI带来了首款采用DX10 SM4.0技术的Demo,主角当时是颇具人气的Ruby,此次Demo时长正好3分钟,还是与图形工作室RhinoFX合作开发。首先我们为大家献上R600 DX10 Ruby Demo:Whiteout的高清晰截图及Demo剧情介绍,下一页再详细分析Demo所采用的图形引擎及相关技术!
以下所有图片均为1280×720(720P)分辨率,可点击放大欣赏完美画质和景物细节:
第七章\\第六节 HD 2900 Ruby技术解析
第一小节 更大规模的多边形,展现人物完美细节
每一代Demo的设计理念就是最大限度的发挥显卡实力,应用最新非常先进的技术,当然还要保证Demo能在当时优异显卡上面流畅运行,所以在基于X800XT的Ruby Demo中ATI使用了8万个多变形,这个数目达到了当时主流游戏的8倍!
而在最新Ruby 4.0当中,有了强大的R600作为后盾,ATI大胆的使用了20万个多变形来构建Ruby模型,其中大量的多边形用于增强Ruby的脸部细节、皮衣和皮帽。这样可以让Ruby做出更加丰富而又生动的表情,不像以前那样单一乏味。衣服的增强也是极富质感,可以让Ruby的身体做出各种高难度动作,看上去更加和谐真实。
第二小节 支持更多活动混合变形,人物更加生动活泼
再来看看Ruby的脸部细节,Ruby 1.0在当时受到了技术条件的限制,虽然可以通过高精度的纹理贴图来增强嘴唇和面部皮肤的质感,可是Ruby的脸部表情很难做出改变,最多只能支持4个位置进行活动混合变形,所以Ruby只能进行简单的局部微笑表情,不过这在当时来说可变面部表情已经优于很多游戏里的呆板人物了。
第七小节 三款Ruby Demo运算量对比:
Whiteout当中像素着色指令数之所以会减少,这主要是得益于智能的动态流控制技术:在过去处理三个不同的光源需要三条指令,而现在可以将三条指令打包成一条交给一个Shader在单周期内完成!
ATI很早就在强调算数指令的重要性,2003年的Ruby 1.0中ALU:TMU就达到了4:1,2006年的Ruby 3.0达7:1,这其中像素着色和顶点着色都在大量使用算数指令(也就说抛去顶点着色的话,像素:纹理的比例会稍低一点),所以ATI上代产品像素:纹理=3:1架构就是基于这个理念来设计的。根据发展趋势来看如今像素指令已经达到了纹理指令的10倍以上,如果加上顶点着色中的算术操作的话,如今ALU/TMU比例达到了23倍!所以ATI在R600核心中集成了空前的320个ALU运算单元,而纹理单元设计改进相对有限。
第七章\\第七节 HD 2900 Ruby Demo引擎将会被很多游戏采用
ATI展现给我们的R600 Ruby的确是相当完美的,但是这种Demo很多时候仅仅用于图形演示而已,其特性和编程模式并不会被实际游戏所采用,比如效果完美的3DMark系列和NVIDIA/ATI的历代Demo只能算是昙花一现。
Ruby Demo当然时是根据其架构为R600量身打造的,能够适应其架构优势发挥出最大的实力,而游戏则很难达到如此境界。但是我们发现了一个Ruby Demo的秘密,这个Demo所用引擎在未来可能被很多DX10游戏所采用……
在GDC2007(游戏开发者大会)上,瑞典DICE公司(战地系列游戏开发者)透露出了一些相关资料,原来ATI鼎鼎大名的Toyshop(玩具店,X1800系列除Ruby 3.0之外的另一款经典Demo)是由他们和ATI携手创建的。
同时DICE Johan Andersson也通过隐晦的方式透露ATI R600 DX10 Ruby Demo使用了他们的下一代游戏引擎——《Frostbite》(霜寒),这就是传说中的战地二引擎:
AMD收购ATI不仅仅是获得芯片组业务和图形芯片业务这么简单,将AA资源优势整合这才是重中之重。尤其是今年来CPU和GPU的技术发展都有很多重复之处,CPU和GPU的应用领域也在不断的交叉融合,由此造成了不少运算资源的闲置和浪费,如果能够最终完成CPU和GPU的整合,那么将对整个产业造成深远影响,而且AMD的实力和地位也将会膨胀!
AMD明确指出,拓展GPU的使用效能,是AMD的一项策略目标,尤其传统用来解读计算机指令及处理存在计算机程序数据为主的CPU架构正趋向多核心分工发展,而AMD的汇流运算(Stream Computing)技术能让GPU分担CPU运算。目前AMD Stream汇流处理器已被大量使用在科学研究、国防安全、财务预测等应用面,前景十分广阔。
第九章:AMD高清视频功能解析
第一节 高清时代来临 HDTV普及趋势加快
从两年前HDTV概念开始进入大众视野,如今已经被越来越多普通用户所接受。然而在国外发达地区,HDTV的普及度早已超出我们的想像。根据Display Search 2006年第四季的调查报道显示,北美2006年的HD用户已经达到2000千万以上。而在今后两年,包括欧州、日本都将进入HDTV的高速发展期,预计到2008年用户总数突破6000万以上。
国内的情况略有不同,虽然央视高清频道以及各地方台数字纷纷开播。但在高清电视信号和高清碟机还没有普及的情况下,通过宽带高速下载高清影片使得PC最先成为了HDTV的主力播放设备。随着蓝光与HD-DVD竞争局面逐渐明朗,播放设备的成本降低让国内用户有机会体验正版HDTV影片。四月末,首批蓝光格式电影光盘已经出现在香港市场,最低售价不过180元港币。可以说,HDTV距离我们更近了。
首批在香港上市的蓝光格式电影光盘,最低售价180元港币
低端PC成瓶颈 解决播放问题仍是关键
无论下载还是正版高清影片,播放仍然是个大问题。或许还没有很多人把HDTV影片的播放和显卡联系在一起,也许大家都觉得“无非是看个电影嘛,什么显卡不都一样么”。这主要是因为初期HDTV都采用了和DVD相同的MPEG-2编码,只不过码率高了一些,因此只要CPU频率够高、或者是双核CPU,都能够通过软件流畅完成解码,所以很多人并没有对HDTV播放投入足够多的重视。
蓝光和HD-DVD来了,保证流畅播放仍然是个大问题
如今,作为HDTV的载体,HD-DVD和蓝光开始普及,高压缩率的VC-1和H.264取代了MPEG-2成为新的编码标准,相同品质视频的体积变得更小,但同时解码要求大幅增加,仅靠CPU已经无法胜任需求。此时显卡的视频加速性能直接影响到了HDTV的播放流畅度和画质。
从这张Blu-ray、HD-DVD与DVD的规格对比表中不难看出,随着视频分辨率由DVD时代的720×480提升至1920×1080(1080P),高清节目数据流量也随之水涨船高,从9.8Mbps峰值到达蓝光电影的40Mbps,这也成为影响HDTV视频的流畅度播放的主要原因。
除了数据流量增大之外,HDTV影片不同的编码方式对电脑硬件的要求也相差甚远。目前,Blu-ray、HD-DVD影片采用的编码格式为MPEG2、VC-1、H.264三种。每一种编码格式算法、复杂程度各不相同,这也是为什么有些玩家能够搞定MPEG2影片却无法流畅播放H.264格式影片的关键所在。
为了能够更加深刻的理解ATI UVD技术的实现方式。这里我们首先对HDTV所采用的三种编码格式作一个详细的介绍:
● MPEG-2——已经难不倒主流CPU和显卡
MPEG-2是由MPEG(Moving Picture Experts Group,运动图像专家组)制定的国际通用视频编码标准,MPEG-2在很早之前就得到了广泛引用,它的优点是运算量相对较小,对于现有行业设备的兼容性最好,我们所熟知的DVD影碟即是MPEG-2编码。但MPEG-2文件容量过大,一部2小时左右的1080i/1080p格式电影通常需要10GB—20GB的存储空间
早期的BD影片多数采用MPEG-2编码
早在GeForce 256时代的主流显卡就实现了MPEG-2编码补偿,即以GPU来实现部分解码过程。但是此时仅仅是数据流的渲染处理,并未在算法上取代CPU,因此更多的贡献在于提高画质而并非降低CPU占用率。为了改变这一现状,主流显示芯片厂商都在最新的显卡中采用补偿技术,做到了MPEG-2硬件加速解码,此时CPU的负荷可以更大幅度地下降。
MPEG-2虽然古老,但这并不意味着它就是过时的——我们可以把它比作是经典游戏Doom3,虽然问世了3年之久,但至今依然有新游戏采用Doom3的OpenGL引擎。同理,如今采用MPEG-2编码的HD-DVD和蓝光影碟也不在少数。
早期,MPEG-2格式的影片体积并没有超出HD-DVD或者蓝光光盘容量的限制,那么就没必要使用压缩率更高的H.264或VC-1。但对于大片或者是加入了很多拍摄花絮、分支剧情以及预告片的影片来说,使用MPEG-2可能无法植入如此众多的内容,所以MPEG-2被淘汰是必然的。如今流行影片BT下载,更小的文件体积就意味着减少网络负担和下载时间,因此采用H.264以及VC-1的影片越来越多,MPEG-2仅限一些球赛或者节目短片,慢慢被淘汰出局。
● VC-1(WMV9)——存在局限性的平衡之选
微软WMV格式的视频文件大家并不陌生,与早期的ASF格式一样,WMV也采用了MPEG-4编码技术,并在其规格上进行了进一步开发,使得它更适合在网络上传输,微软希望用WMV来取代其它电脑流媒体格式。而VC-1是微软针对TV平台开发的视频编解码技术,是基于微软WMV9压缩技术的一个视频编码规范,由运动图像和电视工程师机构加以标准化,从而成为微软自有版权的国际公认视频编码标准。
在微软的支持下HD DVD基本上均采用WMV9图形编码
有了微软这个行业巨头的强力支持,VC-1进入并且得到广泛采用是必然的事情。比起老迈MPEG-2,VC-1的压缩比更高,而比起热门的H.264来说,VC-1所需的编码解码计算要小很多。所以说VC-1应该是一个比较好的平衡,但随着硬件技术的不断进步,VC-1也暴露出了不少弊端。
微软官网提供大量WMV9 1080p短片下载
压缩率方面VC-1不如H.264这就是硬伤,可能会限制影片的时间长度,因此VC-1的使用存在一定的局限性,对于文件体积有严格要求的网络HDTV大多采用H.264而非VC-1。这就使得VC-1的处境类似于一种过渡方案,未来H.264的前景被普遍看好!
● H.264(AVC)——最被看好的视频编码格式
MPEG-4 AVC(Advanced Video Coding)也叫H.264,它是最新的MPEG压缩技术,目前负责通信技术标准化的ITU-T(国际电信联盟电信标准化部门)与ISO(国际标准化机构)正在合作制订相关标准。
H.264编码最大的优势在于它能够以更低的码率得到更高的画质,例如一部2小时1080p格式的HDTV电影,如果使用与DVD相同的MPEG2编码,需要15GB左右的空间来保存;而如果使用H.264编码的话只需一半左右的容量,并且画质与MPEG2的不相上下。
相同码率(意味着文件大小相近),H.264画质优势明显
相近的画质,H.264所需码率大为减少(意味着网络带宽要求降低)
高压缩率除了能够让视频文件体积大幅减少之外,还可以让流媒体的数据传输率降低不少,这就意味着可以在线视频或者是手机等带宽较窄的网络上传输高质量的视频,可以说应用前途一片光明。
第三节 硬件视频加速
了解完MPEG-2、VC-1、H.264这三种HDTV视频的编码格式,大家应该明白H.264编码最为复杂。高压缩率、高质量的特性让H.264编码的影片在播放的时候对硬件系统提出的要求最高。相比之下,VC-1编码复杂程度次之;MPEG-2最次。据相关资料显示,H.264的影片在编码的过程中复杂度是MPEG2的10倍,解码的复杂度是MPEG2的3倍,这对于CPU来说是很沉重的负担。
从GeForce 6/Radeon X1000系列开始,NVIDIA/ATI纷纷在GPU当中加入了解码加速模块,通过DXVA接口调用GPU资源辅助CPU进行H.264解码,达到降低CPU占用率的目的,让影片得以流畅播放。
早期的Avivo及PureVideo HD对HDTV解码并不完备
即便如此,但NV/ATI第一代视频技术大半还是需要通过软件交给CPU处理。例如上图,PureVideo 具体就是负责后期输出的Motion CompensATIon(运动补偿)和Deblocking(解码去方块滤波),也就是说前期Bitstream Processing(流处理)、Inverse Transform(逆变换)解码仍然要交给CPU来完成。
不过随着时代的发展,内容提供商和用户对影片画质的要求用来越高,由此导致HDTV码率成倍提升,播放影片对硬件方面也提出了更高的要求,上代的视频加速技术已经开始力不从心,无法胜任高码率HDTV的需求!
当H.264影片码率超过20Mbps以上,流处理部分CPU占用率最高达到47.8%
为了降低高清视频的门槛,同时亦是为了适应未来高码率HDTV以及影碟的播放需求,NVIDIA在G84/G86核心内集成了新一代Video Processor,而且还加入了全新的BitStream Processor Engine(二进制空间分割引擎),这个模块专门负责处理上代PureVideo所忽略的CAVLC(前后自适应可变长度编码)/CABAC(前后自适应二进制算术编码,压缩率更高)解码以及Inverse Transform(逆变换)。
通过改进H.264的编码引擎,就可以在显卡上完成H.264全部的解码过程。即便玩家使用低端处理器,也能在播放高码率H.264视频时大幅降低CPU占用率,这也是正真正意义上首次实现GPU纯硬件解码H.264。
下面,我们将要介绍的ATI UVD技术还会更加令你兴奋。因为它不仅仅支持H.264的完整硬件解码,对于VC-1完美解码同样能做到100%支持。
第四节 UVD 引擎解码流程
在文章的第一章我们曾介绍过,作为新一代ATI Radeon HD 2000系列的产品亮点,HD 2000在视频方面的改进完全可以用惊艳来形容。全新推出视频加速引擎UVD(Universal Video Decoder,通用视频解码器)配合HDMI数字/音频输出以及全线产品HDCP认证能够在播放HD音频时解决各方面的难题。
UVD引擎解码流程,支持H.264/VC-1完全的硬件解码
上图就是ATI UVD引擎解码流程,与上页我们介绍的一样,UVD引擎可以完成H.264视频解码的全部4个过程;不仅如此,对于另一种HDTV编码格式VC-1也是完全做到了显示卡的百分百解码,对于MPEG-2编码的影片更是不在话下。
换句话说,也就是UVD引擎支持目前最全面的HDTV编码格式。无论在播放蓝光还是HD-DVD时,都能保证较低的CPU占用率。
相比CPU软件解码、竞争对手以及Avivo,包括UVD引擎的Avivo HD功能最为全面
无论是H.264还是VC-1,采用UVD引擎的HD 2000系列比G84/86略胜一筹
显然,NVIDIA是认准了未来高清视频一定是H.264的天下,所以在GPU纯硬件解码H.264上大有改进,而未重视了VC-1格式的解码。对于后来者ATI HD 2000系列,要想获得DIY玩家的认可,后来居上,必须想办法超越竞争对手。
尽管VC-1编码复杂并不及H.264,CPU占用率也相对较低,但毕竟部分解码与全面硬件解码从功耗、整体CPU占用率上都有差别。作为普通玩家,当然希望拥有一款能够支持全面HDTV视频解码的显卡。
第五节 HQV测试
HQV Benchmark是一款面向多媒体PC以及家庭影院的基准测试程序,它其中包含了多种特征的视频素材,可以非常全面的检验影音系统在视频播放方面的能力,并且以画质定分数从而裁定性能。接下来,我们针对R600的视频画质部分进行测试。作为参考,我们选取了NVIDIA同档次产品8800GTS 640M作为对比。
有关HQV的介绍与测试,各位读者可以参阅《教你给显卡视频评分 HQV权威测试教程》
我们选取了其中特殊场景截图进行对比。下图是HQV测试中的抗锯齿项目,快速移动的三个线条用来测试视频系统对于快速运动物体的锯齿消除能力。
需要说明的是,HQV Benchmark是一项视觉效果测试,其评分是根据画面而定。HD 2900XT在本次测试当中得到了130分满分,比1950XTX的118得分提高了不少。8800GTS 640M得到128分,离完美只是一步之遥。
最后,我们也必须看到HQV Benchmark存在的局限性。因为仍然采用DVD作为存储介质,HQV视频格式仍然是较老的MPEG-2编码。这对于注重考察HDTV视频画质并没有实质性意义。据了解,HQV的最新版本HQV HD将会在近期推出。
关于HDTV视频加速测试,由于R600研发时间较早,没有加入对UVD视频引擎的支持,HD 2900XT视频加速功能仍保持在X1950系列水平。在征求AMD方面后,我们选择了放弃这部分测试。
高端卡不支持新的视频技术在NV/ATI两家都不算罕见,例如NV 8800系列就不支持85/8600具备的H.264全硬件加速。不过这对高端用户而言关系不大,因为购买R600/G80的用户肯定都会配备高端酷睿2双核CPU,HDTV高清视频的解码也无大碍。
对于HD 2000系列解码能力以及UVD引擎的测试部分,我们将在HD 2600/2400产品评测中详细为大家介绍,敬请期待!
第十章 显卡声卡二合一!HDMI声卡解析及体验式测试
第一节 电脑音频的数码之路
上个世纪90年代初,电脑开始逐步强化了多媒体功能,当时能够给电脑配个光驱,加个多媒体音箱,在14寸球面CRT上看看VCD就已经是一个很令人兴奋的事情了。当然这一些早已变成了过去,随着科技的发展,人们对于电脑的多媒体方面的性能也是有着不断提升的需求。
转眼到了2007年,AMD最新推出的R6XX系列显示芯片已经具备了数字音频输出的能力,将电脑音频的发展之路推向了新的纪元,下面,我们就来先看看以往的电脑音频方案是如何解决的。
最初的时候,大家对于电脑音频的需求仅仅是能出声就好,但是随着人们需求的不断提高,渐渐开始追求电脑所能回放的音频的质量了,这个过程中,一家传奇的公司为整个电脑多媒体领域贡献了很多优秀的产品,这就是创新。
拥有光纤和同轴数字音频输出的主板非常常见
HDMI1.2:在1.1的基础上增加了可以传输SACD的DSD音频流。
HDMI哑巴方案
“飞线”方式能保证有声音并且成本比较低
华硕的光纤接口HDMI显卡
普通用户的接法
高端用户应先接到AV功放上
除了超大电流之外,VT1195SF最明显的优势就在于这套芯片的损耗非常小,其开关频率达到了1.5MHz,内部阻抗仅为1mΩ,所以整体转换效率可高达89.3%!这里可以做一个简单对比,传统供电转换效率最高为70%,而且随着电流的增大和温度的升高下降很严重,X1900XTX的VT1105转换效率为80%,X1950XTX的VT1115转换效率为85%。在此基础上再提升5%谈何容易!
R600核心3D模式下的工作电压是1.15V,假如通过电流为240A(实际上这个峰值电流可供2颗R600 CF了),那么实际需要的功率就是276W,90%的转换效率代表需要306W的电源功率,可如果是70%的普通PWM转换效率那么实际功率将攀升至394W,光是供电模块白白浪费的功率就高达90W,可见选择一个转换效率很高的电源模块对显卡的作用有多大。ATI不惜成本采用非常先进的供电模块,除了压缩PCB面积之外,另一大目的就是尽可能的降低无谓的功率消耗。
目前市面上大部分的显卡为了节省成本都省略了这部分供电,因为它可以共用显存的电源。按理说R600主供电模块的单独一颗VT1195SF的40A电流应付16颗显存供电已绰绰有余,但ATI为了让组成512Bit显存带宽的16颗显存具备更好的稳定性和超频性又额外使用了一颗CSP 75Pin封装的VT233芯片,此芯片将电源和MOSDET都整合进一颗芯片中,可提供的峰值电流为18A,连同前面的那颗VT1195SF我们可以算出R600的供电模块一共可以为显存提供58A的峰值电流,实际上一般每颗GDDR3显存才需要1A的电流(合计是16A),配合14层PCB和现代1.0ns的显存颗粒,HD 2900XT可以说是最具超频潜质的显卡!
通过前面的分析我们知道供电模块的VT1195SF拥有很高的转换效率,这种高效率主要依靠的是高达1.5MHz的开关频率,在如此高的频率下普通的铝电解电容无法满足要求,而更高级的钽电解(包括聚合物)电容,在开关频率高于1MHz的情况下,电气性能会大为下降(普通显卡所使用的PWM开关频率为300KHz左右)。
所以在HD 2900XT显卡上使用了一排排昂贵的MLCC(多层陶瓷电容)。MLCC被广泛的用在军用雷达、电子干扰发射机等高精密电子设备之上,近年来被高频率的CPU所采用(Intel CPU背面就有很多MLCC),因为MLCC能够在很高的频率下工作,而且拥有极强的抗干扰能力。MLCC的上限工作频率可以高达100GHz以上,而铝/钽电容工作频率还没有高于1MHz的!
MLCC的另一个优势就是ESR值(等效串联电阻)特别小,大家认为优品的SANYO OSCON电容拥有最小的ESR值(一般此时电容值高达1500uF以上) 都在10毫欧姆左右,而MLCC(22UF)很轻易达到1毫欧姆以内,可以说不是一个级别,正是MLCC的这些优品特性奠定了它电容之王的地位!
ESR值是一个非常重要的电容参数,比如即使1毫欧姆乘以100A的电流=0.1V,而显卡的核心工作电压只有1.15V左右,显存在1.8V左右,细微的电压波动可以直接造成死机或花屏!即使HD 2900XT用了那么高档的MLCC仍然要多颗并联才能让ESR进一步降低。HD 2900XT使用的是村田制作所优品22UF 0805 X7RMLCC电容,成本自然非普通铝/钽固体电容可比!
第十一章\\第五节\\第六小节 辅助供电模块同样豪华无比
在HD 2900XT PCB背面和输出部分,也使用了不少钽电解电容,这些电容与核心、显存两个耗电大户无关,主要给一些小PWM滤波,这些PWM负责风扇和辅助芯片的供电。X800系列和7800/7900的主供电模块依靠钽电容滤波,而HD 2900XT竟然用钽电容给风扇和小芯片供电,ATI高端显卡奢华的做工和不惜工本的用料可见一斑!
第十一章\\第五节\\供电小结:
从HD 2900XT显卡身上,我们再一次感受到了ATI追求完美的显卡设计理念:最豪华的14层PCB、最优异的数字供电、电气性能较好的MLCC陶瓷电容、最大的电流输出和最高的转换效率。无论X1800XT、X1900XTX、X1950XTX还是HD 2900XT,ATI每一代产品都是当时来说登峰造极的显卡!
当然为此ATI也付出了很大的代价,单单是一个全铜热管散热器,成本就要高达60美元,14层PCB以及数字供电的成本也远非竞争对手产品可比(8800GTS仅为10层)。令人难以置信的是,如此成本高昂的优异显卡上市价格仅为399美元(国内定价3299元,还附送DX10游戏大作),要低于8800GTS 640MB,据了解个别厂商的团购价格甚至仅和8800GTS 320MB相当,要知道其成本是要高于8800GTX的!
为了最大限度的发挥出优异显卡的实力,我们使用了频率最高性能最强的Core 2 Duo X6800 CPU,搭配双通道2GB内存,确保CPU和内存子系统构成瓶颈,另外975X主板还能够支持交叉火力,在测完单卡之后我们还将进行双卡性能测试。
PCPOP.COM泡泡网显卡评测室 | |
硬件系统配置 | |
处理器 | Core 2 Extreme X6800 (双核, 2.92GHz, L2=4MB) |
主板 | ASUS P5W64 WS Professional |
| |
海盗船2x 1GB DDR2-800 (CL | |
Seagate 7200.9 160GB Samsung SP2504C | |
Dell 3007 BenQ SH4231 | |
软件系统配置 | |
操作系统 | Windows XP Professional SP2 |
DirectX | |
显示驱动 | Forceware 158.19 (XP) ATI 催化剂7.4WHQL (X1950XTX) |
华硕的这块P5W64 WS Professional主板是给工作站设计的,采用了975X芯片组,但集成了两颗南桥,从而支持多达4条PCI-E X16插槽,可以轻松的组建双X16交火,接口带宽不再成为瓶颈,可以充分发挥出HD 2900XT交火全部性能。
● 对比评测,目标瞄准8800GTS 640MB
HD 2900XT的官方定价为399美元,国内售价不会仅为3299元,这一价格甚至比8800GTS还要低,因此我们选择了同一价位的8800GTS 640MB和HD 2900XT进行对比。至于8800GTX和8800Ultra,其价格甚至可以买到两片HD 2900XT了。
对于高端玩家来说一款24寸宽屏液晶显示器是必备之物,因此我们的游戏测试分辨率从1920×1200起跳。对于HD 2900XT和8800这种级别的显卡来说,只有在超高分辨率下才能够发挥出全部实力,因此我们还加入了2560×1600这种民用显卡所能达到的最高分辨率!事实上很多发烧玩家早就在使用30寸液晶显示器玩游戏了:
当然,3DMark理论性能测试还是保留了默认设置(1024×768)下的成绩。
第十二章\\第二节 3DMark06理论测试
像素填充率\\单纹理测试中,3DMark06使用2×2尺寸的纹理以64Quad的组合方式铺满整个屏幕。HD 2900XT的成绩大幅超越了8800GTS,实际上已经能够领先于NVIDIA刚刚发布的8800Ultra!
像素填充率\\多重纹理测试中,3DMark06使用2×2尺寸的纹理以8Quad的组合方式铺满整个屏幕,同时每个Quad都会被叠加8层纹理进行复合。使用2×2小尺寸纹理的目的是为了避免显存带宽对GPU填充率的影响,因此测试结果更加逼近GPU的理论值。HD 2900XT的成绩要稍弱于8800GTS。
像素着色器测试,3DMark06使用了第三个游戏场景的峡谷岩石表面的SM3.0/HDR技术,直接由像素着色器生成,此时照射光源会不断变换以检验GPU Pixel Shader的处理能力。HD 2900XT的性能稍稍领先于8800GTS,但差距并没有拉开。
顶点着色器\\简单测试,3DMark06使用了4条第三个游戏场景中的巨龙模型,每条龙都由100万个顶点组成。在龙的旋转过程中,GPU对其进行简单的顶点和单个光照计算。HD 2900XT的顶点着色器性能比8800Ultra还要强。
顶点着色器\\复杂测试,3DMark06提供了一个随风而动的草坪场景,这个场景中除了草丛波纹交给CPU计算之外,无数个顶点转换个光照变换由顶点着色器来完成,由于场景较为复杂纹理填充率也会对最终结果造成影响。HD 2900XT的顶点着色器性能领先8800GTS/GTX/Ultra达70%以上,显示出了第二代统一渲染架构的优势。
Shader粒子测试,3DMark06一共引入了409600个粒子,GPU需要对每个粒子进行欧拉综合轨迹计算和简单重力、空气阻力的计算;与此同时,GPU还要负责在垂直方向上(高度)对所有粒子进行碰撞检测。R580不支持VTF因此无法进行此项测试。两款采用了统一渲染架构的HD 2900XT和8800GTS表现都不错,HD 2900XT更胜一筹。
Perlin Noise测试,是由8个一组的简单3D计算构成。在整个测试中一共包含了48个纹理查找操作指令和447条运算指令。由于Pixel Shader 3.0最多只能在一个Shader中包含512条指令,因此Perlin NoiseShader所包含的共495条指令已经接近极限。在48个纹理查找指令中,每次查找的纹理都为32bit 256×256(64kb)大小,以避免大型纹理查找受到显存带宽的限制而影响最终的测试结果。HD2900XT的表现非常出色,大幅领先于8800GTS,再次超越了8800Ultra。
第十二章\\第三节 ShaderMark V2.1理论测试
在总共25个子项目中,HD 2900XT赢得了其中16项,8800GTS 640MB赢得了9项。总的来看两款显卡的差距并不是很大,HD 2900XT并没有远远领先优势,在面对8800GTX是就里不存心了。
第十二章\\第四节 3DMark03——DX7/8/9综合测试
非常可惜的是,HD 2900XT在打开AA之后性能暴降,最终得分甚至不如X1950XTX。这个问题可能是出自驱动可编程CFAA方面,如此不正常的成绩应该属于BUG,据悉AMD将会在稍后发布新的驱动以解决这个问题。
● FarCry(孤岛惊魂)——首批经典DX9游戏,支持DX9C:
FarCry是一款比较老的DX9游戏了,普通模式下对显卡的要求并不高,它以频繁更新的补丁而闻名。给FarCry打上一款款补丁之后,这款老游戏不但兼容性、游戏性得到了增强,而且它也成为了首批支持HDR技术的游戏之一,在高分辨率下打开HDR或者AA时,优异显卡也很难跑出高FPS。
最新的半条命2第一章依然使用了Source引擎,但Valve一直都对引擎做改进和优化,Source引擎使用了Int16格式的HDR,因此DX9显卡都可以完美开启HDR+AA特效,但精度范围不如FP16 HDR。
● Command & Conquer 3 Tiberium Wars(命令与征服3:泰伯利亚战争)
号称RTS王者归来的经典游戏新作,人气非常之高,以至于正式版发布之前就已经入选WCG2007正式比赛项目,在繁体中文正式版发布之后引起了C&C3热潮。
抛开游戏性不谈,C&C3将RTS游戏的画面提高到了新的境界,比起英雄连复古的风格、帝国时代绚丽的画面,C&C3更加重视细节方面和战斗场面,所以如果特效全开的话,优异显卡也不一定能保证流畅的速度。
C&C3游戏本身存在30帧限制,但我们通过特殊的方法破解,这样才能够区分出不同显卡之间的微弱差异。C&C3默认就能侦测到显卡最高支持的AA等级。由于游戏本身就十分消耗资源,打开AA后可能连基本的30帧都很难保证,因此测试中并未开启AA。
第十三章 DirectX 10性能测试
第一节 DX10浮出水面,两大阵营硬件齐备,玩家苦于没有游戏
随着DirectX10伴随着Windows Vista操作系统浮出水面,大家对于DirectX10(以下简称为DX10)的关注也日益升温,作为普通玩家最关心的当然是DX10所能够给我们带来什么样的游戏效果。这个过程中最吊观众口味的就是Crysis陆续放出的截图和视频了。
DX10 动态日夜交替变化
DX10 完全交互式环境
经过前面几章的介绍,我们已经看到了非常令人欣喜的情况,无论是AMD(ATI)还是NVIDIA都已经推出了支持DX10的显示芯片,很多读者一定对他们的DX10的性能对比非常感兴趣。
但是非常不幸的是,《Crysis》原来传言是在年初发布,然而迟迟不见其踪影,目前的消息是需要等到7月才会正式和大家见面。截止到目前,全球范围内还没有任何一个DX10的正式版游戏的出现,对于这种软件落后于硬件的情况还是比较少见的。
究其原因,一方面肯定是因为DX10的显卡占有率太低,刚刚出现的G80和R600都是定位于发烧友的产品,普通的消费者暂时还消费不起。另外一方面则是因为DX10的全新特性比起DX9改变了太多,这些变化需要让程序员接受并且反映在游戏中,肯定是需要一定的后延期的。
但是,当我们在大约一个月之前计划进行R600的测试的时候,就定下了一定要为大家带来最详尽的测试的目标。
第二节 客观,公正,专业,全面,泡泡网为您带来最权威的DX10测试
这次我们的测试分为几个部分,除了前面大家见到的理论测试,游戏测试,之外,我们还将为大家带来最权威的DX10性能测试和视频播放测试。
在这次测试之前,我们和其他媒体一样收到了AMD提供的目前唯一能够运行的DX10游戏的测试版测试软件,《Call of Juarez》(狂野西部)的Demo。
不过我们这次测试并没有局限在仅仅使用这一个测试软件进行测试,因为这样得来的成绩难免有些不够全面。
这次我们的DX10测试分为游戏测试部分和理论测试部分。游戏测试部分使用的就是COJ的Demo版本进行测试。而理论部分测试使用的是来自于微软的DirectX SDK。由于DirectX标准就是微软制定的,所以微软的软件和程序具备了更中立更权威的特性,我们希望通过这个测试告诉大家最公正的数据。
什么是DirectX SDK?
DirectX SDK就是DirectX Software Development Kit 的意思,大家通常称之为DirectX开发包,这是一个微软官方网站提供给所有的开发人员免费下载的一个软件包。
这个例程主要展示了DX10同时向6个渲染目标渲染场景的能力,以及用到了一些Geometry Shader的功能。
这个例程中的模型可以为一个球体或者是一辆汽车,我们都分别进行了测试:
这个例程主要展示了使用Vertex Shader、Geometry Shader和Pixel Shader来实现老的D3D固定渲染流水线效果,由于场景不太复杂,光照效果是逐顶点的,且除了雾效之外也没有用到什么逐象素的效果,所以对于各种Shader的使用比较平均且能力考验不是很大,主要还是体现教学意义。
第六小节:Instancing
这个例程所展示的是DX10的Instancing技术,即将一个模型和多个位置信息传给显卡,通过一次调用即可以在这些位置上绘制这个模型的大量副本的技术。另外也使用到了DX10的纹理阵列(Texture Array)技术。由于地上的草叶是通过Geometry Shader生成的,所以此例程也比较考验Geometry Shader的性能。
第七小节:MotionBlur10
此例程实现了基于三维模型的运动模糊技术。这个例程主要可以考验Vertex Shader和Geometry Shader能力。它主要使用Geometry Shader将模型的三角形的边线沿着运动轨迹生成一个3D的条形,然后用渐变的透明度来绘制,以达到运动模糊的那种物体拖着残影的效果。由于生成这个条形需要多次循环,所以Geometry Shader的运算量比较大。
这种3D运动模糊和以前的2D运动模糊相比的优点主要是效果比较稳定,受程序运行帧数的影响比较小。
由于这个例程中还使用了带有骨骼皮肤动画的角色模型,所以它的Vertex Shader也是比较复杂的。而Pixel Shader则编写的很简单。
第十四章 总结 另觅蓝海!AMD让ATI看得更远
● 测试总结:
通过理论测试以及3DMark基准测试来看,R600庞大的核心的确是有着惊人的实力,个别项目中拥有超越8800Ultra的表现,可惜现有糟糕的驱动未能发挥出它应有的实力。
在好几款游戏中,HD 2900XT的性能仅与X1950XTX相当,庞大的流处理器资源被浪费;3DMark03/05默认设置可以跑出很高的成绩,但打开AA后性能巨降,512Bit显存没能体现出优势。这种现象绝对是不正常的,由此可见HD 2900XT性能发挥很大程度上受到了测试版驱动的限制!
即便如此,HD 2900XT还是在绝大多数项目中击败了竞争对手同价位的8800GTS 640MB显卡,性能方面还是可圈可点的。如果将来正式版驱动对其架构和AA模式进一步优化,相信性能会获得很大程度的提升!
目前唯一令人比较满意的就是HD 2900XT的交火性能,双卡的性能提升幅度完胜8800Ultra SLI的幅度,这使得CrossFire的前景变得一片光明!
对于R600这样一款全新架构的产品来说,配套驱动的开发同样是一大难题,尤其是它超标量SIMD架构对驱动的依赖程度比较大。在R600正式发布之前,AMD三个版本的驱动让其性能获得了较大幅度的提升,现在据我们了解,AMD改进AA效能的新驱动即将放出。所以说,现在对HD 2900XT的性能表现下结论还为时过早,或许未来一至两月其性能可以获得较大的改善,让我们拭目以待!
● 另觅蓝海!AMD让ATI看得更远
在我们看来,近些年与NV在图形芯片领域的恶斗几乎让ATI精疲力竭。NV半年一次的产品升级就像是将对手一步步逼向万丈深渊。如今,让我们再回过头看06年的那起收购案,对于ATI而言意义深远。
收购案不仅让ATI实力大增,也让新东家AMD一跃晋升成为全球优异能提供CPU、Chipset、GPU的半导体厂商。借助ATI在消费电子、图形领域获得的成绩,AMD也从单一处理器芯片企业转变为运算解决方案提供商,平台化战略得以真正实现。
同样,收购后的ATI也在避免陷入与NVIDIA性能/价格战泥潭。另辟蓝海,成为ATI产品战略的主导。在此次发布Radeon HD2000系列产品里,ATI别有心意的加入了HD音频、HDMI等特色功能的支持,正式寻求与NV产品的差异化,开创属于ATI的蓝海。
● 技术创新!值得尊敬的ATI
纵观ATI在最近几年的发展,我们不难看出这是一个非常重视技术创新的团队,从他们的各个产品上我们可以感受到他们对于技术发展的推动力。
在DX8.1的时代,ATI就是DirectX标准非常有力的支持者,他们当时推出的Truform技术是唯一的一个支持N-Patch技术的可应用技术。这种技术的诞生为显卡技术以后的DirectX技术的发展奠定了基础;在DX9时代,ATI自主研发的3Dc技术,能够比微软DX标准中的DXTC技术获得更好的效率,和更好的画质效果,这一技术后来被微软纳入了DirectX 9.0C规范当中。这使得使用法线贴图技术的3D程序可以获得更好的运行速度。
在X1900发布的时候,ATI使用实时演算向大家演示了时差贴图令人惊诧的画面效果,这使得在位移贴图尚不能实际应用的时候就能获得了非常好的立体效果。
在芯片架构方面,ATI更是率先实现了统一渲染架构,将其应用在了微软的Xbox360游戏机上,成为业界第一款统一渲染架构的GPU。
今天,R600发布了,我们欣喜的看到,R600对于技术创新的贡献更加显著,Tessellation技术不但已经在Xbox上应用,更是为3D图形领域创造了新的思路,从细分算法到巧妙的“笼子”模型控制法,都是ATI的工程师的智慧的结晶。
当然,物理加速,GPGPU运算,创新的CFAA,乃至完美的内置声卡都让R600不再像是一款显卡芯片,而是一个电脑的多媒体处理中心。
ATI的这种对技术创新不断追求的精神,是我们这些DIYer永远值得尊敬的。
首先,恭喜大家终于看完了这篇泡泡网有史以来字数最多、分页最多、内容最丰富、测试最全面的长篇评测。如果您是花了一定时间仔细阅读这篇编辑心血结晶的话,那么对于R600的架构以及Radeon HD 2900XT显卡的特性将会有一个全新的认识。
Radeon HD 2900XT的性能您满意吗?它击败了对手的GeForce 8800GTS 640MB,相信在未来通过驱动优化还有很大的提升潜力。
Radeon HD 2900XT的功能您满意吗?AMD创新性的在GPU当中整合了完整的声卡功能,是唯一支持原生HDMI(带音频)输出的高端显卡。
Radeon HD 2900XT的价格您满意吗?AMD的官方定价是399美元(国内3299元),而且还附送三款DX10游戏大作,性能比8800GTS 640MB强,价格更便宜。
惊喜回馈!2899元就买盈通HD 2900XT
为了答谢广大读者对泡泡显卡频道的关爱,我们与国内知名显卡品牌盈通合作,特别提供十片Radeon HD 2900XT(限量十片)显卡低价销售。如果您对HD 2900XT有兴趣的话,那么现在就能以极具诱惑力的价格将其收入囊中。
活动方式:
您只需要在文章评论中留言,谈谈对HD2900XT以及本文的看法,并留下您的E-mail地址。我们将从留言中挑选出10位热心读者,以2899元的价格购买到盈通公版HD 2900XT显卡(限一片)。
活动时间:
2007年5月15日——18日,我们将于本周六显卡新闻公布这十位幸运读者。