带有GL_PIXEL_PACK_BUFFER的glBindBuffer返回枚举错误代码

时间:2014-01-16 09:16:30

标签: android opengl-es egl opengl-es-3.0

我正在尝试:

glBindBuffer(GL_PIXEL_PACK_BUFFER,pbo_id);

在Android 4.3中我得到'枚举错误代码',虽然文档说我可以使用GL_PIXEL_PACK_BUFFER。

也许我没有使用'OpenGL ES 3.0'? 我需要什么来强制使用v3?

OpenGL上下文:

EGLint numConfigs = 0;
EGLint configAttribs[] = {
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_RECORDABLE_ANDROID, 1,
    EGL_RED_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_BLUE_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_NONE
};

result = eglChooseConfig(mEglDisplay, configAttribs, &mEglConfig, 1,
        &numConfigs);
if (result != EGL_TRUE) {
    fprintf(stderr,"eglChooseConfig error: %#x", eglGetError());
    return UNKNOWN_ERROR;
}

EGLint contextAttribs[] = {
    EGL_CONTEXT_CLIENT_VERSION, 3,
    EGL_NONE
};
mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT,
        contextAttribs);
if (mEglContext == EGL_NO_CONTEXT) {
    fprintf(stderr,"eglCreateContext error: %#x", eglGetError());
    return UNKNOWN_ERROR;
}

3 个答案:

答案 0 :(得分:1)

所以是的,让Android 4.3不保证OpenGL ES 3.0,它只是为兼容设备启用它。该设备需要支持OpenGL ES 3.0的GPU。 Nexus 7(2012)拥有仅支持OpenGL ES 2.0的NVIDIA Tegra 3 SoC。您无法“强制”此设备使用3.0上下文。

至于eglCreateContext没有失败,我不确定。快速查看规范似乎没有真正定义除2和1之外的其他值的行为。

答案 1 :(得分:0)

我正在使用nexus 7(2012),这可能是我的问题(尽管我认为eglCreateContext会因EGL_CONTEXT_CLIENT_VERSION而失败,3)

答案 2 :(得分:0)

这是在Android中初始化OpenGL ES 3.0上下文的正确方法 - 创建OpenGL ES 2.0上下文并检查创建的上下文的GL版本是否为3.0。是的,您不需要明确指定EGL_CONTEXT_CLIENT_VERSION 3 - GLES 3.0完全向后兼容w / 2.0,这就是Android在硬件支持时创建ES 3.0上下文的原因。如果硬件无法运行ES 3.0,您将获得通常的ES 2.0,在运行Android 2.2及更高版本的任何设备上100%可用。

在我们的应用程序中,我正是以这种方式完成它并且它有效(尽管我使用Java)。

在Android 4.3发布的第一天,除了Romain Guy之外没有其他人解释过:https://plus.google.com/u/0/+RomainGuy/posts/iJmTjpUfR5E - 我相信这个人。

P.S。说到Nexus 7 1st gen - 是的它的GPU( Tegra3 )不支持ES 3.0,以及 Tegra4 - 只有下一代 Tegra5 Tegra K1 )支持它。