光栅化渲染-7-渲染管线

  GPU 渲染管线分为两种,一种是原始的固定管线,另一种是现在常用的可编程管线。

渲染流程

  1.在顶点着色器中,空间点由相机空间(camera space)变换到裁剪空间(clip space)。这个过程首先将顶点变为齐次坐标,然后乘以透视投影矩阵。需要注意的是,此时还没有进行标准化,即转化后的顶点各分量没有除以 $P_{S_w}$ 。
  2.当所有顶点都经过顶点着色器处理后,不在裁剪空间中的图元将被舍弃,部分处于裁剪空间中的图元将被裁剪。需要注意的是,这个时候由于还没有进行标准化,因此裁剪空间并不是 $[-1, -1, -1]$ 和 $[1, 1, 1]$ 定义的固定的立方体空间,而是每个顶点都有一个自己的裁剪空间。常用的裁剪算法有 Cohen-SutherlandSutherland-Hodgman 算法。
  3.裁剪过程结束后,所有的顶点都将进行标准化,每个顶点的 $x$,$y$,$z$ 坐标都要除以各自的 $w$ 分量。这一步也叫做 perspective divide

figure 1

Figure 1

固定管线

  在固定管线下,OpenGL 以及其它图形 API(e.g. Direct3D) 提供了两种模式来修改相机的状态,GL_MODELVIEW 以及 GL_PROJECTION。在 GL_MODELVIEW 模式下设置 objection-to-world 以及 world-to-camera 的转换矩阵,将顶点转换到相机坐标系下;在 GL_PROJECTION 模式下通过 glFrustum 设置透视投影矩阵,将顶点转换到裁剪空间下其次坐标形式。

实例

1
2
3
4
5
6
7
glMatrixMode (GL_PROJECTION); 
glLoadIdentity();
glFrustum(l, r, b, t, n, f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate(0, 0, 10);
...

  固定管线现已被弃用。

可编程管线

  可编程管线和固定管线的区别在于,舍弃了 GL_MODELVIEW 和 GL_PROJECTION 的概念,要求开发者在顶点着色器中自定义顶点的变换,即自己实现 world-to-camera 和 透视投影矩阵。OpenGL 要求程序中必须有顶点着色器和片段着色器的实现。

顶点着色器实例

1
2
3
4
5
6
7
uniform mat4 worldToCamMatrix, projMatrix; 
in vec3 vert;

void main()
{
gl_Position = projMatrix * worldToCamMatrix * vec4(vert, 1);
}

参考链接

Scratchapixel-About the Projection Matrix, the GPU Rendering Pipeline and Clipping