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

时间:2015-10-15 10:02:45

标签: 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;
}

当我正常编译时,它会请求一个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

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

$ c99 -DTHIS_SHOULD_WORK_TOO example.c -lSDL2 -lGLESv2
$ ./a.out
Unable to get OpenGL ES version string: 0

为什么会这样?

我怀疑这是因为-lGLESv2,主要是因为OpenGL ES上下文报告它是版本3.0,并且因为发送libGLESv3.so的平台将它作为符号链接发送到{{1}例如,(promised)。

1 个答案:

答案 0 :(得分:5)

这是a bug in 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不兼容,因此请求最终失败(我认为)。

The fix已合并到主分支中,并计划发布as part of SDL2 version 2.0.4

  
      
  • 添加了EGL_KHR_create_context支持以允许在某些平台上选择OpenGL ES版本
  •   
相关问题