我正在尝试在我的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调用-尽管我没有这样做。它正在被自己清理。
有什么想法吗?可能是设备问题?
发布于 2015-07-12 05:34:02
,但是模板缓冲区在
onDrawFrame调用之间被清除了--尽管我没有这样做。它正在被自己清理。
这是有效的行为。深度缓冲区和模板缓冲区的内容不一定会在帧之间保留。
GLSurfaceView在幕后使用EGL API,作为Android上的OpenGL窗口系统接口(类似于Windows上的WGL、Mac上的CGL、iOS上的EAGL )。在框架末尾的幕后调用的函数是eglSwapBuffers()。从它的man page
在调用eglSwapBuffers之后,
辅助缓冲区的内容始终是未定义的。
如果您需要模板缓冲区使其内容超出帧边界,则必须使用屏幕外渲染到FBO。
至于模板缓冲区在一些设备上根本不能工作,无法判断这是设备问题,还是代码中的问题。需要注意的一件事是,在创建视图/渲染器时需要请求模板缓冲区。
例如,如果您使用的是默认EGLConfigChooser,则在设置GLSurfaceView期间进行的调用可能如下所示:
setEGLConfigChooser(8, 8, 8, 8, 16, 8);请注意,这需要在setEGLContextClientVersion()之后,但在setRenderer()之前。最后一个参数是模板缓冲区的请求大小。当你请求深度缓冲区时,一些设备总是会给你一个模板缓冲区,另一些设备则不会,除非你显式地请求模板,如上所示。
为了可靠地跨设备获得所需的配置,您通常需要实现自己的EGLConfigChooser。默认行为在不同的设备上可能不一致,即使它是根据EGL规范实现的,其中一些也没有太大意义。
https://stackoverflow.com/questions/31361293
复制相似问题