使用SDL时,无法使用大于3.1的opengl版本绘制

时间:2015-06-21 11:19:25

标签: opengl sdl-2 glew

我正在使用OpenGL,GLEW和SDL2创建一个简单的应用程序,它在屏幕上绘制一个简单的四边形(我正在使用现代OpenGL跟随lazyfoo网站上的示例)。 当我使用opengl版本3.1一切正常,但如果我使用OpenGL版本3.2+绘图命令不起作用(三角形不会出现)。有人知道我做错了什么吗?

这是我设置所有内容的方式:

    if (SDL_Init(SDL_INIT_VIDEO) != 0) {

        return false;
    }
    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
m_pWindow = SDL_CreateWindow("Hello World!", 100, 100, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN );
m_pGLContext = SDL_GL_CreateContext(m_pWindow);
    glewExperimental = GL_TRUE;
    GLenum glewError = glewInit();
    if (glewError != GLEW_OK)
    {
        return false;
    }

    //Use Vsync
    if (SDL_GL_SetSwapInterval(1) < 0)
    {
        return false;
    }

如果要检查它,请从http://lazyfoo.net/tutorials/SDL/51_SDL_and_modern_opengl/index.php(站点底部)获取单文件cpp源,并尝试将opengl的版本从3.1更改为3.2。

1 个答案:

答案 0 :(得分:3)

在OpenGL 3.2中,引入了OpenGL配置文件。 core 配置文件实际上删除了所有已弃用的函数,这些函数与旧的GL函数相比具有破坏性。 兼容性配置文件保留向后兼容性。

要创建“现代”OpenGL上下文,必须使用GLX_create_context(Unix / X11)或WGL_create_context(Windows)等扩展(并且SDL会在内部为您执行此操作)。引用这些扩展规范可以解答您的问题:

  

属性名称GLX_CONTEXT_PROFILE_MASK_ARB请求OpenGL       上下文支持API的特定配置文件。如果       GLX_CONTEXT_CORE_PROFILE_BIT_ARB位在属性值中设置,       然后实现OpenGL的核心配置文件的上下文是       回。如果GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB位是       设置,然后实现兼容性配置文件的上下文       回。 如果请求的OpenGL版本低于3.2,       GLX_CONTEXT_PROFILE_MASK_ARB被忽略,并且功能被忽略了       上下文仅由所请求的版本决定。

     

[...]

     

GLX_CONTEXT_PROFILE_MASK_ARB的默认值为       GLX_CONTEXT_CORE_PROFILE_BIT_ARB。所有OpenGL 3.2实现都是       需要实现核心配置文件,但执行       兼容性配置文件是可选的。

您没有明确请求兼容性配置文件(而SDL没有这样做),您有一个核心配置文件,看起来您的代码在核心中无效轮廓。

您可以尝试添加

来申请比较性资料
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);

在创建上下文之前提示。

但请注意,这并不是普遍支持的 - MacOS通常仅支持GL高达2.1或GL&gt; = 3.2核心配置文件。 Linux上的开源驱动程序仅支持核心配置文件中的OpenGL&gt; = 3.2。所以我的建议是你实际修复你的代码并切换到核心配置文件。