我正在启动显示器,渲染器和显示器的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中定义,我必须使用其他库来链接这些函数?
答案 0 :(得分:1)
根据您在评论中对SceneManager
的构造函数的描述,您的问题与 时的问题有关。
我在SceneManager的构造函数中调用它,正如您所看到的,它在创建所有内容后立即发生。再次为了安全起见,我尝试在场景管理员之前调用它,它没有输出任何东西。所以它在某处以某种方式被摧毁了?
在声明范围SceneManager scene
的开头,C ++使用默认构造函数隐式构造对象。因此,scene
实际构建为 long ,然后才能在此行上进行复制分配:scene = SceneManager ();
你不是“失去你的OpenGL上下文”,你第一次调用scene
的构造函数时根本就没有。这就是为什么你经常声明像SceneManager* scene
这样的东西,然后推迟对象scene
的实例化,直到稍后使用new
。你可以这样做,或者在构造函数中停止这样做。但是你不能按照现在的方式做事,或者在SDL甚至为他们创建上下文之前调用GL函数。