笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN课程视频网址:http://edu.csdn.net/lecturer/144
深度测试在游戏引擎中使用的非常多,比如在Unity3D引擎中,在UI之间的遮挡设置可以通过其深度值进行设置,在3D场景中也会根据其Z值进行设置其前后关系。这些都会用到深度测试技术,由于Unity3D引擎是跨平台的,它在移动端的渲染使用的是OpenGL,所以后面的系列文章就介绍关于OpenGL使用的核心技术。
深度测试需要一个存储区域,这个存储区域就称为深度缓冲,它就像颜色缓冲用于存储所有的片段颜色,深度缓冲和颜色缓冲区有相同的宽度和高度。深度缓冲由窗口系统自动创建并将其深度值存储为 16、 24 或 32 位浮点数,在大多数系统中深度缓冲区为24位。
使用深度测试就必须要启用它,当深度测试启用的时候, OpenGL 测试深度缓冲区内的深度值。OpenGL 执行深度测试的时候,如果此测试通过,深度缓冲内的值将被设为新的深度值。如果深度测试失败,则丢弃该片段。深度测试在片段着色器运行之后,它是在屏幕空间中执行的。屏幕空间坐标直接有关的视区,由OpenGL的glViewport
函数给定,并且可以通过GLSL的片段着色器中内置的 gl_FragCoord
变量访问。gl_FragCoord
的 X 和 y 表示该片段的屏幕空间坐标 ((0,0) 在左下角)。gl_FragCoord
还包含一个 z 坐标,它包含了片段的实际深度值。此 z 坐标值是与深度缓冲区的内容进行比较的值。
深度测试默认是关闭的,要启用深度测试的话,我们需要用GL_DEPTH_TEST
选项来打开它,函数如下:
glEnable(GL_DEPTH_TEST);
一旦启用深度测试,如果片段通过深度测试,OpenGL自动在深度缓冲区存储片段的 z 值,如果深度测试失败,那么相应地丢弃该片段。如果启用深度测试,那么在每个渲染之前还应使用
GL_DEPTH_BUFFER_BIT
清除深度缓冲区,否则深度缓冲区将保留上一次进行深度测试时所写的深度值。函数如下: