几何阶段
主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于 GPU 进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标
光照计算属于几何阶段,因为光照计算涉及视点、光源和物体的世界坐标,所以通常放在世界坐标系中进行计算;
从 object space 到 world space
将一个与其他物体没有任何参照关系的转移到一个统一的世界坐标中,这样参照才能进行确定自己的位置。
光照计算通常是在 world coordinate space(世界坐标空间)中进行的。
从 object space coordinate
到world space coordinate
的变换过程,称之为World Matrix
矩阵
顶点法向量在模型文件中属于 object space,在 GPU 的顶点程序中必须将法向量转换到 world space 中才能使用。法向量从 object space 到world space 的转换矩阵是 world matrix 的转置矩阵的逆矩阵。
从 world space 到 eye space
eye space
,即以 camera(视点或相机)为原点,由视线方向、视角和远近平面,共同组成一个梯形体的三维空间,称之为 viewing frustum
(视锥)。
从 eye space 到 project and clip space
在这个viewing frustum
中的所有顶点数据是可见的,而超出这个梯形体之外的场景数据,会被视点去除( Frustum Culling
,也称之为视锥裁剪)。
很多人在理解该步骤时存在一个混乱,即“不清楚裁减与投影的关系和两者发生的先后顺序”,不少人觉得是“先裁减再投影”,不过事实并非如此。因为在不规则的体( viewing frustum)中进行裁剪并非易事,所以经过图形学前辈们的精心分析,裁剪被安排到一个单位立方体中进行,该立方体的对角顶点分别是(-1,-1,-1)和(1,1,1),通常称这个单位立方体为规范立方体( Canonical view volume,CVV)
从视点坐标空间到屏幕坐标空间( screen coordinate space)事实上是由三步组成:
1. 用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV 中;
2. 在 CVV 进行图元裁剪;
3. 屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上
透视投影变换推导可参见潘宏(Twinsen)的透视投影变换推导一文
Primitive Assembly && Triangle setup
Primitive Assembly
(图元装配),即将顶点根据 primitive(原始的连接关系),还原出网格结构。网格由顶点和索引组成,在之前的流水线中是对顶点的处理,在这个阶段是根据索引将顶点链接在一起,组成线、面单元。之后就是对超出屏幕外的三角形进行裁剪。 Back-face Culling
(背面剔除操作)根据三角形的顶点顺序判断背面并进行剔除操作。
实际裁减是一个较大的概念,为了减少需要绘制的顶点个数,而识别指定区域内或区域外的图形部分的算法都称之为裁减。裁减算法主要包括:视域剔除( View Frustum Culling)、背面剔除( Back-Face Culling)、遮挡剔除( Occlusing Culling)和视口裁减等
处理三角形的过程被称为 Triangle Setup。到目前位置,我们得到了一堆在屏幕坐标上的三角面片,这些面片是用于做光栅化的(Rasterizing)。
光栅阶段
基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器( color buffer 或者 frame buffer)中。
雾化以及涉及物体透明度的计算属于光栅化阶段,因为上述两种计算都需要深度值信息( Z 值),而深度值是在几何阶段中计算,并传递到光栅阶段的。
Rasterization
光栅化:决定哪些像素被集合图元覆盖的过程( Rasterization is the process of
determining the set of pixels covered by a geometric primitive)。
主要解决两个问题:
1. 通过点的屏幕坐标(浮点数)确定屏幕的像素坐标(整数)
2. 通过两个确定的点绘制线段
通常的画线算法有 DDA 算法、 Bresenham 画线算法;区域图元填充算法有扫描线多边形填充算法、边界填充算法等
Pixel Operation
Pixel operation 又称为 Raster Operation,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的是:计算出每个像素的颜色值。在这个阶段,被遮挡面通过一个被称为深度测试的过程而消除。
主要做了这么几件事:
1. 消除遮挡面
2. Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的纹理值;
3. Blending混色,根据目前已经画好的颜色,与正在计算的颜色的透明度( Alpha),
混合为两种颜色,作为新的颜色输出。通常称之为 alpha 混合技术。
4. Filtering,将正在算的颜色经过某种 Filtering(滤波或者滤镜)后输出。可以理解为:经过一种数学运算后变成新的颜色值
经过以上流水线最终得到帧缓冲(Frame Buffer
)
参考文献:
[1] gpu编程与cg 语言之阳春白雪下里巴人
[2] The Cg Tutorial