我试图在我的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的调用之间被清除 - 尽管我不做。它被自己清理了。
有什么想法?设备问题可能吗?
答案 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规范实现,其中一些行为也没有多大意义。