摘自gpu编程之阳春白雪与下里巴人。

在实时计算机图形学一书中,将图形绘制管线分为三个主要阶段,应用程序阶段,几何阶段,光栅阶段。

应用程序阶段,使用高级编程语言进行开发,主要和cpu内存打交道。诸如碰撞检测,场景图建立。空间八叉数更新。

视锥裁剪等经典算法都在此阶段执行。在该阶段的末端。几何体数据

几何体数据(顶点坐标、法向量、
纹理坐标、纹理等)通过数据总线传送到图形硬件(时间瓶颈) ;数据总线是一
个可以共享的通道,用于在多个设备之间传送数据;端口是在两个设备之间传送
数据的通道;带宽用来描述端口或者总线上的吞吐量,可以用每秒字节(b/s)
来度量,数据总线和端口(如加速图形端口,Accelerated Graphic Port,AGP)将
不同的功能模块“粘接”在一起。由于端口和数据总线均具有数据传输能力,因此
通常也将端口认为是数据总线(实时计算机图形学387 页) 。
几何阶段,主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射(实时
计算机图形学 234 页) ,该阶段基于 GPU进行运算,在该阶段的末端得到了经过
变换和投影之后的顶点坐标、颜色、以及纹理坐标(实时计算机图形学10 页) 。
光栅阶段,基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制
完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲
器(color buffer 或者 frame buffer)中。
值得注意的是:光照计算属于几何阶段,因为光照计算涉及视点、光源和物
体的世界坐标,所以通常放在世界坐标系中进行计算;而雾化以及涉及物体透明
度的计算属于光栅化阶段,因为上述两种计算都需要深度值信息(Z值) ,而深 22
度值是在几何阶段中计算,并传递到光栅阶段的。
下面具体阐述从几何阶段到光栅化阶段的详细流程。
2.1 几何阶段
几何阶段的主要工作是“变换三维顶点坐标”和“光照计算”,显卡信息中通常
会有一个标示为“T&L”硬件部分,所谓“T&L”即 Transform & Lighting。那么为什
么要对三维顶点进行坐标空间变换?或者说, 对三维顶点进行坐标空间变换有什
么用?为了解释这个问题,我先引用一段文献【3】中的一段叙述:
Because, your application supplies the geometric data as a collection of vertices,
but the resulting image typically represents what an observer or camera would see
from a particular vantage point.
As the geometric data flows through the pipeline, the GPU’s vertex processor
transforms the continuant vertices into one or more different coordinate system, each
of which serves a particular purpose. CG vertex programs provide a way for you to
program these transformations yourself.
上述英文意思是:输入到计算机中的是一系列三维坐标点,但是我们最终需
要看到的是,从视点出发观察到的特定点(这句话可以这样理解,三维坐标点,
要使之显示在二维的屏幕上) 。一般情况下,GPU帮我们自动完成了这个转换。
基于 GPU 的顶点程序为开发人员提供了控制顶点坐标空间转换的方法。
一定要牢记,显示屏是二维的,GPU所需要做的是将三维的数据,绘制到
二维屏幕上,并到达“跃然纸面”的效果。顶点变换中的每个过程都是为了这个目
的而存在, 为了让二维的画面看起具有三维立体感, 为了让二维的画面看起来“跃
然纸面”。
根据顶点坐标变换的先后顺序, 主要有如下几个坐标空间, 或者说坐标类型:
Object space,模型坐标空间;World space,世界坐标系空间;Eye space,观察坐
标空间;Clip and Project space,屏幕坐标空间。图 3 表述了 GPU的整个处理流
程,其中茶色区域所展示的就是顶点坐标空间的变换流程。大家从中只需得到一
个大概的流程顺序即可,下面将详细阐述空间变换的每个独立阶段。 23

图 3 GPU处理流程