【问题标题】:Can't draw with opengl version greater then 3.1 with SDL无法使用大于 3.1 的 opengl 版本和 SDL 进行绘制
【发布时间】:2015-06-21 11:19:25
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 您的硬件支持 OpenGL 3.2?

标签: opengl sdl-2 glew


【解决方案1】:

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

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

属性名称GLX_CONTEXT_PROFILE_MASK_ARB 请求一个OpenGL 支持 API 的特定 profile 的上下文。如果 GLX_CONTEXT_CORE_PROFILE_BIT_ARB位在属性值中设置, 那么实现 OpenGL 的 core 配置文件的上下文是 回来。如果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 两者都没有),您得到了一个 core 配置文件,并且您的代码似乎在核心中无效轮廓。

您可以尝试通过添加

来请求兼容性配置文件
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);

在创建上下文之前提示。

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

【讨论】:

  • 谢谢回答,它有帮助:-) 我想使用核心配置文件,但我不知道如何找到当前核心配置文件中不推荐使用的功能。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2017-04-26
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多