【问题标题】: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 调用之间正在清除模板缓冲区-尽管我不这样做。它正在自行清理。

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

【问题讨论】:

    标签: android opengl-es stencil-buffer


    【解决方案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 规范实现的,其中一些也没有多大意义。

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      相关资源
      最近更新 更多