无关性着色匹配和纹理操作
纹理的定址、拾取和过滤会占用很多GPU时钟周期。如果一个架构需要纹理在进行细节着色处理的匹配之前就进行取出和过滤操作,那么这种操作将会大大的拖慢GPU的速度,典型的例子是16x的各向异性过滤。而Geforce 8800 GPU则可以通过独立并发执行大量匹配操作在本质上“隐藏”纹理拾取延迟。
如上图所示。Geforce 7系列的纹理地址计算和浮点匹配操作是在管线内相互交替进行的,在管线数目有限的前提下必然存在明显的瓶颈;而Geforce 8800则拥有无关性着色能力,纹理地址计算和浮点匹配操作根据情况可以在某些情况下同时进行,这种方式大大的提升了管线执行效率。
分支效率的提升
GPU处理复杂的DirectX 10着色工作的性能的一个重要方面是分支效率。Geforce 7在处理典型的DirectX 9着色时效率不佳。当像素着色代码中出现一个“IF-THEN-ELSE”基本指令的时候,一批多达880个的像素将被立即处理;这其中的一部分因为需要进行像素着色操作而转入“THEN”路径,而其他的像素则沿着同样的路径继续运行,但是没有进行任何处理;然后整批像素又转入“ELSE”路径,相反的情况发生了,另一部分像素对“ELSE”后的代码有所响应。在DirectX 10着色架构的Geforce 8800方面,编程者将愉快的面对16个、最坏情况也只有32个的一批像素去进行基本操作,分支效率显然会得到大幅度提升,相对于
ATI的Radeon X1900系列的每批48个像素进行分支,这一部分已经不再是NVIDIA的软肋。
先期Z轴比较检查
现代GPU使用Z-buffer技术控制输出图像中的像素哪些能被我们的眼睛看到,哪些是因为被其他像素挡住而不显示的,每一个像素都在Z-buffer中有自己对应的Z轴信息。同常单个的3D桢会被转化成2D图像进行输出,这个桢由主机输出给GPU的顶点流构成基本结构,多边形的组建和像素的渲染则在GPU中完成。这些多边形在同一桢中存在着深度复杂的现象,可能互相遮掩重叠,甚至多达三至四层,而只有逻辑上排列在最外一层的多边形上的像素对于用户是可视的,被外层多边形覆盖的其他多边形的对应部分是看不到的。
现在有一些方法来筛选出那些被逻辑上遮挡住部分,使它们免去渲染步骤来提高GPU效率,Z-cull就是一种很快速的在管线进入光栅华操作前剔除被遮挡像素的方式。在执行这类操作的时候Geforce 8800 GTX的能力是Geforce 7900 GTX的四倍,但没有一种GPU能够完全找出那些不需要被渲染得像素,100%的高效率还不存在。在管线进入光栅化操作之前进行像素Z轴信息比较事实上已经稍晚,因为此时进行检查的像素已经经过像素管线前面的很多步骤处理,GPU已经作了大量的工作。Z轴信息的检查能否提前到像素被输入到管线之前进行呢?
Geforce 8800 GPU就能够支持这样的操作,这正是其Z轴处理大大优于前代产品的原因,正如图中所示,Geforce 8800 GPU的像素管线之前就存在着Z-cull逻辑,被称作先期Z轴比较检查(Z-cull Early-Z)。