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;
}
4

3 回答 3

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 之外的其他值的行为。

于 2014-01-24T11:10:37.517 回答
0

I am using nexus 7 (2012) and that's probably my problem ( although I would think eglCreateContext would fail with EGL_CONTEXT_CLIENT_VERSION, 3 )

于 2014-01-17T11:54:37.047 回答
0

这是在 Android 中初始化 OpenGL ES 3.0 上下文的正确方法 - 创建 OpenGL ES 2.0 上下文并检查创建的上下文的 GL 版本是否为 3.0。是的,您不需要明确指定EGL_CONTEXT_CLIENT_VERSION 3- GLES 3.0 与 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 - 我相信这个人。

PS 说到 Nexus 7 第一代 - 是的,它的 GPU ( Tegra3 ) 不支持 ES 3.0 以及Tegra4 - 只有下一代Tegra5 ( Tegra K1 ) 支持它。

于 2014-01-25T07:48:02.143 回答