我正在使用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。
答案 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。所以我的建议是你实际修复你的代码并切换到核心配置文件。