OpenGL的绘制流水线模型:
顶点--顶点处理模块--裁剪模块和图元组装模块--光栅化模块--片元处理模块--像素
这个过程中涉及的坐标系有:
1、对象坐标系或者建模坐标系
2、世界坐标系
3、眼坐标系或者照相机坐标系
4、裁剪坐标系
5、规范化的设备坐标系
6、窗口坐标系或者屏幕坐标系。
1.对于小型的单个实体程序,对象坐标系或者建模坐标系与世界坐标系是相同的,对象标架是对象自身的标架,在这个标架下可以方便地描述对象的大小、位置和方向。
2、一个应用程序可能包含成百上千个单独对象,我们必须把它们放到一个公共场景里,应用程序通常对每个对象实施一系列变换,这些变换可以改变它们的大小、方向和位置,从而使它们处于一个适合于该特定应用程序的标架中,这个标架就是世界坐标系。
3、对于应用程序来说,对象标架和世界标架是很自然的标架,然而生成的图像依赖于照相机或者观察者所能看到的内容。几乎所有的图形系统都使用一个标架,该标架原点位于照相机透镜的中心,并且坐标轴平行于照相机的侧面,这就是照相机标架,也可以称为眼标架,因为每个标架变换都对应一个仿射变换,所以从模型坐标系到世界坐标系(模型变换)以及从世界坐标系到眼坐标系(视图变换)都可以用4*4的矩阵来表示。OpenGL把这些变换合并为模-视变换,对应的矩阵为模-视变换矩阵(这里通常用一个模-视变换矩阵来代替两个变换矩阵)。
4、把对象变换到眼坐标系之后,OpenGL就要检查它们是否处于视见体内。如果一个对象位于视见体外,那么就在光栅化之前把它从场景里剪裁掉。为了进行更有效的剪裁,OpenGL先进行投影变换,这个变换把所有可能是可见的对象变换到一个立方体中,该立方体的中心是剪裁坐标系的原点。
5、在投影变换之后,顶点的表示仍然是齐次坐标,顶点的坐标表示再经过透视除法,即用w分量去除其他分量,就得到了在规范化的设备坐标系下的三维表示。
6、根据视口提供的信息,把规范化的设备坐标系下的表示变换为窗口坐标系下的三维表示,窗口坐标是用显示器上的像素来度量的,但仍保留了深度信息。如果去掉了深度信息,就得到了二维屏幕的坐标。
摘自:《交互式计算机图形学-基于OpenGl的自顶向下方法》Edward Angel