不同设备上的模板问题

时间:2015-07-11 20:03:37

标签: android opengl-es stencil-buffer

我试图在我的android opengl应用程序中使用模板测试。

代码很平常。像这样的Smth:

gl.glStencilFunc(GL10.GL_ALWAYS, 1, 0xff);
gl.glStencilOp(GL10.GL_KEEP, GL10.GL_REPLACE, GL10.GL_REPLACE);

//...drawing a thing to stencil buffer

gl.glStencilFunc(GL10.GL_EQUAL, 1, 0xff); 
gl.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP);

//...drawing using stencil buffer bits

但是为什么当我绘制到模板缓冲区时,它会在屏幕的不同位置被绘制几次。我不知道为什么。我只画了一次模版,但它不知何故......倍增......它在索尼设备上。 然后我拿了我的中文选项卡并在那里运行应用程序。我得到了另一张图片 - 它只被绘制一次并且在正确的位置,但是模板缓冲区正在onDrawFrame的调用之间被清除 - 尽管我不做。它被自己清理了。

有什么想法?设备问题可能吗?

1 个答案:

答案 0 :(得分:0)

  

但模板缓冲区正在onDrawFrame的调用之间被清除 - 尽管我不做它。它正在自行清理。

这是有效的行为。深度和模板缓冲区的内容不一定能在帧之间存在。

GLSurfaceView使用EGL API,它在Android上用作OpenGL窗口系统界面(类似于Windows上的WGL,Mac OS上的CGL,iOS上的EAGL)。在框架末尾引擎盖下调用的函数是eglSwapBuffers()。来自man page

  

调用eglSwapBuffers后,辅助缓冲区的内容始终未定义。

如果您需要模板缓冲区使其内容超出帧边界,则必须使用屏幕外渲染到FBO。

至于模板缓冲区在某些设备上根本不工作,无法判断这可能是设备问题,还是代码中的问题。需要注意的一点是,在创建视图/渲染器时请求模板缓冲区。

例如,如果您使用的是默认EGLConfigChooser,那么您在设置GLSurfaceView期间拨打的电话可能如下所示:

setEGLConfigChooser(8, 8, 8, 8, 16, 8);

请注意,这需要在 setEGLContextClientVersion(),而在 setRenderer()之前。最后一个参数是模板缓冲区的请求大小。当您请求深度缓冲区时,某些设备将始终为您提供模板缓冲区,除非您明确请求模板,否则其他设备将不会如上所示。

要在各设备之间可靠地获得所需的配置,您通常最终会实现自己的EGLConfigChooser。设备之间的默认行为可能不一致,即使根据EGL规范实现,其中一些行为也没有多大意义。