老
孟
一个
有态度
的程序员
什么是深度
深度就像是现实世界中物体与我们自己之间的距离,而在OpenGL中,深度是像素点(可以理解为现实世界中的物体)距离相机的距离,深度信息保存在深度缓存中,深度值越大则离相机越远。
深度测试有什么作用
在OpenGL ES中默认是不开启深度测试的,不使用深度测试的时候,先绘制较近的物体,然后绘制较远的物体,当远处的物体和近处的物体出现重叠时导致近处的物体被远处的物体遮挡,这不符合实际的现象,也不是我们想要的效果。
深度测试则是可以解决这种问题,开启深度测试后,深度缓存中存储着的每个像素点都包含深度信息,当绘制新的像素时,先和深度缓存中的深度值进行比较,当深度值比深度缓存中的深度值大时(也就是离相机远)则使用原来大颜色值绘制,反之则使用新的颜色值。
另外需要注意的是并不是Z的值越大深度值就越大,而是比较物体距相机的距离,启用深度测试不适用于绘制透明的物体。
启用深度测试
在OpenGL ES中默认是不开启深度测试的,开启深度测试代码如下:
代码语言:javascript复制GLES20.glEnable(GLES20.GL_DEPTH_TEST)
在每次绘制(onDrawFrame方法)时先清楚上次的深度缓存和颜色缓存:
代码语言:javascript复制GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT or GLES20.GL_DEPTH_BUFFER_BIT)
默认情况下新像素的深度值小于深度缓存中的值则使用新像素的值,也可以理解为通过深度测试,这是深度测试的默认方式,我们可以通过glDepthFunc方法修改其默认值,可以修改的方式有:
- GL_NEVER:没有处理
- GL_ALWAYS:总处理
- GL_LESS:小于
- GL_LEQUAL:小于等于
- GL_EQUAL:等于
- GL_GEQUAL:大于等于
- GL_GREATER:大于
- GL_NOTEQUAL:不等于
默认值是GL_LESS。
glDepthFunc方法使用方式如下:
代码语言:javascript复制 GLES20.glDepthFunc(GLES20.GL_LESS)
在 OpenGL ES for Android 绘制立方体 中是典型的深度测试用例,通过这篇文章可以查看开启深度测试和不开启的区别。