【发布时间】:2014-01-23 21:09:53
【问题描述】:
我在显示器之外启动显示、渲染器和 OGL 上下文。这些都没有给出错误,以下是我创建这些元素的方式。
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
printf("SDL initialization failed: %s\n", SDL_GetError());
return false;
}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
if ((display = SDL_CreateWindow("",
50, 50, 600, 600, SDL_WINDOW_OPENGL)) == NULL)
{
printf("Could not create window: %s\n", SDL_GetError());
return false;
}
if ((graphics = SDL_CreateRenderer(display, -1, 0)) == NULL)
{
printf("Could not get renderer: %s\n", SDL_GetError());
return false;
}
if ((*context = SDL_GL_CreateContext(display)) == NULL)
{
printf("Could not get context: %s\n", SDL_GetError());
return false;
}
GLenum err = glewInit();
if (GLEW_OK != err)
{
printf("GLEW couldn't be initialized: %s\n", glewGetErrorString(err));
return false;
}
scene = SceneManager();
return true;
现在,在这些之后,像 glClearColor 或 glClear 这样的方法可以按预期工作,但是,像 glCreateProgram 或 glActiveTexture 这样的方法指向 NULL 并引发运行时异常。如果我不在标题中包含 glew,则甚至无法识别这些功能。
我是否以某种方式丢失了我的 OpenGL 上下文并最终出现错误,或者这些函数未在 SDL 中定义,我必须使用另一个库来链接这些函数?
【问题讨论】:
-
这是完全正常的。
glClearColor (...)和glClear (...)是 OpenGL 1.0 的一部分。glCreateProgram (...)是 GL 2.0 的一部分,glActiveTexture (...)是 GL 1.3 的一部分。您需要 GLEW 才能在像 Windows 这样的平台上获得这些功能,该平台仅提供 OpenGL 1.1,并将比显示驱动程序更新的任何内容留给显示驱动程序在运行时扩展。我建议您为此做一些事情:const GLchar* version = glGetString (GL_VERSION), renderer = glGetString (GL_RENDERER); printf ("%s %s\n", version, renderer);并使用该信息修改您的问题。 -
你需要设置你的opengl版本,使用
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, versionNumber);和SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, versionNumber); -
它说glGetString返回无符号字节,所以我使用无符号字节,但是这两个值都返回NULL。
-
会不会是他正在测试
(*context = SDL_GL_CreateContext(display)) == NULL,并且永远不会评估为NULL? -
好吧,我怎么能在类之间丢失一个 GL 上下文,我从不破坏我创建的那个。
标签: c++ opengl sdl sdl-2 openglcontext