坐标系 Coordinate Systems#
上一章我们学习了如何利用变换矩阵来变换所有顶点,从而更好地使用矩阵。OpenGL 要求所有我们希望可见的顶点在每次顶点着色器运行后都处于归一化设备坐标系中。也就是说,每个顶点的 x 、 y 和 z 坐标应该介于 -1.0 和 1.0 之间;超出此范围的坐标将不可见。通常的做法是,我们指定一个自定义范围(或空间)内的坐标,然后在顶点着色器中将这些坐标变换为归一化设备坐标 (NDC)。之后,这些 NDC 坐标会被传递给光栅化器,由光栅化器将其转换为屏幕上的二维坐标/像素。
顶点着色器:处理的是“点”(数学上的位置)。 光栅化器:把“点”连接成“面”,并把这个“面”切碎成一个个对应屏幕像素的“小方块”(片段)。
确定哪些像素属于这个图形片段着色器:给这些被选中的“小方块”涂上最终的颜色。
将坐标系转换为 NDC 坐标系通常是分步进行的,即先将对象的顶点转换到多个坐标系,最后再转换到 NDC 坐标 系。这样做的好处是,某些操作/计算在某些坐标系中更容易进行,这一点很快就会显现出来。总共有 5 个对我们来说比较重要的坐标系:
- 局部空间(或对象空间)
Local Space,也称物体空间 - 世界空间
World Space,乘以 Model Matrix (模型矩阵)后得到。把所有物体放到同一个大地图里,有了各自的相对位置 - 视野空间(或眼睛空间)
乘以 View Matrix (观察矩阵)后得到。状态: 以摄像机为原点(0,0,0),看所有物体在哪里。类比: 摄影师扛起摄像机对准桌子。现在的坐标不再是“距离片场中心多远”,而是“距离镜头多远、在镜头画面的左边还是右边” - 裁剪空间
乘以 Projection Matrix (投影矩阵)后得到。状态: 决定哪些东西在镜头里,哪些在镜头外。类比: 摄影师决定用“广角镜头”还是“长焦镜头”。在这个空间里,超出镜头范围的物体(比如演员伸到画面外的手)会被直接剪掉。透视除法也发生在这个阶段之后。 - 屏幕空间
Viewport Transform (视口变换)。状态: 将坐标映射到显示器的实际像素(如 )。类比: 电影最后投映在电影院的银幕上。原本的比例坐标变成了具体的像素点位置
这些都是顶点在最终变成片段之前会经历的不同状态。
你现在可能对空间或坐标系究竟是什么感到很困惑,所以我们首先会以更宏观的方式解释它们,展示整体情况以及每个特定空间所代表的含义。
全球概况 The global picture#
为了将坐标从一个空间转换到另一个坐标空间,我们将使用几个变换矩阵,其中最重要的包括==模型矩阵、视图矩阵和投影矩阵。我们的顶点坐标首先在局部空间中作为局部坐标出现,然后进一步转换为*世界坐标 World Coordinates 、视图坐标 View Coordinates) 、裁剪坐标 Clip Coordinates ,最终转换为屏幕坐标 Screen Coordinates *==。下图展示了这一过程,并说明了每个变换的作用:





