完美DX10!ATI新王者HD2900XT权威评测
● 第二章 统一渲染架构详细解析
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上。