SDL2 либо потерял контекст OpenGL, либо функции не определены
Я инициирую отображение, рендерер и контекст 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 ответ
По вашему описанию SceneManager
конструктор в комментариях, ваша проблема связана с вызовом конструктора.
Я назвал это в конструкторе SceneManager, и, как вы можете видеть, это происходит сразу после того, как все создано. Опять же, чтобы быть в безопасности, я попытался вызвать его до сцены, он ничего не выводил. Так это как-то разрушается здесь где-то?
В начале любой сферы SceneManager scene
объявлено, C++ неявно создает объект, используя конструктор по умолчанию. Таким образом, scene
на самом деле создается задолго до того, как вы приступите к выполнению копирования в этой строке: scene = SceneManager ();
Вы не "теряете свой контекст OpenGL", у вас его просто нет, когда scene
конструктор вызывается в самый первый раз. Вот почему вы обычно объявляете эти вещи, как SceneManager* scene
а затем отложить создание объекта scene
указывает на гораздо позже, используя new
, Вы можете сделать это или прекратить делать это в конструкторе. Но вы не можете делать вещи так, как вы это делаете сейчас, или вы будете вызывать функции GL до того, как SDL даже создаст для них контекст.