2

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

4

1 回答 1

1

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

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

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

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

于 2014-01-23T22:42:27.067 回答