GPU 渲染管线分为两种,一种是原始的固定管线,另一种是现在常用的可编程管线。
渲染流程
1.在顶点着色器中,空间点由相机空间(camera space)变换到裁剪空间(clip space)。这个过程首先将顶点变为齐次坐标,然后乘以透视投影矩阵。需要注意的是,此时还没有进行标准化,即转化后的顶点各分量没有除以 $P_{S_w}$ 。
2.当所有顶点都经过顶点着色器处理后,不在裁剪空间中的图元将被舍弃,部分处于裁剪空间中的图元将被裁剪。需要注意的是,这个时候由于还没有进行标准化,因此裁剪空间并不是 $[-1, -1, -1]$ 和 $[1, 1, 1]$ 定义的固定的立方体空间,而是每个顶点都有一个自己的裁剪空间。常用的裁剪算法有 Cohen-Sutherland 和 Sutherland-Hodgman 算法。
3.裁剪过程结束后,所有的顶点都将进行标准化,每个顶点的 $x$,$y$,$z$ 坐标都要除以各自的 $w$ 分量。这一步也叫做 perspective divide。
固定管线
在固定管线下,OpenGL 以及其它图形 API(e.g. Direct3D) 提供了两种模式来修改相机的状态,GL_MODELVIEW 以及 GL_PROJECTION。在 GL_MODELVIEW 模式下设置 objection-to-world 以及 world-to-camera 的转换矩阵,将顶点转换到相机坐标系下;在 GL_PROJECTION 模式下通过 glFrustum 设置透视投影矩阵,将顶点转换到裁剪空间下其次坐标形式。
实例
1 | glMatrixMode (GL_PROJECTION); |
固定管线现已被弃用。
可编程管线
可编程管线和固定管线的区别在于,舍弃了 GL_MODELVIEW 和 GL_PROJECTION 的概念,要求开发者在顶点着色器中自定义顶点的变换,即自己实现 world-to-camera 和 透视投影矩阵。OpenGL 要求程序中必须有顶点着色器和片段着色器的实现。
顶点着色器实例
1 | uniform mat4 worldToCamMatrix, projMatrix; |
参考链接
Scratchapixel-About the Projection Matrix, the GPU Rendering Pipeline and Clipping