前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenGL ES for Android 深度测试

OpenGL ES for Android 深度测试

作者头像
老孟Flutter
发布2020-09-11 16:05:46
8910
发布2020-09-11 16:05:46
举报
文章被收录于专栏:FlutterFlutter

一个

有态度

的程序员

什么是深度

深度就像是现实世界中物体与我们自己之间的距离,而在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 绘制立方体 中是典型的深度测试用例,通过这篇文章可以查看开启深度测试和不开启的区别。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-01,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 老孟Flutter 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com