不同设备上的模板问题

Posted

技术标签:

【中文标题】不同设备上的模板问题【英文标题】:Stencil problems on different devices 【发布时间】:2015-07-11 20:03:36 【问题描述】:

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

代码很普通。像这样的:

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】:

但是在调用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 规范实现的,其中一些也没有多大意义。

【讨论】:

以上是关于不同设备上的模板问题的主要内容,如果未能解决你的问题,请参考以下文章

模板缓冲区在不同显卡上的作用不同

改造 - 不同设备上的不同 API 响应

不同设备上的不同页面

模板专业化,Windows 与 gcc 上的不同行为?

AngularJS:为桌面和移动使用不同的模板?

同一个应用程序在不同设备上的下载方式不同