王者之间的较量,R300 VS NV30深度
特约作者Zephyr简介:国内顶尖的“Tech Fan”,在CG以及显示图形领域有着较深的研究,并接受过图形方面的深度学习和教育。作者最大的特点就是能够有效的将理论和实际相结合,所以才可以写出本文这样精彩的让DIYer看得懂的技术文章。
文中所有的技术资料都为一手获得,真实可靠,一些原来大家不知如何翻译的英文技术词语,作者也按照CG领域的标准用词方式进行了翻译。简单的总结一句,作者绝对是全球显示领域为数不多的真正可以脱离PDF以及不按照PDF模式去写技术文章的人。PCPOP以后还会争取让Zephyr给我们带来更多此类的精彩文章,敬请各位喜欢显示领域技术的FANS们关注。(本文同时也会刊等于最新一期的《电脑高手》杂志)。
最近几年,计算机图形学的发展速度令人瞠目结舌,这一点在基于PC平台的游戏领域表现尤其突出。短短的几年间,PC平台上实时渲染的3D图像效果已经逼近了传统电影领域通过离线渲染所能够达到的效果。这里面,三家公司功不可没:制定Windows平台中用于3D应用程序开发API——Direct X的Microsoft,和一直活跃在3D图形处理器竞技台上的两个图形芯片巨人:ATi和nVIDIA。
ATi和nVIDIA
当前,Microsoft在ATi和nVIDIA的紧密合作下,又制定了最新的游戏规则并发布了最新测试版本——DirectX 9.0Beta 2.1(http://www.neowin.net/staff/users/Voodoo/dx9apispec.exe)。与旧有的DirectX 7和DirectX 8相比,DX9大大向前迈进了一大步,见下图,提供了高度的可编程性和全流水线的浮点颜色精度。
DirectX平台的进化
既然规则已经出来,现在就轮到ATi和nVIDIA开始表演了。这次ATi抢了先手,重拳出击:率先推出了完全符合DX9.0标准的R300,在性能上全面超过了上届冠军NV25。面对老牌拳王的重拳反击,拳坛新霸主nVIDIA自然不甘示弱,蓄力已久的武器NV30也已经备好,就待发出。
不过,这次有点奇怪。不像以前,厂商们早早的就把自己的规格和特性广为散发。这次ATi和nVIDIA对于自己的产品颇为敝帚自珍,就连已经发布的R300都还有不少谜团没有解开,更不要说仍然处于迷雾之中的NV30。再加上引入了五彩缤纷的先进技术,和众多的各种小道传闻,实在让人眼花缭乱,分不清楚孰强孰弱。
为此,为了帮助众多显卡技术热心爱好者能够真正领略到R300的犀利之处,并彻底搞清NV30的确切规格,同时也为了满足自己强烈的好奇心,笔者最近数天专心钻研数量多达千页的有关R300和NV30的各种技术文档、幻灯片、白皮书、源程序乃至DX9和OpenGL1.4的规范,结合自己多年摸爬滚打的经验后,终于大致找到了答案。由于自家觉得还算没有给中国人丢脸,确实独自发现了一些秘密,并得出了一些结论,且未见于国外其他网络媒体,所以公布出来,与大家共享。
最后强调,尽管里面也有一些的性能分析内容,但是如果你对技术不感兴趣,而仅仅想知道R300还是NV30更适合自己,那么可以直接跳到最后,或者干脆放弃阅读这篇文章。<
高次表面(Higher Order Surfaces,简称HOS),由DirectX 8.0率先引入,但是仅仅提供了最简单的HOS技术:N-Patches。在DirectX 9.0和最新一代图形处理器R300和NV30中,HOS被大大加强了,除了继续提供并增强了对N-Patches支持外,新增了对适应性龟裂(Tessellation)、连续性龟裂和置换贴图等更高级HOS技术的支持。由于在现代图形处理器的3D处理流水线中,第一个处理单元就是处理HOS数据的龟裂单元(Tessellator、Tessellation Unit或Tessellation Engine),因此,我们首先来讨论R300与NV30的相关实现特点,见下表。
置换贴图实现:Parhelia 512 vs R300 vs NV30
从前面的表格中,我们可以看出NV30在规格上取得了胜利,甚至独家支持超越DX9.0标准的几何置换贴图。(以下内容是笔者的理解,由于相关资料当前十分匮乏,所以可能有误)由于几何置换贴图的置换值不仅仅能够作用于三角形的顶点部位,而且还能够作用于三角形的内部,因此理论上可以比顶点置换贴图获得更完美的视觉效果,在镜头变换时能够得到更平滑的视觉效果,当然也就需要更强大的计算能力。
P512采用是真正的硬件置换贴图方案,就是说所有的相关计算、龟裂等操作都完全是由硬件完成的。由于Matrox为自己的硬件实现方案申请了专利,所以ATi的R300不能够采用同样的方法,因此R300采用的硬件和软件相结合的方式实现的置换贴图。基于同样的原因,NV30也有可能采用硬件和软件相结合的方式来实现置换贴图。
不过,具有讽刺意义的是。号称完全硬件实现的P512在真正运行采用置换贴图的3D游戏或者应用程序时,很可能效率最低。原因很简单,P512拥有一个效率极其低下的三角形建立引擎。置换贴图不但不能够降低三角形数量,相反,还会大大增加需要处理的三角形数量,可谓雪上加霜。即使P512拥有最快速的HDM实现,也避免不了由于三角形建立引擎瓶颈的制约,而导致性能低下。
争议性的HOS:
高次表面的优点很明显: 在AGP总线和本地显存上仅传送少量的曲面控制点数据,而不是海量的顶点数据,大大的舒缓了GPU的对AGP总线和本地显存的带宽需求,使得带宽不再是整个3D绘图性能的瓶颈。 同时,使用支持创建高次表面物体的特殊创作工具,程序设计员和美工可以创造出很细腻的物体,而不在几千个三角形中纠缠不清。
无可避免的,这种技术也有缺点。成也萧何,败也萧何。其缺点主要来自其优点,为了更清晰的3D描述进行龟裂(计算机图形程序员称其为“几何放大”),这会大大增加三角形的数量,为GPU的几何处理单元带来沉重的压力。如果与大量增加几何运算量的阴影容积(Shadow Volumes)算法同时使用的话,需要处理的三角形数量会产生倍增效应,对于性能来讲,结果是灾难性的。而现代游戏引擎为了最真实的阴影效果离不开阴影容积。同时,还引入了一下问题:
1、冲撞检查很困难,需要额外大量计算。想想看,物体不是由准确的三角形所代表,那么游戏会花很大的功夫去作冲撞检查。 在冲撞检查时,要时刻计算物体的实际表面,这会需要很大的计算量。
2、光照和阴影计算也变得困难和容易出错,原因同上。多边形边界和缝隙等处容易产生撕裂等图像瑕砒。
总而言之,要想在现代游戏引擎中真正采用HOS技术,所面临的困难和问题还是挺多的。著名的计算机游戏程序设计大师John Carmack就是反对HOS技术的领军人物之一:
“置换贴图。唉。我很失望业界仍然在追求这些基于四边形的技术。难道我们从3DO、Saturn和NV1的辉煌成就(呵呵,提醒菜鸟们,它们都很失败—笔者)中还领会不到四边形(技术)实在很糟糕吗?在任何情况下,我们都不会在模板阴影容积的同时还使用任何几何放大方案(包括ATi的Truform)。”
——2002年6月25日
尽管JC的论断显然不但偷换了概念(四边形技术与HOS或D-Mapping并没有必然的联系—笔者),且犯了错误(Matrox的HDM并非基于四边形技术—笔者),但是其本意还是说出来了:如果同时使用大量增加几何运算量的阴影容积算法和HOS技术的话,当前GPU的几何处理能力还达不到。
很快,在某种压力下,JC道了歉并换了一种说法,可是其本意却没有发生任何变化:
“必须向Matrox道歉—他们的硬件置换贴图并非是基于四边形技术。我(当时)想到的是另外一个公司提出的方案(哈哈,很可能就是nVIDIA,其在GeForce 3/4中提出的Polynomial Surfaces技术就是基于四边形的—笔者)。Matrox的实现事实上看起来很棒,因此,即使我们由于几何放大问题而不去使用它,我想它还是能够服务于一个伟大的目的:痛扁任何基于四边形技术的实现方案。”
——2002年7月27日
到最后,JC还是念念不忘调侃一下D-Mapping和四边形技术。
不过笔者相信,HOS技术还是有其用武之地的。并且随着HOS自身的不断进步和完善,同时随着新一代GPU:R300和NV30为我们带来的强大几何处理能力,HOS的应用领域会越来越广泛。
注:如果对HOS技术很感兴趣,笔者有一篇专门讲解DX9 HOS技术的文章。<
顶点着色器(Vertex Shader,简称VS),与HOS类似,由DirectX 8.0率先引入VS版本1.0。在DirectX 9.0和最新一代图形处理器R300和NV30中,VS被大大加强了。DX9.0所引入的VS 2.0,除了继续提供VS 1.0和VS 1.1所有指令的支持外,大大提高可VS可以容纳的指令数量和可以使用的常量寄存器,与此同时还新增了静态流控指令。无论是R300还是NV30所提供的顶点处理引擎(或顶点处理器),都或多或少的超出了DX9规定的VS2.0规范(呵呵,如此勤劳,大家鼓掌)。好,接下来我们就来讨论VS2.0及R300和NV30的VS实现特点及其优劣对比。
由于DirectX 9尚未最终完成,在笔者写作的时候,Beta2.1刚刚发布。在DX9 Beta2中提供了两个版本的VS:VS2.0和VS3.0。现在网上流传一种说法,Microsoft有可能在发布DX 9.0中同时提供VS2.0和VS3.0,而早先流传的说法是,DX9.0仅仅提供VS2.0,VS3.0是为DX 9.1提供的。根据已经公布的技术规范来看,DX9 VS 2.0深深的打上了ATi的烙印,绝大多数方面简直就是R300 VS的翻版,就像DX8 VS 1.0上深深的nVIDIA烙印一样。VS3.0虽然引入了部分NV30的VS概念,然而NV30并不能够支持VS3.0的关键特征,尽管在个别方面NV30的VS甚至超出了当前DX9 VS3.0规范。
对ATi来讲,越早发布仅支持VS2.0的DX9.0越好。而对于nVIDIA来讲,当然最好DX9.0发布时,同时提供VS2.0和VS3.0。呵呵,ATi和nVIDIA两家角力,在加上Microsoft的私心,导致了DX9.0的难产。Microsoft专有的DX9都如此难产,那么更开放的OpenGL 2.0更难产自然更在意料之中了。
整体规格:
好,废话少说,我们先来看看与DX8相比,从整体来看,DX9VS2.0, R300 VS, NV30 VS和DX9 VS3.0之间的规范对照表。
注:“-”表示不支持;“ü”表示支持;“?”表示不详。
* 由于NV30可以使用任何浮点常量内的组员(component)充当循环计数器,所以理论上应该没有嵌套循环的限制,起码可以大于4,待证实。
呵呵,乍一看,VS 2.0 64k的指令总数进步很大,其实这是错觉。这是计算上了循环次数之后得到的数值。所有的VS2.0~VS3.0所能够支持的最大着色程序长度都是256,也就是说,最长的着色程序长度不过是256条指令。64k不过是程序运行后,所能够循环之行的最大指令数。呵呵,其实游戏引擎中基本上不可能采用这类的着色程序,不过,它们确实在数字内容制作(DCC)应用中能够发挥作用。
此外,我们还可以看出,R300 VS似乎就是VS2.0,而NV30 VS似乎更接近VS3.0。是这样的,DX9VS2.0就是依照R300 VS设计的,而NV30则可以称得上是增强了的VS 2.0。
由于支持子程序嵌套、动态流控和条件写屏蔽,NV30在整体规格上取得来胜利,理论上可以实现更强大和效果更好的顶点着色程序。为什么这么说呢?我们来继续分析,就可以更清楚地看明白这一点了。<
寄存器分析:
可能有朋友感到奇怪,为什么要进行寄存器分析呢?寄存器数量的多寡和类型的丰富其实直接影响到VS的功能实现。不但可以决定VS的执行效率、程序编写的灵活性,甚至能都大大影响VS真正能够实现的有效效果数量。说到这里,我想编写过或者还在编写汇编程序的朋友们能够心领神会。
注:
1) – 不支持; 支持; ? 不明; R 读; W 写; U 使用; S 标量; V 向量。
2) * NV30不提供整数常量寄存器和循环计数寄存器,不过任何浮点常量寄存器组员都可以被用作循环计数器。
3) ** NV30采用了不同的静态流控机制。
4) *** 在VS2.0中, 只有常量寄存器组可以被索引,而在VS3.0中通过使用循环计数器也可以索引输入寄存器和纹理坐标寄存器组。
5) **** 采样器寄存器似乎在VS2.0中没有用处。浮点常量寄存器: 又被称为程序参数寄存器,是一组4组员构成的浮点向量寄存器集,用来储存顶点程序参数。这些寄存器集可以用来储存整数也可以用来储存浮点书。R300和NV30这里没有区别。
整数常量和循环计数器寄存器:R300严格遵循DX9VS2.0的标准。NV30这里有很大不同,它可以使用任何浮点常量寄存器的组员作为循环计数器。任何事情都有两面性,这里也一样。在极端情况下,NV30可以为程序参数用光所有的浮点常量寄存器,这时就会导致NV30不能够执行循环操作,因为没有循环计数器了。不过,R300只能够在一个顶点程序中只能够拥有16个独立的循环,这时由于整数常量寄存器数目限制的原因,现在看起来NV30似乎没有这个限制。
布尔常量寄存器:它在严格意义上是用在DX9VS2.0/3.0静态流控指令上的位的集合。总数16个,因此,一个着色程序只能够拥有16个独立的分支条件。R300就提供了16个布尔常量寄存器。不过,由于缺少IF-ELSE-ENDIF指令,R300将使用JNZ和JUMP指令来完成同样的功能。
NV30是用更强大的BRA指令来实现动态流控,不需要这样的寄存器。
地址寄存器:NV30所提供的两个向量寄存器可以提供更好的间接寻址,包括二维数组的访问。
预测寄存器:这是一个布尔向量寄存器,只能够通过SETP指令进行修改,由DX9VS3.0引入来完成预测功能。R300不支持它。在NV30中,同样的功能由条件代码寄存器来实现,包括条件写屏蔽和动态流控。条件写寄存器在NV30的指令集中扮演关键角色。
输出寄存器:NV30额外提供了背面颜色和剪裁距离输出寄存器,提供程序控制裁剪平面,可以用于快速清除无效图形元素,提高以后的渲染效率。
ATi工程师的评论:R300直接支持6个用户裁剪平面,所以不需要裁剪平面距离寄存器。
注意,NV30超出DX9 VS规格的寄存器,理论上采用DX9实现的3D游戏或者应用程序是利用不上的。不过,如果采用OpenGL 1.4 NV扩展,则就可以充分发挥NV30的威力。
R300和NV30在寄存器规格上各有所长,整体看起来,NV30应该更有优势一些。<
指令集分析:
接下来,我们进行指令级别的分析,这才是顶点着色器性能和功能的决定性因素。其实,单从指令集上来分析,除了新增的流控指令外,VS 2.0/3.0与VS 1.0其实变化不大,不过是个别数学函数从VS 1.0中宏指令的身份变成了VS 2.0中指令的身份,例如EXP, LOG和FRC,节省了指令空间,提高了效率。MOV指令进行了调整。另外,VS 2.0/3.0新增了若干宏指令,像ABS, SINCOS, NRM, LRP, CRS, SGN和POW等等。因此,为了排版方便,就不提供DX 8 VS 1.x的指令集了。
DX9VS2.0提供的宏指令集:
ABS, CRS, LRP, M4X4, M4X3, M3X4, M3X3, M3X2, NRM, POW, SGN, SINCOS
在这里,我们可以发现指令集上的巨大差距。大面一看,似乎R300和NV30在顶点指令集上各有所长,其实不然。为了节省篇幅,让我们选择一些重要指令进行分析。
加和乘指令:R300和NV30都能够满足DX9VS3.0的要求。NV30更提供了DPH指令。
数学函数指令:NV30更是大胜,提供了更多的数学函数指令。尽管R300可以通过DX9VS2.0/3.0宏指令来模拟NV30提供的某些数学函数指令,例如,SINCOS宏指令可以完成NV30提供的SIN、COS指令同样的功能,可是在R300中要占用8条指令槽才能够完成NV30一条指令就可以完成的工作。
使用宏指令不但要耗费更多的指令空间,降低顶点着色程序所能够编写的指令程度,而且效率低下。例如,理论上,R300完成SIN函数运算需要8倍于NV30的时间。
集合操作指令:NV30的优势更加明显。
流控指令:乍一看,NV30似乎仅仅提供了三条流控制指令,而且有两条还被子程序使用的CALL和RET指令占去了。真正在流控上起作用的似乎只有BRA(分支)指令,与DX9VX2.0/3.0和R300所提供的密密麻麻的条件指令、跳转指令和循环指令一比,非常寒酸。其实,这种观点非常错误。NV30的BRA指令非常灵活,必要时可以使用分支表进行跳转,还可以结合条件代码寄存器实现动态流控。不但可以实现DX9VS2.0和R300的所有静态流控,还可以实现DX9VS3.0的动态流控。且功能更强大,使用更灵活,理论上效率也更高。真正寒酸的是DX9VS 2.0/3.0和R300。
此外,NV30还支持4层子程序嵌套调用,而DX9VS2.0和R200都不支持这一点。
图形相关指令:NV30同样占有明显优势。
纹理指令:这是DX9VS3.0提出的新指令,用于纹理检索。这是NV30VS不能够称为VS3.0,而只能称为VS2.0+的主要原因之一。另一项是临时寄存器数量不足。有迹象让笔者怀疑,TEXLDV指令是出于Matrox公司的建议。
最后,值得一提的是,NV30所提供的指令,除了三条流控指令外,都可以同时更新条件代码寄存器(NV30对预测寄存器的称呼),只要在编写代码时在指令名称后添加C字母后缀即可,例如MOV -> MOVC。
综合分析后,我们可以看出,NV30在VS指令集上的多数方面甚至超过了VS3.0的标准。无论是提供的功能,还是使用的灵活性,甚至乃至效率,NV30远远的超过了R300。起码在理论上,NV30的VS指令集取得了大胜。<
体系结构分析:
由于缺乏NV30 VS体系结构的详细资料,所以这里笔者仅仅能够针对R300 VS体系结构优缺点进行分析,并根据一些蛛丝马迹大胆对NV30 VS的体系结构进行一定的推断,免得捧场的读者大人失望。
从ATi公布的R300的顶点处理引擎(Vertex Processing Engine,简称VPE)结构图,我们可以一眼看出,R300的VPE竟然提供了4条并行的2.0版顶点着色器。ATi声称与强大的三角形建立引擎结合起来,R300的VPE是业界第一个能够在一个时钟周期处理一个顶点和三角形的几何引擎。呵呵,小学生都会算,一个三角形三个顶点,而R300有4个并行的VS,所以理论上每个时钟周期能够处理4个顶点数据,不就是一个顶点+一个三角形嘛!
不过有意思的地方是,R300在每条VS同时并列使用了一个四维向量处理器(4-D Vector Processor,简称4-VecP)和一个标量处理器(Scalar Processor,简称SP)。什么?四维哪里来的?简单点儿吧,128bit/32bit = 4 FPs。还不懂,那就算了,更详细的解释实在不是短短的几页纸能够完成的,就先这么理解吧。ATi认为,顶点数据流通常都是标量数据和向量数据的混合体,例如,坐标数据-向量,颜色数据-标量(采用整数颜色精度时)等等,并列4-VecP和SP的结构能够实现最高的效率,听起来有一定道理。
R300的VPE和VS体系结构图
为了能够更清楚的表明R300 VS这种结构的优劣,我们使用3DLabs最近刚刚推出的P10数据处理器(VPU)的VS结构来进行对比(Sorry,现在没有NV30 VS的详细信息,nVIDIA工程师实在金口难开,尽了最大努力的笔者也没有办法)。
与传统上3D处理采用4-VecP设计不同,P10的VPE采用了16条并行SP设计。4-VecP专门处理3D中常见的4元素向量操作,通常对这种操作进行了优化设计。然而,如果如果在4-VecP上处理仅有3个元素的向量,或者甚至是一个标量,那么4-VecP将会花费同样的处理时间,尽管数据处理量小得多。
P10中并列的顶点处理器(Vertex Processor),图中的VP相当于正文中的SP。
显然,3DLabs认识到VPE需要更灵活的处理能力,不仅仅是因为非4维向量操作数目会增加,而是VPE中大量使用SP效率会更高,因为它们不会在非4维向量操作上浪费任何处理能力,每个时钟周期都会执行一条指令。ATi则倾向于坚持4-VecP是3D处理的基石,同时提供一个并行的SP,这样每条VS可以同时执行一个4维向量处理和一个标量处理。在处理4维向量数据时,4个4-VecP的处理能力等同于P10 16个SP的处理能力。由于R300的VPU同时还拥有4个SP,所以在最好情况下,每时钟周期,R300 VPE的处理能力是P10的5/4=1.25倍。不过,需要注意,在P10的最好情况下,每时钟周期,R300仅仅拥有P10处理能力的一半,原因前面已经说了,在处理标量数据时,4个4-VecP每时钟周期只能完成4个标量数据,与SP一样,这样R300每时钟周期只能完成8个标量数据处理。
R300的VPE说了这么多,那么NV30的顶点处理器(Vertex Processor,简称VP) 的体系结构如何呢?这里笔者只能透露,与R300令人恐怖的4条并行VS设计不同,NV30只拥有3条并行的VS设计(可能性>90%)。因此,理论上讲,每时钟周期,R300拥有比NV30更强大的几何吞吐能力。<
简单性能分析:
R300的测试数据满天飞,这里实在不用我再多废话,仅仅给出Radeon 9700 Pro(325MHz)与GeForce 4 Ti 4600(300MHz)有关几何吞吐量的理论和实测数据对比,好用来让笔者发表评论。
注意,几何吞吐量(对于R300/NV30,也可以称多边形吞吐量、三角形吞吐量)并不等同于变换速率。不过,理论上,没有瓶颈的GPU能够做到几何变换速率等同于单光源、单纹理贴图情况下的几何吞吐量。因此,这里我们还是可以看出,与上一代GPU相比,R300尽管拥有骇人听闻的三角形变换速率,可是实现效率并没有提高,与GeForce 4 Ti大致在一个水平上。
当然,这里可能存在两方面的原因:1)R300的驱动程序仍然有待于完善。历史记录表明:nVIDIA在驱动程序质量上确实高于ATi,但是近来ATi在驱动程序质量的巨大进步也是大家都能够看得到的事实。不过R300毕竟是全新的体系结构,其驱动程序仍然存在不少的潜力可以挖掘应该是个事实。2)R300的三角形建立引擎还是不够强劲。栽倒在三角形建立引擎上的名家GPU,嘿嘿,有案可查,早先的ATi的Radeon,眼前的Matrox呕心沥血的Parhelia 512。三角形建立引擎的效率高低直接决定了GPU的几何吞吐量大小(不明白,看看R300的VPU结构图)。如果主要原因在于三角形建立引擎,则R300很难通过驱动程序优化大幅度的提高其几何吞吐量,希望不是如此。
那么,NV30的几何变换速率如何呢?让我们先来看看理论值,现在也只能看看理论值。依据:nVIDIA公然宣称,在同一时钟频率下,NV30的顶点性能是NV20的3倍,是NV25的1.5。这其实就是笔者推断NV30只拥有3个并列的VS处理单元的原因,因为NV20拥有1个,而NV25拥有2个。从另外一个nVIDIA制作工艺白皮书,笔者又了解到NV30的工作频率为450MHz。好了,让我们来算算吧:
呵呵,从理论上来看,NV30被R300比了下去。那么实际情况如何呢?笔者这里给出一些推论:
1、理论变换速率是一个重要指标,但是在实际性能中还要受到其他很多因素的制约,例如,前面提到的驱动程序和三角形建立引擎效率因素。因此,NV30有可能在实际三角形吞吐量上超过R300。当然,也有可能差距拉大。
2、理论变换速率仅仅执行了最简单的VS指令操作,不能够反映在执行复杂着色程序时顶点处理器的效率。从前面的分析中,我们可以看出,理论上NV30在执行复杂着色程序时与R300相比具有明显优势。
小结:如果刨除可能存在的三角形建立引擎效率和驱动程序效率因素,理论上,在运行旧有的或者现有的没有使用或者很少量的使用了顶点着色程序的3D游戏时,R300在顶点数据处理能力上要比NV30有少量优势(325 : 306),但是,在运行采用了大量复杂顶点着色程序的未来游戏,NV30与R300相比,在顶点数据处理能力上应该有较大优势。此外,R300顶点处理器能够完成的效果,NV30应该都有能力完成;不过,某些NV30顶点处理器能够实时完成的效果,R300的处理能力可能无法胜任。<
像素着色器(Pixel Shader,简称PS),与VS类似,同样是由DirectX 8.0率先引入PS版本1.0。在DirectX 9.0和最新一代图形处理器R300和NV30中,与VS相比,PS得到了更大程度的增强。DX9.0所引入的PS 2.0,与令很多游戏开发大师诟病的PS1.x相比,可谓脱胎换骨,不但大大提高可PS可以容纳的指令数量,并增加了高级效果所必需的算术运算指令,更重要的是指令的执行方式发生了本质变化:R300和NV30的PS再也不是仅仅只能执行一些极其简单的纹理取址指令和颜色混合指令的简单逻辑阶段(stage)开关了,而是不折不扣的处理单元了,很大程度上解决了复杂像素着色程序带来的像素填充率降低的问题。
与VS一样,在DX9 Beta2中提供了也提供了两个版本的PS:PS2.0和PS3.0。同样,DX9 PS 2.0深深的打上了ATi的烙印,PS3.0引入了部分NV30的PS概念,然而NV30并不能够完全支持所有的PS3.0规范。不过,NV30的PS在有些方面确实大大超出了PS 3.0规范。
整体规格:
同样,我们先来看看与DX8 PS1.4相比,从整体来看,DX9PS2.0, R300 PS, NV30 PS和DX9 PS3.0之间的规范对照表。
注:
1) “–”不支持;“ü”支持;“?” 不明。
2) * 通用指令槽,就是说颜色/运算指令和纹理指令共享指令空间。
3) ** R300支持32个纹理指令,以及64个标量和64个向量运算指令。
严格说来,DX9PS2.0就像专门给R300量身定做的一样,事实正是如此。NV30 PS的强大规格令人印象深刻,1024条指令槽与96条指令槽是质的区别,这一点对于专业DCC应用程序和游戏来讲意义同样重大,同时也能够更好的支持HLSL编译器。此外,我们也确实在DX9PS3.0上看到了NV30 PS的影响。
另外,NV30的PS指令的储存位置很有意思,与VS指令和R300的PS指令储存在芯片内部不同,NV30将PS指令储存在本地显存中。这种方案有利有弊:一方面,为其他功能腾出了宝贵芯片空间并使得管理大量的顶点着色程序更加容易;但是,另一方面,可能会加剧本来就比较紧张的显存带宽并导致执行效率不佳。
寄存器分析:
寄存器分析的意义不再重复,下面就是DX8PS1.4~DX9 PS3.0之间的规范比较。
注:
1)“-”表示不支持;“ü”表示支持;“?”示不详;“r” 代表读;“w” 代表写;“u“ 代表使用;“s” 代表标量;“v” 代表向量;“#MRT”表示多重渲染对象数量。
2) * 通用输入寄存器,取代了颜色输入和纹理坐标寄存器。
3) ** NV30没有提供常量寄存器,NV30 PS中的常量储存在指令槽中。
4) *** NV30不支持MRT, 这两个寄存器不能够同时使用。
这里,我们举出有明显差异的寄存器类型和数量来进行比较说明。
临时寄存器:从数量上来看,R300和NV30都超过了PS2.0 12个标准,并达到了PS3.0 32个标准。呵呵,平手。不过,NV30的临时寄存器使用非常灵活,可以根据不同的数据类型拆开使用:如果全部使用FP16数据格式,则可有64个临时寄存器可用;如果全部使用FP32数据格式,则可有32个临时寄存器可用。有点儿类似CPU中AL, AH寄存器和AX寄存器的关系。
常量寄存器: R300是完全遵循PS2.0标准,提供了32个浮点常量寄存器。而实际上NV30没有提供常量寄存器,但是NV30可以将PS所需的常量放置在PS指令槽中。指令槽当然既可以放置浮点常量,也可以放置整数常量。每个常量占用一个指令槽,最多可以放置512个浮点常量和整数常量。对于复杂的像素着色程序和HLSL编译器来讲NV30的方案更聪明灵活一些。然而对于所需参数不多的小型像素着色程序来讲,R300执行效率应该更高一些。注意:NV30的PS指令是储存在本地显存中的。
输出寄存器:NV30不支持DX9标准中的多渲染对象(MRT)功能。NV30所拥有两个颜色输出寄存器其实分别对应于不同的颜色数据类型FP32和FP16,且不能够同时使用。而R300能够最多支持4个颜色输出寄存器,可以用作G-Buffer来实现一些很好的效果,例如,素描画中的轮廓线效果,还可以用作多流程算法中的中间结果。在MRT功能上,R300大获全胜,NV30竟然不支持。
MRT可以帮助实现的效果
NV30额外提供了4个纹理寄存器,一方面可以兼容以前的FCP程序,另一方面可以用来优化最终版本的像素着色程序,毕竟,还是寄存器合并单元执行效率最高。
总之,R300和NV30在寄存器规格上各有所长,优劣读者自己判断吧。<
与VS1.0到VS2.0/3.0指令集变化类似,PS1.x到PS2.0/3.0指令集也发生了不小的改变。不过隐藏在幕后更重要的是PS2.0/3.0指令执行方式发生了本质变化,变成了类似VS1.0的实现方式。在早期的PS1.0~1.4中,如果PS指令的数量超出了PS处理单元stage数量(上一代GPU只有2, 4 或5),则由于必须采用流水线合并方式执行,此时像素渲染效率会成倍下降。对于PS2.0的实现来讲,每条渲染流水线都配备了一个真正的处理器,再也没有这个问题了,这就为采用复杂像素着色程序的游戏出台打通了最后的障碍。
与PS1.0~1.4,PS2.0/3.0新增了一些指令(包括宏指令):FRC, EXP, LOG, POW, CRS, ABS, RCP, RSQ, NRM, MIN, MAX, LRP。同样,为了排版方便,就不提供DX 8 PS 1.x的指令集了。
DX9PS2.0提供的宏指令:
MIN, MAX, LRP, POW, CRS, NRM, ABS, SINCOS, M4X4, M4X3, M3X4, M3X3, M3X2.
Microsoft是鼓励独立系统开发商(ISV)本地指令实现这些宏指令的(宏指令与本地指令的区别在顶点着色器部分笔者已经作了探讨,但是不作要求)。看起来,nVIDIA的工程师实在努力的多。
不少指令与VS指令情况类似,为了节省篇幅,不在详细介绍,简单评论几句。
如果与PS1.4相比,可以发现其中的LRP指令在PS2.0/3.0中反而变为了宏指令,ATi竟然真的没有在R300中本地实现已经在R200中实现的指令,相反,NV30反倒本地实现了。另外,PS1.4早就提供的CMP指令还是得不到nVIDIA的支持。难道ATi和nVIDIA工程师之间真得如此的深恶痛绝!呵呵。
不能不承认,NV30的PS指令集太强大了,除了不支持流控和一项纹理指令外,几乎在各个方面都超过了DX9PS3.0的规范要求。相比较而言,R300的PS指令集看起来就逊色多了。在VS和PS指令集方面,ATi需要加油!希望R350能够弥补这项巨大的差距。NV30在PS指令集上大胜R300。<
体系结构分析:
类似,在极度缺乏NV30 PS体系结构的情况下,笔者咬牙苦钻nVIDIA所发布和泄露出来的若干NV30技术规范:包括幻灯片、白皮书和源程序,终于也发现了NV30体系结构的若干蛛丝马迹。相信不会令读者失望的!什么?枯燥乏味,让人昏昏欲睡,读不下去了?shit, 太不给面子了。提个醒,最好还是捧捧场,否则你就会错过本文最值得浏览的内容了。我们还是先来看看R300的PS体系结构吧:
R300像素处理引擎的结构
R300同样是业界第一个拥有8条并行渲染流水线的消费类图形加速器,上一代GPU的流行结构是4条。这就意味着R300有潜力在每时钟周期输出两倍的像素数量。
然而,这里有一点需要特别注意,那就是每条流水线仅仅只有一个纹理单元,要知道上一台GPU,包括NV2x/R200,所流行采用的结构是2个纹理单元。
R300像素着色器结构
DX9规范要求,在一个渲染流程(Rendering Pass, 简称Pass)中,每个像素可以采样最多16个纹理。由于R300每条流水线仅拥有一个纹理单元,所以只能够通过循环方式多次利用纹理单元实现这一要求:第一个纹理在一个时钟周期被取样后,结果储存在采样阶段寄存器中,接下来是下一个时钟周期读取第二个纹理,这个过程被重复16次。在R300中,纹理可以是下列情况的任意组合:自由应用二线性、三线性或者各向异性过滤的一维、二维或三维纹理。可以看出R300支持的纹理采样和过滤方式非常灵活和强大。
我们从上图还可以看出,R300的像素流水线每时钟周期能够同时执行三条指令:一条纹理检索、一条纹理地址操作和一条颜色操作。与R300的VS结构采用向量处理器和标量处理器并列结构的原因类似,ATi认为,像素着色程序通常由这些操作混合组成,R300的这种结构在像素着色操作过程中效率最高。
尽管nVIDIA对自己NV30的体系结构百般遮掩,但是为了在没有实际产品与R300对抗的情况下,为了吸引住人们的眼球,不得不一而再,再而三的透露一些NV30相关的一些技术规范、文档、幻灯片和白皮书,这就为我们分析NV30的PS体系机构带来了线索。下图就是来自NV30的幻灯片:
在这里,我们很惊讶的发现,NV30保留了寄存器合并单元,而不是采用指令模拟执行。这是一条很重要的信息,一方面这为旧有的采用OpenGL NV扩展的应用程序提供了最大兼容性和最高的执行效率;同时,也为在NV30上优化像素着色程序提供了新的途径。毕竟寄存器合并单元的执行效率要高于指令。不过有利有弊,着色程序的这种优化方式理论上有可能在未来的GPU上反倒降低执行效率。原因吗,自己想想吧。
众多nVIDIA公布的NV30幻灯片都明白无误的指出了NV30采用了数量多达16的纹理单元,但是具体的像素渲染流水线的数量却好像处于云山雾海。很多人想当然的认为,为了对付R300,NV30(应该)拥有8条渲染流水线。还有人根据计算机原理采用2进值,在进行逻辑单元设计时,数量采用2的指数倍效率更高,所以NV30肯定采用的是8条(2的三次方)流水线。当然,更有人认为既然采用了16个纹理单元,那么流水线肯定采用的是能够被16整除的方案:2, 4, 8, 16,这里当然最可能的方案就是8了。
NV30的片断纹理化和上色结构
事实上,这些说法都有一定道理。更重要的依据在于:前一阵子网上传言,据说来自代工厂商台基电(TSMC)内部员工为自己鸣不平,NV30芯片制作进度之所以严重滞后,不是由于TSMC 0.13微米制作工艺有问题,而是nVIDIA在获知竞争对手采用了8条流水线设计后,临时更改了原本6条流水线的设计方案,而改为8条。这条消息应该不吃空穴来风,因此,NV30采用8条流水线的可能性很大(>80%)。
然而,与16个纹理单元一样,8条渲染流水线设计也不是笔者想要论述的重点。通过仔细研究NV30幻灯片语句里面的微言大义,在加上最新公布的NV30 OpenGL规范,笔者终于得出了最后结论:NV30在像素渲染流水线上很可能采用了革命性体系结构,NV30的纹理单元与像素渲染流水线脱钩了,每条像素渲染流水线都可以访问所有的16个纹理单元(可能性>90%)。原因很简单,nVIDIA公开宣称,在NV30像素着色程序里,可以对16个纹理单元访问无穷多次(>1000),呵呵。恐怕nVIDIA想不到这里会泄露天机。
这种革命性结构可以大大提高采用多纹理的现代3D游戏的像素渲染效率,采用单纹理的游戏早就成老古董了。而且,为了获得更好和更真实的渲染效果,采用越来愈多的纹理进行渲染已经成为趋势。所需要的纹理越多,这种结构的优势就越明显。需要提一句,这种体系结构度对于驱动程序的优化提出了更高的要求,不过,好在nVIDIA拥有最棒的驱动程序开发小组,这是业界几乎公认的事实。
因此,现在我们可以得出结论了:如果NV30拥有8条像素流水线结构,则理论上讲,每时钟周期上,与R300相比,NV30在像素处理器体系结构中取得了近乎完全的胜利:像素填充率(8:8),更有意义的图元(Texel)填充率(8:16)。这还没有考虑NV30在执行像素着色指令理论上拥有的更高效率。<
浮点颜色精度:
看过了那么多的R300测试报告,想必读者大人们都对浮点颜色所带来的好处一清二楚。笔者就不多说废话了,简单提两句。其实,在VS2.0单元中的顶点颜色数据就可以使用浮点数据格式了,不过对于顶点处理器来讲,颜色数据精度的重要性远不如像素处理器,因此,放在了这里进行简单阐述。
NV30和R300都支持浮点颜色精度,号称最高都支持128bit浮点颜色精度(RGBA),就是每颜色通道用32位精度浮点数表示,取代以前的8位整数表示。不过有网站声称R300在绝大部分内部某些操作时,除了纹理取样阶段,其渲染精度只能达到96bit。这条消息尽管没有得到ATi的证实,但是也没有得到ATi的反驳,因此应该是真的。
此外,引入浮点颜色精度影响到的不仅仅是顶点数据中的顶点颜色,或者像素数据中的像素颜色。还会影响很多其他方面的内容:纹理格式、帧缓存格式和显示缓存格式等等。
相对而言,NV30是好学生,不但提供了对所有DX9新浮点格式的支持,而且不折不扣的执行精度标准。32位IEEE浮点精度完全贯穿于:帧缓存、纹理、片段(像素)处理器、顶点处理器和插值过程。同时,NV30片段处理器还支持16位浮点数和12位定点数。而纹理和帧缓存支持更多的定点数格式。
R300的资料尚不完全,现在仅仅知道R300在输入和输出阶段支持FP32和FP16浮点数,以及16位定点数。至于R300所支持纹理格式尚未有明确的答案。
注:有意思的是,似乎是为了照顾R300,在DX9 Beta2规范中,Microsoft尽管要求DX9显示卡必须支持浮点颜色渲染,但是对于浮点精度反倒没有具体要求,就是说,即使达不到IEEE-32的浮点精度,或者说不符合IEEE-32浮点格式,只要支持浮点数,就算是符合DX9规格。
R300展示出的浮点精度和整数精度在颜色表现中的巨大差别
整体来言,由于最高精度的问题,NV30胜R300。<
简单性能分析:
NV30(450MHz)、R300(325MHz)与NV25(300MHz)的理论像素填充率、理论图元填充率和实测图元填充率数据对比。
注:*表示并非实测值,而是推测值。
注意, 理论上,在没有瓶颈的像素渲染流水线上,像素填充率等与单纹理图元填充率。因此,这里我们用实测的单纹理图元填充率来计算像素填充率实现效率。
这里可以看出,在像素填充率上,与NV25高达89.34%的效率相比,R300 68%的效率是在有点儿逊色。这可能是两方面的原因造成的,1)R300的驱动程序不够完善,需要进一步的优化;2)在执行传统的像素渲染操作时,R300通过指令模拟的方式效率较低,比不上传统的寄存器合并单元的效率。如果是第二条原因造成的话,那么R300的像素渲染效率提高的潜力有限。
值得高兴的是,在多纹理图元填充时,R300达到了NV25同样的效率,而这是当前流行3D游戏所采用的主要渲染方式。不过这也同时明显的暴露出了R300与NV25相比,在多纹理图元填充率上面的优势不大,主要来自更高的频率(25MHz)上。这也说明,在某些游戏或者某些游戏场景,R300与NV25的性能差距不会很大甚至持平。
为了更直观的预测NV30的真实性能,我们假设NV30能够达到NV25的实际实现效率,根据nVIDIA硬件和驱动设计水平的历史纪录,这是可能的。那么,NV30将能够达到:3.22 GTexels(=Pixels)/s的像素填充率和6.98 GTexels/s。OMG,知道这是什么概念吗?我们来算算吧:
假设一个未来的NB 3D游戏,所有对象采用8重纹理,采用4X SS FSAA(效果优秀的反锯齿方案),运行在1600x1200分辨率下,那么,如果满足以下条件:
1)顶点处理器的几何吞吐量不造成瓶颈。除非同时大量使用HOS技术和阴影容积技术,否则NV30和R300的顶点处理器不太可能成为瓶颈。
2)本地显存带宽也不成为瓶颈。这是可能造成瓶颈的因素,不过可以通过优化设计和缓存来缓解。
3)CPU的处理能力不成为瓶颈。这点取决于游戏引擎的质量,好的游戏引擎对于CPU要求较低,例如,经典的Quake III,但是垃圾游戏引擎简直是CPU杀手,例如,Commanche,就是NV30,在Pentium IV 2.0G上的帧数也不会比NV25强多少。
那么:NV30的图元填充率能够达到如下帧数:
6.98G/(1600 x 1200 x 4 x 8) = 113.6 FPS。
如果在R300上以同样的条件运行这个游戏的话,则帧数为:
2.53G/(1600 x 1200 x 4 x 8) = 41.2 FPS
呵呵,差距一目了然。
使用海量材质的 Doom III呼唤NV30和R300
不过,这仅仅是理论推断,随着类似NV30和R300之类强劲GPU的推出,天平逐渐向GPU倾斜。现在确实存在一些游戏受制约于CPU处理能力,例如Commanche,尤其是在较低的分辨率下,例如1024x768,没有采用FSAA和AF时,不同类型的显示卡,帧数几乎没有区别。呼吁,期待未来的游戏开发者们多在游戏引擎优化上多下下功夫,好让我们的最新装备能够充分发挥威力。另外,进入R300和NV30时代后,似乎我们运行3D游戏时应该多多考虑考虑1600 x 1200的分辨率了。
Commanche是一个受CPU处理能力制约的游戏典型
这是Commanche受CPU处理能力约束的明证(该图表来自Tom''s Hardware)
小结:如果刨除驱动程序效率因素、显存带宽因素和CPU因素,在运行旧有的或者现有的没有使用或者很少量的使用了像素着色程序的3D游戏时,NV30在像素渲染能力上要比R300拥有不小的优势(~2 : 1)。更为严重的是,在运行采用了大量复杂像素着色程序的未来游戏,NV30与R300相比,差距还会拉大。强烈呼唤R350尽快出台,好赶上与NV30抗衡。 <
作为最新一代的GPU,R300和NV30自然还有提供了其他很多最新先进技术和优化设计方案。多数是对于以前的旧有技术进行改良增强,当然也提供了一些最新技术。限于篇幅,加上网上对R300的介绍文章汗牛充牍,笔者这里就不一一介绍了,仅仅对一些重点内容发表一些自己的总结性看法。
所谓技术特点,就是GPU为了提高执行效率,提供更好的图像质量,或者支持更多的功能或工业标准,而增加的一些技术和产品功能。
AGP8x:
对于128MB乃至250MB的NV30/R300来讲,如果面向消费类用户,这是重要性最低的技术之一。原因笔者专门有文章论述,这里就不多说了。
可以看出AGP8x与AGP4x模式下R300的3DMark2002成绩毫无区别
Z缓冲优化和交错式内存控制器
最早由ATi在R100中提出,R300已经发展到第三代,Hyper-Z III,除了原有的技术外,新增加了早期Z测试功能。交错式内存控制器技术是由nVIDIA在NV20中引入,R300也采用了这项技术
R300的交错式内存控制器
nVIDIA 将这两项技术统称为光速内存结构(LMA),NV30同样发展到了第三代LMAIII。值得一提的是,LMAIII也支持早期Z测试功能。
关于LMAIII的谣传很多,例如,LMAIII采用的极其复杂的早期Z-Culling算法效率惊人;全新的显存控制器结构极大地提高了数据访问效率,尽管笔者相信这些内容应该不是空穴来风,但却没有资料证明。因此,从现有的资料上来看,NV30暂时和R300平手。
大家都已经知道R300的显存控制器采用的是256bit位宽,然而NV30的传言令人迷惑。最早来自nvmax.com的说法声称NV30采用了与Parhelia 512和R300类似的256位宽显存控制器接口,不过最近来自谣言基地theInquirer.net的最新消息则称NV30仅仅采用了128位宽的显存接口。
理论上拥有16个纹理单元的NV30需要256位宽的接口,不过由于这16个纹理单元是共享的,所以可以大大缓解高图元填充率对显存带宽的压力。如果NV30采用了更加有效的设计,则128位宽再配上高速DDRII应该也能够满足需要。
至于NV30所能够采用的DDRII的运行频率,根据Samsung发布的消息,应该在800MHz~1GMHz之间,Samsung宣称可以在2002第三季度量产1GHz DDRII颗粒。NV30应该也会划分不同的运行频率的。
NV30采用了eDRAM的可能性几乎为零,因为总共才拥有120百万个晶体管,比R300不过多出了1千万个晶体管,比照NV30的设计复杂性,没有多余的空间供eDRAM使用。不过拥有比NV2x更大缓存的可能性还是很大的。<
全屏幕反锯齿(FSAA):
在消费类图形产品中,3dfx率先引入这项技术。在长期竞争中,ATi的产品一直处于劣势。不过,R300已经迎头干了上来,全面支持超级采样和多次采样方式,除了不支持混合采样方式外,已经全面超过了NV25,无论是在速度上,还是在质量上。
No FSAA – P512
6xFSAA – R300, 当前的最高FSAA质量
4xFSAA – NV25, 明显逊色于R300(圆盘、台阶、顶灯等)
16xFAA – P512, 明显存在问题(注意左侧的顶灯)
R300更支持真正的可编程采样模式,并且对于没有利用可编程采样模式的旧程序来讲,R300也提供了一组预定义采样模式集,应用中可以根据边的倾斜角度来自动选择最适合的预定义采样模式以实现最高反锯齿质量。
R300的6xFSAA(左)和R200的6xFSAA(右)对比,注意边缘采样模式的区别
R300还支持伽马校正。
R300 2xFSAA(左)和NV25 2xFSAA(右)对比,可以看出伽马校正的作用
R300号称解决了多次采样不能够处理透明纹理(Alpha Texture)边缘的问题。事实上,R300支持OpenGL透明处理屏蔽调用,该调用可以用来转换像素着色器输出达到反锯齿处理的效果。如果强制使用这种方法的话,有些旧游戏可能会出现问题,像Half Life,它们已经用这个功能在其他方面。现在ATi还没有在驱动程序内提供这个选项来强制实行这项功能。现在DirectX里面没有类似的功能,所以即使以后ATi提供了这项功能,也只能够作用到OpenGL的游戏上。
比较有意思的事,NV25提供了混合取样的4xS FSAA,可以解决透明纹理的问题,可是只能够在DirectX游戏中起作用,因为OpenGL 1.2/1.3不支持混合取样。而R300看来有可能解决MS FSAA透明纹理的问题,可是不但有局限,而且似乎只能够作用在OpenGL游戏中。看来,应该呼吁ATi在R300中同时提供超级采样供大家伙在必要的时候选用。
左侧(NoFSAA)右侧(6xFSAA) 当前R300还是不能处理透明纹理边缘
NV30如何呢?NV30这方面的消息还不完全。有网友透露,NV30提供种类繁多的采样方式:混合采样、超级采样和多次采样。不但支持NV2x的所有采样方式,而且还有全新的采样方式支持。下面是网友透露的NV30所支持的FSAA模式列表(笔者认为可行度还是较高的):
4X Mixedsampling (skewed grid, 8-tap filter) Quincunx with 1x2 OGSS4X Mixedsampling (skewed grid) *2x RGMS with 1x2 OGSS = 4xS
4X Multisampling (Gaussian) *2x2 OGMS with 9tap filter
4X Multisampling *2x2 OGMS
4X Supersampling (skewed grid, 8-tap filter) 2x RGSS with 5tap filter with 1x2 OGSS
4X Supersampling (skewed grid) 2x RGSS with 1x2 OGSS
4X Supersampling (Gaussian) 2x2 OGSS with 9tap filter
4X Supersampling **2x2 OGSS
4X Supersampling (LOD bias) **2x2 OGSS with LOD adjustment
2X Supersampling (Quincunx) 2x ?GSS with 5tap filter
2X Quincunx *2x RGMS with 5tap filter
2X Multisampling *2x RGMS
2X Supersampling (vertical) 1x2 OGSS
2X Supersampling (horizontal) **2x1 OGSS
* known modes for GF3/4
** known modes for GF1/2
说实话,NV30恢复超级采样方式并专门对其优化,绝对是个好消息。在前面第三部分我们已将看到,NV30的图元填充率完全能够胜任1600x1200分辨率下4X SS FSAA所需要的规格。而超级采样提供的优异图像纹理质量使得很多人对GeForce 2 GTS在超级采样方式下的纹理渲染质量念念不忘。
如果NV30在全屏幕反锯齿上全面超越了R300,则毫不令人意外,因为NV30与R300相比,拥有支持更多更好的全屏幕反锯齿方案的内功(Raw Power)。<
各向异性过滤(AF)是用来提高倾斜表面纹理渲染的非常好的方式。ATi R200在设计时就考虑了对AF的硬件支持,因此,R200在AF上与NV2x相比有十分靓丽的表现。如果说NV2x提供真正可用的4xFSAA,则R200就提供了真正可用的16x AF。不过,与NV2x提供的多次采样存在透明纹理暇砒一样,R200实现的AF也存在Z轴旋转表面算法不起作用的问题,同时也不能配合三线性过滤一起使用。R300号称完全解决了这些问题。
三线性过滤问题的解决得到了证实。
不过,最新得到的有关Z轴旋转表面的消息令人迷惑,有的网站测试宣称,该问题已经得到解决,并有详细测试和截图为证。
R200的16xAF效果
NV25的8x AF效果
R300 16x AF效果
而有的网站则宣称该问题没有解决,同样有截图为证。
Z轴旋转前的R300 AF效果
Z轴旋转后的R300的AF效果
笔者认为,根据R300的结构,理论上有能力完美的解决这一问题。
NV2x的AF实现不存在这个问题,可是它有自己的问题。由于在最初设计时没有考虑AF,因此打开AF后会出现图元填充率急剧下降的问题,似乎第二个纹理单元不能工作了,因为多纹理和单纹理图元填充率测试性能一样,都大大小于理论上的单纹理图元填充速率。
打开AF之后,图元填充率急剧降低,而且ST和MT时性能几乎一样
这个问题如果设计时考虑了的话,是可以解决的。因此我们有理由相信,NV30能够解决这个问题,给我们带来一个完美的解决方案。
ATi宣称同时打开AF和三线性过滤,性能几乎没有损失,实际测试证明,尽管对于AF质量模式有点夸大,但是做得相当不错了。
R300的AF实现确实效率很高,尤其是性能模式下,而NV25的性能下降惨不忍睹
NV30与R300在AF上的实现,孰优孰劣,只有等到了NV30出来且双方的驱动完善之后,才能得到最终结论。<
模板缓存:
R300和NV30都支持DX9新增的双面模板。这一特性简直就是针对DOOM3设计的,DOOM3大量使用了阴影容积算法来计算多光源下各种物体的阴影。在以前不支持双面模板的时候,单单完成一个光源下阴影容积的计算就需要两个流程(Pass),现在有了双面模板后,只需要一个流程就可以了。大大降低了对GPU几何吞吐量的压力并提高了效率。当然R300和NV30的这一特性,对于其他使用阴影容积算法的游戏同样帮助很大。
大量使用阴影容积技术的 Doom III呼唤NV30和R300
视频流和HDTV:
视频着色器(Video Shader)是R300一个非常巧妙的设计,利用自己强大的像素处理能力为提高视频流的显示质量和增加显示效果效力。很多网站都有不少的介绍,这里就不详细讨论了。
来自The Tech-Report的消息称, NV30也提供了类似功能,不过没有详细信息。
至于对于MPEG-2解码和HDTV格式的支持,笔者相信R300和NV30不会有本质区别。
显示格式:
NV30和R300都支持由Matrox引入DX9的最新显示格式10:10:10:2,不过需要DirectX 9支持。DX9发布之后,我们使用NV30或者R300也可以在CRT显示器上领略Matrox声称的亿兆颜色效果了。顺便说一句,DX9解决了长期困扰我们的Windows 2000和Windows XP下屏幕刷新率问题。
高级着色语言:
无论是NV30还是R300都支持DX9的高级着色语言(HLSL)。从前面对于NV30和R300的VS和PS进行的规格、寄存器和指令集的分析,我们可以明显看出,NV30对于高级着色语言的支持要比R300好得多。然而,由于DX9VS2.0和DX9PS2.0规范是对R300量身定做的,所以NV30超出规范的部分在DX9VS3.0和DX9PS3.0没有真正出台之前实际上是利用不上的。其实就是DX9VS3.0和DX9PS3.0出台,也不能够完全发挥NV30的威力。
真正能够充分发挥NV30威力的高级着色语言是Cg,再配合上OpenGL 1.4或以后将要发布的OpenGL1.5。Cg能够完全兼容DX9HLSL,并且可以同时支持OpenGL 1.4。
因此,对于采用DX9HLSL开发的面向DX9的游戏,NV30与R300相比,优势并不明显。然而,对于采用Cg开发的面向OpenGL 1.4的游戏,NV30与R300相比,可能存在较大优势。
根据nVIDIA当前的能量,Cg成功的机会还是很大的。如果Cg成功了,ATi几乎肯定会专门针对自己的硬件平台开发Cg编译器的。
高级着色语言的重要性怎么强调都不过分,对于最新一代GPU来讲,性能战役已经开始向芯片的编译器质量战场上转移,就像CPU一样。RenderMonkey工具集就是缺乏自己高级着色语言的ATi对这一挑战的反应。
整体来讲,NV30在高级着色语言支持上领先R300不少。<
总体规格对比:
我们先来看看ATi和nVIDIA是如何在其技术白皮书中称赞自己的GPU的:
ATi: RADEON 9700是有史以来制造的较高级的图形处理器。拥有1亿7百万颗晶体管的它采用了全新的体系结构,其设计体现了高带宽(256bit显存接口)、高并行性(最多可以并联256个R300 GPU)、高效、高精度和高可编程性五高概念。这一新结构的性能十分惊人,在任何方面都要比当前市场上同类产品的性能高出一倍以上。
nVIDIA:“CineFX” (NV30) 体系结构在配合了高级的Cg编程语言后,使得融合实时渲染和电影般质量渲染的梦想向前跨进了一大步。在实时渲染领域这一里程碑式的进步主要归功于以下关键因素:高级可编程性、高精度颜色、高级着色语言、高效的体系结构和与系统内存和CPU间的高带宽。
厂商在评价自己的产品时,当然是只说好听的,不过毕竟是自家的孩子,最容易搔到痒处。这里我们列一个表格比较一下他们之间说法,并给与简评,重点观察不同点,注意用词区别(很有意思):
ATi和nVIDIA共同强调了可编程性、带宽、效率和精度问题,重复率80%,看来英雄所见略同。
作为总结,我们这里给出R300、R200、NV30(笔者推测)和NV25的总体规格对比表,供参考。
从这张表上我们就可以大致估计出NV30、R300、NV25和R200之间的性能差距,如果忽略CPU处理能力因素和驱动程序质量因素:
1、NV25整体性能好于R200,大约5%~50%。NV25与R200相比,在几何造型复杂或对显存带宽敏感的游戏有较大优势。
2、R300整体性能好于NV25,大约10%~100%。类似,R300在几何造型复杂或对显存带宽敏感的游戏比NV25有较大优势。什么?现在没有这种游戏?!那就提高分辨率,开启FSAA和AF,呵呵,这不就有了嘛!此外,在大量使用顶点着色程序和像素着色程序的游戏里,R300也要比NV25有优势。这类着色程序越复杂,R300的优势也就越明显。
3、预测:修改为“NV30整体性能好于R300,大约-20%~50%(128bit 显存控制器)或-10%~100%(256bit显存控制器)。种种迹象表明,NV30采用128位接口的可能性大于256为接口。其实NV30与R300相比,其优势与R300比之NV25的优势几乎一样。从理论上讲,这里面可以排除了几何造型复杂的情况。不过如果NV30拥有一个十分强劲的三角形建立引擎和更加优秀的驱动程序支持,则很可能实测几何吞吐量反倒超出R300。运行未来的、大量使用复杂着色程序的游戏,NV30和R300的差距会拉大。
简单来讲,与R300相比,NV30更高级的VS和PS体系结构优势在于:使得一些R300需要多次渲染流程才能完成的效果在NV30上只需要一个渲染流程就可以完成;而NV30一个复杂的着色程序可以完成的效果,R300可能需要多个着色程序或者多次渲染流程才能完成。这样NV30的结构不但可以提高程序执行效率,降低显存带宽需求,而且还可以帮助CG程序员提高程序编写效率。此外,NV30也更加适合专业渲染平台。借助于Cg+OpenGL 1.4/1.5, NV30GL的成功是可以预期的。
显然nVIDIA倾向于认为对于未来的游戏来讲,着色程序的执行效率将取代显存带宽而成为3D实时渲染的最大性能瓶颈。可以这么说,NV30兼顾了未来3D程序和当前3D程序的执行效率,而R300则更多地考虑了当前3D程序的执行效率。
这里,笔者大胆预言,在运行为上一代GPU开发的游戏时,不运行在1600x1200 4xFSAA 16xAF条件下,对NV30来讲简直是一种浪费。也只有这种运行条件性,NV30与R300的性能差距才能够显现出来。最后提一句,不要为NV30/R300配备2.8GHz以下频率CPU和512MB以下的DDR或RAMBUS。还有吗?不要忘记将BIOS里面的AGP Aperture设置为256MB,如果你拥有512MB以上的系统内存的话。
NV30和R300的关系,与两年前Radeon 和 GeForce 2 GTS颇有类似之处。当时流行的说法是GeForce 2 GTS拥有更强大的马力,而Radeon拥有更灵巧的设计。这一次,似乎ATi和nVIDIA的角色颠倒了过来,R300似乎拥有更强大的马力(4VS以及可能更高的显存带宽),而NV30则拥有更灵巧的设计,历史就是这么有意思。
购买建议:
关键在于用户自己的定位,简单来说:
如果资金不在话下,希望现在就能够得到一块速度最快,图像质量最好的游戏卡,那么不用犹豫,已经上市的R300就是你的不二选择。
如果资金较为充足,想购买一块能够玩遍所有当前游戏,又可以很好的跑很快上市的DOOM III,则R300同样是你啊的最好选择。
如果资金有限,想购买一块生命力较为长久的显示卡。嗯,那么我建议还是耐心等一等。NV30对于未来新游戏的支持应该要比R300好不少,因此相对生命力应该长一些。
如果资金根本不够,只能在显卡换代的时候购买上一代的产品,那么我还是建议像我一样,耐心等待NV40上市时,咱们再一起购买NV30,哈哈。
由于NV30进度严重滞后,R300获得了非常宝贵的时间优势。ATi清楚地知道NV30的威力,所以一直在马不停蹄的开发R300的换代产品:R350。NV30 vs R350应该是一场更加势均力敌的比赛。作为Tech Fan的笔者非常期望早日见到这一天。
未来——从更多的像素到更聪明的像素:
展望未来,笔者觉得nVIDIA的首席科学家David Kirk去年说的一段话非常有道理:在最近的3到5年间,最大的成就将不在于像素填充率本身(当然,它们会继续提高),而是在于这些像素的“智慧”(质量)上。David认为我们将会看到远比现在高级的可编程的每像素着色和光照算法,这些算法将考虑到素材的属性和弯曲的表面,使用海量纹理,以及拥有极度复杂的单流程纹理混合能力。他将这称为战场的转移:“从更多的像素到更聪明的像素”。果不其然,今年,NV30和R300已经朝这个方向迈进了一大步。
哇!多么精彩的未来世界!活在21世纪,作为一个Tech Fan真幸福!
最后,水平有限,时间仓促,资料不全,因此错误难免(绝对实话)!欢迎批评指正!
注意:作者尽管进了最大的努力来保证文章内容的真确性,但是不要对本文内容太过认真。因为这仅仅是真实的DX9显卡和纸张显卡之间的技术预测,作者不希望在PCPOP的论坛上跳起一场口水战争。更加权威和翔实的英文版内容不日将在以严谨而著称的Beyond3D.COM发表,Beyond3D.COM拥有一个非常著名且点击率非常高的3D技术论坛(与PCPOP不同的是只有技术信息:-) )。际时,将在这里提供有关的连接,以飨同好的Tech Fans。<