深度测试
由于正背面剔除的过程中会产生一个互相覆盖的问题,产生的原因当图形旋转的过程中,如果有两个部分出现重叠,是OpenGL渲染并不能识别哪个部分在前,哪个部分在后。因此为了解决这个问题,引入了深度测试的技术。


深度
深度是指OpenGL坐标系中,像素点的Z坐标距观察者的距离 深度与图形中像素点的Z坐标有如下关系:
- 如果观察者在Z轴的正方向,Z值越大则越靠近观察者
- 如果观察者在Z轴的负方向,Z值越小则越靠近观察者
深度缓存区原理
将深度值与屏幕上的每个像素点进行一一对应,然后将深度值存储到深度缓冲区。
- 在深度缓存区中,每个像素点只会记录一个深度值
- 深度缓冲区的范围是[0,1]之间,默认值是1.0,表示深度值的最大值 在之前的demo中,zaiRenderScene函数绘制前,都会先清空缓存区,这里的缓冲区就包括深度缓冲区,因为如果缓存区不清空,之前的数据会有残留,会对目前图形的绘制造成影响。
清空深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
开启深度测试
glEnable(GL_DEPTH_TEST);
Z-Fighting Z冲突
开启深度测试后,由于深度缓冲区精度有限制,导致深度值在误差极小时,OpenGL出现无法判断的情况,导致出现画面交错闪现的现象,例如下图

- 启用多边形偏移
- 指定偏移量
- 关闭多边形偏移
颜色混合
OpenGl渲染时会把颜色值存在颜色缓冲区中,每个片段的深度值也放在深度缓冲区,当深度缓冲区被关闭时,新的颜色将简单的覆盖原来颜色缓冲区存在的颜色值,当深度缓冲区再次打开时,新的颜色片段只是当他们比原来的值更接近临近的裁剪平面才会替换原来的颜色片段
那么问题来了 如果开启深度测试,2个重叠的图层中,有一个图层是半透明的,另一个是费半透明,那么就需要将两个图层的颜色进行混合 首先要引入两个概念
- 目标颜色: 已经存储在颜色缓存区的颜色值
- 原颜色:作为当前渲染命令结果进入颜色缓冲区的颜色值
//开启,
glEnable(GL_BlEND);
//设置混合因子--默认值是 GL_SRC_ALPHA 和 GL_ONE_MINUS_SRC_ALPHA
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//关闭
glDisable(GL_BlEND);