应用程序阶段输入到计算机中的是一系列三维坐标点,一般情况下,几何阶段GPU自动将三维坐标经过顶点坐标变换转换到二维屏幕上。这些顶点坐标变换,可以由开发人员进行控制。
根据顶点坐标变换的先后顺序,主要有如下几个坐标空间,或者说坐标类型:Object space,模型坐标空间;World space,世界坐标系空间;Eye space,观察坐标空间;Clip and Project space,屏幕坐标空间。下图表述了GPU 的整个处理流程,其中茶色区域所展示的就是顶点坐标空间的变换流程。
注: 1 模型空间坐标与其他物体没有任何参照关系,它是将object space coordinate 和world space coordinate 区分开来的关键。无论在现实世界,还是在计算机的虚拟空间中,物体都必须和一个固定的坐标原点进行参照才能确定自己所在的位置,这是world space coordinate的实际意义所在。我们将一个模型导入计算机后,就应该给它一个相对于坐标原点的位置,那么这个位置就是world space coordinate,从object space coordinate 到world space coordinate 的变换过程由一个四阶矩阵控制,通常称之为worldmatrix。
2 顶点法向量在模型文件中属于object space,在GPU 的顶点程序中必须将法向量转换到world space 中才能使用,如同必须将顶点坐标从object space 转换到world space 中一样,但两者的转换矩阵是不同的,准确的说,法向量从object space 到world space 的转换矩阵是world matrix 的转置矩阵的逆矩阵。
3 eye space,即以camera(视点或相机)为原点,由视线方向、视角和远近平面,共同组成一个梯形体的三维空间,称之为viewing frustum(视锥)。近平面,是梯形体较小的矩形面,作为投影平面,远平面是梯形体较大的矩形,在这个梯形体中的所有顶点数据是可见的,而超出这个梯形体之外的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。
4 视点坐标空间到屏幕坐标空间screen coordinate space)事实上是由三步组成:用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV(用于裁剪的规范立方体) 中,即把顶点从viewing frustum 变换到CVV 中,这个过程才是我们常说或者听说的“投影”;再在 CVV 进行图元裁剪;最后进行屏幕映射,就是将经过前述过程得到的坐标映射到屏幕坐标系上。其中确定只有当图元完全或部分的存在于视锥内部时,才需要将其光栅化。当一个图元完全位于视体(此时视体以及变换为CVV)内部时,它可以直接进入下一个阶段;完全在视体外部的图元,将被剔除;对于部分位于视体内的图元进行裁减处理。
三、光栅化阶段(Rasterization)