深度测试是 WebGL 中的一种渲染技术,用于确定片段的可见性。
可以简单理解为,深度测试实际就是一个开关,通过与否决定是否把片段写入颜色缓冲中
至于是否更新深度缓冲,则取决于是否开启深度缓冲写入
深度缓冲(Depth Buffer)是由窗口系统自动创建的,用于存储每个坐标的片段深度信息:
深度测试的主要目的是确定片段的可见性:
可以通过以下方式控制深度缓冲的行为:
只读深度缓冲:
GL_FALSE 实现提前深度测试:
实际上在应用投影矩阵后,会把深度值做一个非线性变换,与距离成反比
深度缓冲中0.5的值并不代表着物体的z值是位于平截头体的中间了,这个顶点的z值实际上非常接近近平面,z值分布图如下

可以看到,深度值很大一部分是由很小的z值所决定的,这给了近处的物体很大的深度精度
当两个面非常接近时,由于深度缓冲精度不足,无法准确区分前后关系,导致渲染结果在两个面之间不断切换,产生闪烁效果。
物体间距控制
近平面调整
提升深度精度
渲染过程中涉及三个重要的深度相关步骤:
深度测试
深度缓冲写入
颜色缓冲写入
深度测试通过与否,以及深度缓冲写入与否,是两个不同的概念,容易混淆,这里需要澄清一下:
深度测试:决定片段是否可以写入颜色缓冲深度缓冲写入:决定是否更新深度缓冲
3D场景中,如果需要绘制大量不透明物体,关闭深度缓冲写入可以提高渲染效率