繁体   English   中英

SDL2丢失了OpenGL上下文或未定义的功能

[英]SDL2 either lost OpenGL context or functions not defined

我正在从显示器启动显示器,渲染器和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中未定义这些函数,而我必须使用另一个库来链接这些函数?

根据您在注释中对SceneManager的构造函数的描述,您的问题与调用构造函数有关。

我在SceneManager的构造函数中调用了它,您可以看到它在创建所有内容后立即发生。 出于安全考虑,我再次尝试在Scenemanager之前调用它,但它没有输出任何内容。 因此,它以某种方式在这里的某个地方被破坏了?

在声明任何范围的SceneManager scene开始时,C ++都会使用默认构造函数隐式构造该对象。 因此, scene实际上是在您可以在此行上进行复制分配之前很久才构造的: scene = SceneManager ();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM