第三十三章 深度测试总结

渲染一个物体,可以用深度缓冲来防止被阻挡的面渲染到其他面的前面。
深度缓冲就像是颜色缓冲一样,在每个片段中存储了信息,通常和颜色缓冲有一样的宽度和高度。在大部分的系统中,深度缓冲的精度是24位,以float的形式存储它的深度值。

深度测试被启用的时候,OpenGL会将一个片段的深度值与深度缓冲的内容进行对比,如果在OpenGL执行的深度测试后,通过了则会将其更新为新的深度值,如果测试失败,则片段被丢弃。
深度缓冲是在片段着色器运行之后,也是在模板测试运行之后,在屏幕空间中运行的。屏幕空间坐标与通过OpenGL的glViewport所定义的视口密切相关,可以直接使用GLSL 内建变量gl_FragCoord从片段着色器直接访问。该函数的x和y分量代表了片段的屏幕空间坐标(0,0是左下角)。注意:gl_FragCoord中包含一个z分量,包含了片段真正的深度值。z值就是需要与深度缓冲内容所对比的值。

补充:大部分的GPU都提供一个提前深度测试的硬件特性。允许深度测试在片段着色器之前运行。只要清楚一个片段永远不会是可见的,则就可以提前丢弃这个片段。片段着色器的开销较大,应尽可能避免运行它们。当使用提前深度测试时,片段着色器的一个限制是不能写入片段的深度值。

深度测试默认禁用的,要启用的话,需要使用函数glEnable:
glEnable(GL_DEPTH_TEST);
启用后,如果一个片段通过了深度测试,则OpenGL会在深度缓冲中存储该片段的z值;如果没有通过深度缓冲,则会丢弃该片段。如果启用了深度缓冲,还应该在每个渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲,否则会还在使用上一次渲染迭代中的写入的深度值:

你可能感兴趣的:(OPGENGL,人工智能,深度学习,计算机视觉)