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 даже создаст для них контекст.

Другие вопросы по тегам