android opengl 2.0 模板缓冲区不起作用

Posted

技术标签:

【中文标题】android opengl 2.0 模板缓冲区不起作用【英文标题】:android opengl 2.0 stencil buffer not working 【发布时间】:2015-03-13 21:18:02 【问题描述】:

当我尝试使用模板缓冲区功能时,我在我的 android 设备上遇到了非常奇怪的行为。 (GLES20.glEnable(GLES20.GL_STENCIL_TEST);)

这是我的代码:

GLES20.glEnable(GLES20.GL_STENCIL_TEST);
GLES20.glStencilFunc(GLES20.GL_GEQUAL, 1, 0xff);
GLES20.glStencilOp(GLES20.GL_KEEP, GLES20.GL_INCR, GLES20.GL_INCR);
GLES20.glStencilMask(0xff);

m_index_buffer.position(start_index);
GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP,
                      n_indicies,
                      GLES20.GL_UNSIGNED_SHORT,
                      m_index_buffer);

GLES20.glDisable(GLES20.GL_STENCIL_TEST);

我得到以下结果:

起初我怀疑我的代码,然后我尝试了以下模板示例: google stencil test 并得到以下结果:

opengl 和模板缓冲区功能似乎存在一些问题... 我正在使用带有 android 4.4.4 的摩托罗拉 Moto G。 这是某种已知的错误吗? 有什么解决方法吗?

【问题讨论】:

【参考方案1】:

问题是模板缓冲区没有正确清除。在调用glClear(GL_STENCIL_BUFFER_BIT) 之前需要设置模板掩码glStencilMask(0xff) 以清除模板缓冲区的所有位。某些设备可能会忽略模板掩码并在清除模板缓冲区时始终使用 0xff。甚至谷歌的模板测试示例也有这个错误:(

【讨论】:

谢谢你 - 为我修复了第 11 章的模板测试。

以上是关于android opengl 2.0 模板缓冲区不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是不是可以保留多重采样?

Android OpenGL ES 2.0 重用前一帧

有没有办法在带有 Java 的 Android 的 OpenGL ES 2.0 中使用顶点缓冲区中的对象?

在 Android 上的 OpenGL ES 2.0 中使用 VBO/IBO

如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?

无法让 Stencil Buffer 在 iOS 4+ 中工作(5.0 工作正常)。 [OpenGL ES 2.0]