概述
局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标。
下一步是将局部坐标变换为世界空间坐标,世界空间坐标是处于一个更大的空间范围的。这些坐标相对于世界的全局原点,它们会和其它物体一起相对于世界的原点进行摆放。
接下来我们将世界坐标变换为观察空间坐标,使得每个坐标都是从摄像机或者说观察者的角度进行观察的。
坐标到达观察空间之后,我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上。
最后,我们将裁剪坐标变换为屏幕坐标,我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器,将其转化为片段。
右手坐标系(Right-handed System)
按照惯例,OpenGL是一个右手坐标系。简单来说,就是正x轴在你的右手边,正y轴朝上,而正z轴是朝向后方的。想象你的屏幕处于三个轴的中心,则正z轴穿过你的屏幕朝向你。坐标系画起来如下:
为了理解为什么被称为右手坐标系,按如下的步骤做:
沿着正y轴方向伸出你的右臂,手指着上方。
大拇指指向右方。
食指指向上方。
中指向下弯曲90度。
如果你的动作正确,那么你的大拇指指向正x轴方向,食指指向正y轴方向,中指指向正z轴方向。如果你用左臂来做这些动作,你会发现z轴的方向是相反的。这个叫做左手坐标系,它被DirectX广泛地使用。注意在标准化设备坐标系中OpenGL实际上使用的是左手坐标系(投影矩阵交换了左右手)。
Z缓冲区
当绘制多个有重叠的三角形时,若不考虑绘制顺序,必然导致成像出现问题。因此引入深度缓冲区,当片段输出它的颜色时,OpenGL会将它的深度值和z缓冲进行比较,然后如果当前的片段在其它片段之后它将会被丢弃,然后重写,这个过程称为深度测试(Depth Testing)。
用一句话说就是:深度缓冲区的作用就是区分颜色所在的层次,防止把被遮挡住的颜色显示出来
然而,深度测试是默认关闭的,我们需要手动开启它,如下:
glEnable(GL_DEPTH_TEST):glEnable和glDisable函数允许我们开启或关闭某一个OpenGL的功能。该功能会一直保持开启或关闭的状态,直到另一个调用来关闭或开启它
还记得之前讲的 glClear() 方法嘛,可以通过 glClear(GL_DEPTH_BUFFER_BIT) 将所有像素的深度值设置为最大值,我们每次绘制必须要用其来清除深度缓冲区。