为什么我不能使用SDL2创建OpenGL ES 3.0上下文?

3 opengl-es sdl-2

我在Debian stable上使用SDL2 2.0.2,我正试图用它获取OpenGL ES 3.0上下文.如果我请求OpenGL ES 2.0上下文,这是有效的,但如果我直接请求OpenGL ES 3.0上下文则不行.

考虑以下程序:

#include <GLES3/gl3.h>
#include <SDL2/SDL.h>

int main(
    int argc,
    char **argv
) {
    SDL_GLContext context;
    int rc;
    const GLubyte *version;
    SDL_Window *window;

    rc = SDL_Init(SDL_INIT_VIDEO);

    if (rc < 0) {
        return EXIT_FAILURE;
    }

    atexit(SDL_Quit);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
#ifdef THIS_SHOULD_WORK_TOO
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#else
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#endif

    window = SDL_CreateWindow("OpenGL", 100, 100, 800, 600, SDL_WINDOW_OPENGL);
    context = SDL_GL_CreateContext(window);
    version = glGetString(GL_VERSION);

    if (version == 0) {
        printf(
            "Unable to get OpenGL ES version string: %d\n",
            glGetError()
        );
        return EXIT_FAILURE;
    }

    printf("Version string: %s\n", version);

    SDL_GL_DeleteContext(context);

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

当我正常编译它时,它会请求一个OpenGL ES 2.0上下文,程序会收到一个OpenGL ES 3.0上下文:

$ c99 example.c -lSDL2 -lGLESv2
$ ./a.out 
Version string: OpenGL ES 3.0 Mesa 10.3.2
Run Code Online (Sandbox Code Playgroud)

但是,当我请求OpenGL ES 3.0上下文时,此程序失败,没有明确的错误消息:

$ c99 -DTHIS_SHOULD_WORK_TOO example.c -lSDL2 -lGLESv2
$ ./a.out
Unable to get OpenGL ES version string: 0
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

我怀疑是因为-lGLESv2,主要是因为OpenGL ES上下文报告它是版本3.0,并且因为libGLESv3.so运送它的平台将它作为符号链接发送给它libGLESv2.so(例如,Android会这样做).

小智 5

这是SDL2中的一个错误:

SDL的EGL代码(用于在Windows/Linux/Android /等上创建OpenGL ES上下文)似乎只能正确支持OpenGL ES 1和2上下文.

特别是,如果请求GLES2,则当前代码将EGL_RENDERABLE_TYPE配置属性设置为EGL_OPENGL_ES2_BIT,而在所有其他情况下,将EGL_OPENGL_ES_BIT设置为EGL_OPENGL_ES_BIT.即使请求GLES3.0 +,它也永远不会使用EGL_OPENGL_ES3_BIT/EGL_OPENGL_ES3_BIT_KHR.当请求3.1时,它也不使用EGL_CONTEXT_MINOR_VERSION_KHR将版本设置为3.1而不是SDL_EGL_CreateContext中的3.0.

这意味着对OpenGL ES 3.0的请求被转换为对OpenGL ES 1.0的请求.由于OpenGL ES 3.0向后与OpenGL ES 1.0不兼容,因此请求最终失败(我认为).

该修补程序已合并到主分支中,并计划作为SDL2 2.0.4版的一部分发布:

  • 添加了EGL_KHR_create_context支持,允许在某些平台上选择OpenGL ES版本