我遇到了一个问题,SDL 说它不支持 OpenGL 3.x 上下文。我正在尝试遵循本教程:Creating a Cross Platform OpenGL 3.2 Context in SDL (C / SDL)。在这种情况下,我使用的是 GLEW,但我也无法让 gl3.h 使用它。这是我最终得到的代码:
#include <glew.h>
#include <SDL.h>
int Testing::init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
printSDLError();
system("pause");
return 1; // Error
}
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//set double buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//Create window
window = SDL_CreateWindow("OpenGL 3.2 test",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(window == NULL) return 3; // Error
//Print errors to console if there are any
printSDLError(__LINE__);
//Set up OpenGL context.
glContext = SDL_GL_CreateContext(window);
printSDLError(__LINE__);
if(glContext == NULL)
{
DEBUGLINE("OpenGL context could not be created.");
system("pause");
return 4;
}
//Initialize glew
GLenum err = glewInit();
if(err != GLEW_OK)
{
DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
system("pause");
return 2;
}
return 0; // OK code, no error.
}
报告的唯一问题是在尝试调用后SDL_GL_CreateContext(window)
,SDL 报告“不支持 GL 3.x”。但是,本教程和这个示例包(我没有费心测试)都报告说成功地结合了 SDL 1.3 和 OpenGL 3.2。我知道 SDL 1.3 正在开发中,但我有点怀疑即使是无意的支持也会被删除。
仍然会创建一个上下文,并且 GLEW 能够很好地初始化。(我一生无法弄清楚如何查看创建的上下文版本,因为它应该是核心配置文件,我也不知道如何找到它。根据教程,SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3)
实际上并没有做任何事情,在这种情况下,我不知道如何创建适当的上下文或更改默认上下文。)
编辑:感谢 Nicol 给我的有用功能,经过一些测试后,我发现,无论我传递给什么参数SDL_GL_SetAttribute
,上下文始终是 1.1 版。但是,放入低于 3.0 的任何版本都不会显示不支持的错误。所以问题是SDL看到的“核心”版本只有1.1。
作为记录,我使用的是 Visual C++ 2010 express、GLEW 1.7.0 和最新的 SDL 1.3 修订版。我对使用所有这三个都相当陌生,我必须为 32 位和 64 位版本手动构建 SDL 库,所以有很多可能出错的地方。然而,到目前为止,32 位和 64 位版本的功能完全相同。
编辑:我正在使用带有最新驱动程序的 nVidia 360M GPU,OpenGL Extension Viewer 4.04 报告它与 OpenGL 3.3 完全兼容。
任何帮助表示赞赏。
更新:我已经设法让 SDL 停止对我大喊大叫,说它不支持 3.x 上下文。问题是SDL_GL_SetAttribute
必须设置BEFORE SDL_Init
的称为:
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//Initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
return 1; // Error
}
不幸的是,GLEW 仍然拒绝承认高于 OpenGL 1.1 的任何东西(只有 GLEW_VERSION_1_1 返回 true),这仍然让我感到困惑。glGetString(GL_VERSION)
还报告 1.1.0。似乎我的程序根本不知道任何更高版本,就好像我根本没有安装它们一样。