王者之间的较量,R300 VS NV30深度
像素着色器(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在寄存器规格上各有所长,优劣读者自己判断吧。<