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

时间:2014-01-23 21:09:54

标签: c++ opengl sdl sdl-2 openglcontext

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

1 个答案:

答案 0 :(得分:1)

根据您在评论中对SceneManager的构造函数的描述,您的问题与 时的问题有关。

  

我在SceneManager的构造函数中调用它,正如您所看到的,它在创建所有内容后立即发生。再次为了安全起见,我尝试在场景管理员之前调用它,它没有输出任何东西。所以它在某处以某种方式被摧毁了?

在声明范围SceneManager scene的开头,C ++使用默认构造函数隐式构造对象。因此,scene实际构建为 long ,然后才能在此行上进行复制分配:scene = SceneManager ();

你不是“失去你的OpenGL上下文”,你第一次调用scene的构造函数时根本就没有。这就是为什么你经常声明像SceneManager* scene这样的东西,然后推迟对象scene的实例化,直到稍后使用new。你可以这样做,或者在构造函数中停止这样做。但是你不能按照现在的方式做事,或者在SDL甚至为他们创建上下文之前调用GL函数。