第五章 视口变换、剪切与反馈
5.1 观察视图
- 将三维空间的模型投影到二维的关键方法,就是齐次坐标的应用、矩阵乘法的线性变换方法,以及视口映射
5.1.1 视图模型
5.1.2 相机模型
-
视图变换的操作可以类比为使用照相机拍摄照片的过程:
- 将相机移动到准备拍摄的位置,将它对准某个方向(视图变换,view transform)
- 将准备拍摄的对象移动到场景中必要的位置上(模型变换,model transform)
- 设置相机的焦距,或者调整缩放比例(投影变换,projection transform)
- 拍摄照片(应用变换结果)
- 对结果图像进行拉伸或挤压,将它变换到需要的图片大小(视口变换,viewport transform)
-
值得注意的是,可以认为上边的第1步和第2步做的是同一件事情,只不过方向相反而已。因此,通常将这两个步骤合并为一个模型-视图变换(model-view transform)。然而,这一过程将总包含多级平移、旋转和缩放操作。而这一合并过程中的主要特征,就是构建一个独立的、统一的空间系统,将场景中所有的物体都变换到视图空间,或者人眼空间当中
-
我们传递给OpenGL的坐标因该是已经完成模型视图变换和投影变换的。我们还需要告诉OpenGL如何完成视口变换
-
OpenGL整个处理过程中用到的坐标系统:
-
上图所示的过程中,最后一步是设置OpenGL的视口和深度范围。OpenGL得到的最终坐标是归一化之后的齐次坐标,并且将进行剪切和光栅化的操作。也就是说,最后要绘制的坐标总是在[-1.0, 1.0]的范围内,知道OpenGL对它们进行缩放以匹配视口大小为止
-
上图中用户变换的解释:
视锥体
- 平截锥体 frustum
视锥体的剪切
- 应用程序需要告诉OpenGL当前视锥体的参数值,而着色器将负责变换的应用过程;OpenGL将通过这些参数来完成剪切的操作;着色器中也可以使用用户自定义的平面来进行剪切
5.1.3 正交视图模型
5.2 用户变换
- 渲染管线各阶段中,对于三维坐标的变换情况:
5.2.1 矩阵乘法的回顾
- 矩阵乘法的定义:(一个4x4的矩阵与一个4维向量的乘法,得到一个新的4维向量)
- 对于视图模型来说,我们需要对一个向量进行多次变换,这一过程可以通过矩阵A和矩阵B的乘法来表达:
- 矩阵的乘法不可交换,即AB!=BA
- 矩阵的乘法符合结合律,即C(BA)=(CB)A=CBA
5.2.2 齐次坐标
- 将三维的笛卡尔坐标转换为四维的齐次坐标,有两个主要的好处:
- 可以进一步完成透视变换
- 可以使用线性变换来实现模型的平移
也就是说,如果使用四维坐标系统,就可以通过矩阵乘法完成所有的旋转、平移、缩放和投影变换操作
投影变换是透视效果实现的关键步骤,也是我们必须在着色器中实现的一个步骤
进阶:什么是齐次坐标
-
三维数据可以通过3维向量与3x3矩阵的乘法操作,来完成缩放和旋转的线性变换。但是对3维笛卡尔坐标的平移是无法通过3x3矩阵的乘法操作来完成的
-
只要将三维数据置入