王者之间的较量,R300 VS NV30深度
顶点着色器(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在整体规格上取得来胜利,理论上可以实现更强大和效果更好的顶点着色程序。为什么这么说呢?我们来继续分析,就可以更清楚地看明白这一点了。<