SDL2 丢失 OpenGL 上下文或未定义函数

Posted

技术标签:

【中文标题】SDL2 丢失 OpenGL 上下文或未定义函数【英文标题】:SDL2 either lost OpenGL context or functions not defined 【发布时间】: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 上下文,我从不破坏我创建的那个。 【参考方案1】:

根据你在cmets中对SceneManager的构造函数的描述,你的问题与构造函数被调用有关。

我在 SceneManager 的构造函数中调用了它,正如您所见,它发生在所有内容创建之后。再次为了安全起见,我尝试在场景管理器之前调用它,它没有输出任何内容。所以它不知何故在这里某个地方被摧毁了?

在声明SceneManager scene 的任何作用域的开头,C++ 都会使用默认构造函数隐式构造对象。因此,scene 实际上是 long 在您开始在此行上进行复制分配之前构造的:scene = SceneManager ();

你并没有“丢失你的 OpenGL 上下文”,当scene 的构造函数第一次被调用时你根本就没有。这就是为什么你通常声明这些东西,比如SceneManager* scene,然后推迟对象scene 的实例化,直到很久以后才使用new。您可以这样做,也可以在构造函数中停止这样做。但是您不能按照现在的方式做事,否则您将在 SDL 甚至为它们创建上下文之前调用 GL 函数。

【讨论】:

感谢安东的帮助和努力。这就是问题所在。你为我节省了大量时间。

以上是关于SDL2 丢失 OpenGL 上下文或未定义函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 openGL 在 SDL2 中全屏显示窗口

具有 0 个颜色位和 0 个深度位的 SDL2 OpenGL 4.2 上下文

使用 SDL2 和 OpenGL 显示蓝色

使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50

高 CPU 使用率 OpenGL Ver 3.1 + SDL2

OpenGL / SDL2:模板缓冲区位在 PC 上始终为 0