【问题标题】:OpenGL ES 2 on Vivante GPU (Android): depth buffer doesn't workVivante GPU (Android) 上的 OpenGL ES 2:深度缓冲区不起作用
【发布时间】:2014-10-14 11:38:56
【问题描述】:

我有一个三星 Galaxy Tab 3 (Android 4.2.2),深度缓冲区似乎不起作用。任何其他设备都可以。我按如下方式创建上下文:

setEGLContextClientVersion(2);
setEGLConfigChooser(new MultisampleConfigChooser(...));

// ...

@Override
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
    mValue = new int[1];

    // Try to find a normal multisample configuration first.
    int[] configSpec = {
            EGL10.EGL_RED_SIZE, 5,
            EGL10.EGL_GREEN_SIZE, 6,
            EGL10.EGL_BLUE_SIZE, 5,
            EGL10.EGL_DEPTH_SIZE, 16,
            // Requires that setEGLContextClientVersion(2) is called on the view.
            EGL10.EGL_RENDERABLE_TYPE, 4 /* EGL_OPENGL_ES2_BIT */,
            EGL10.EGL_SAMPLE_BUFFERS, (!mDisableMultisampling ? 1 : 0)/* true */,
            EGL10.EGL_SAMPLES, (!mDisableMultisampling ? 2 : 0),
            EGL10.EGL_STENCIL_SIZE, 8,
            EGL10.EGL_NONE
    };

    if (!egl.eglChooseConfig(display, configSpec, null, 0, mValue)) {
        // ...
    }

    ...
}

我尝试了以下方法:

  • 禁用多重采样(无效)
  • 使用 24 位深度(无效)
  • glGet(GL_DEPTH_BITS) = 16
  • glIsEnabled(GL_DEPTH_TEST) = true
  • glGet(GL_DEPTH_FUNC) = GL_LESS
  • glGet(GL_DEPTH_WRITEMASK) = 1
  • glGetString(GL_RENDERER) = gc1000 核心

投影矩阵没问题(该程序可以在任何其他 Android 设备上运行,也可以在 iOS 上运行)。

什么可能导致问题?

【问题讨论】:

  • 它返回什么配置?它真的有 deph 缓冲区吗?另外,您是否尝试过请求不带 EGL_SAMPLE_BUFFERSEGL_SAMPLES 的配置?
  • 试过了,没有效果:(如何检查是否有深度缓冲区?

标签: android opengl-es-2.0 depth-buffer


【解决方案1】:

“用户错误。”显然 glDepthMask 在除 Vivante 之外的每个 GPU 上都接受大于 1 的值。找出这一点并将其强制为 0 或 1 即可解决问题。

【讨论】:

    【解决方案2】:

    很多人在使用三星设备的 OpenGL ES 驱动程序时遇到问题。他们是越野车。检查您是否可以获得任何驱动程序更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多