1.什么是深度测试
深度
深度在OpenGL里面表示世界坐标系中像素点的Z轴距离观察者的距离。
如下图所示观察者位置在圆点坐标是(0,0,0),水壶物体在OpenGL中渲染他的深度就是Z+,物体距离观察者越远Z值越大,反之如果水壶在观察者后面(Z轴负轴区域),那么Z越大表示离观察者越近
深度缓冲区(DepthBuffer):
深度缓冲区是存储在显存中,作用是存储每个屏幕像素点像素的Z值(也就是深度)。
深度缓冲区和颜色缓存区(ColorBuffer)是对应的,颜色缓存区存储每个像素点的颜色值信息,深度缓冲区存储每个像素点的深度信息,在绘制一个物体表面时会将物体表面对应的像素点的深度值跟深度缓冲区已存储的深度值做大小比较,如果新像素点的深度小于已存储的像素深度值(表示新像素距离观察者更近,观察者只会看到新像素点Ps新像素点有alpha透明度先不说,默认不透明),那么新像素点就会覆盖原深度缓存区之前的值,否则就会把新像素点丢弃,这就是深度测试
深度缓冲区的默认值是1.0,表示最大深度值,深度值范围在[0,1]之前,浮点型。
2.深度测试能解决什么问题
当我们绘制一个甜甜圈环形立体图形的时候,我们旋转图形到如下图所示角度,就会发现甜甜圈正前方有一块区域是透明的,能看到内环一部分表面。
这是为什么呢?
因为OpenGL绘制渲染甜甜圈的时候,当我们旋转到竖直的角度,甜甜圈的外环前面表面和内环后面表面都要渲染如下图,但是OpenGL不知道到底应该让观察者看到哪一个表面。
这个时候深度测试就派上用场了,我们通过一行代码开启深度测试
glEnable(GL_DEPTH_TEST);
这时候OpenGL就能通过每个像素点的深度值(也就是距离观察者的大小)判断这个像素点是否应该显示还是丢弃。开启深度测试后,效果如图所示,最终bug消除。