2016-06-19 2 views
2

У меня есть некоторые проблемы, чтобы заставить мой glew работать. Когда я инициализирую glew, я получаю сообщение об ошибке: Отсутствует версия GL. Я также не могу создать контекст: OpenGL не инициализирован. Это мой код:Не удается инициализировать OpenGL

#include <GL\glew.h> 
#include <GL\GLU.h> 
#include <SDL2\SDL.h> 
#include <SDL2\SDL_opengl.h> 

#include <iostream> 
#undef main 

SDL_GLContext context; 
SDL_Renderer * renderer; 
SDL_Window * window; 

int main(int argc, char *argv[]) { 
    //init SDL 
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { 
     fprintf(stderr, "\n> Unable to initialize SDL: %s\n", SDL_GetError()); 
    } 

    window = SDL_CreateWindow("Cri Engine 3D", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN); 
    if (window == nullptr) 
    { 
     printf("> Window could not be created! SDL Error: %s\n", SDL_GetError()); 
    } 

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); 

    context = SDL_GL_CreateContext(window); 
    SDL_GL_MakeCurrent(window, context); 


    if (context == NULL) { 
     printf("> OpenGL context could not be created! SDL Error: %s\n", SDL_GetError()); 
    } 

    //Glew 
    glewExperimental = GL_TRUE; 
    GLenum err = glewInit(); 
    if (GLEW_OK != err) { 
     fprintf(stderr, "> Error: %s\n", glewGetErrorString(err)); 
    } 
    fprintf(stdout, "> Using GLEW %s\n", glewGetString(GLEW_VERSION)); 

    glViewport(0, 0, 800, 600); 

    SDL_Quit(); 
    return 0; 
} 

Эти настройки компоновщика я использую (в указанном порядке): glew32.lib, glu32.lib, opengl32.lib, SDL2.lib, SDL2main.lib.

Я уверен, что либреи включены правильно. PS: это мой первый пост, если мне не хватает информации, скажите мне!

ответ

5

Вам не хватает SDL_WINDOW_OPENGL flag for SDL_CreateWindow().

Также, вы must удалить #undef main. В противном случае вам нужно выполнить инициализацию низкого уровня самостоятельно, чего вы не делаете.

Другое дело: вы должны переключиться на профиль совместимости из основного профиля (SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);), поскольку GLEW имеет тенденцию к сбою при запросе инициализации контекста основного профиля в Windows.

Кроме того, многие части вашего ядра являются избыточными:

  • SDL_WINDOW_SHOWN - Это уже используется по умолчанию.
  • SDL_GL_MakeCurrent(window, context); - Не требуется, когда есть только один контекст.
  • glViewport(0, 0, 800, 600); - Когда вы создаете контекст, он автоматически настраивает правильный видовой экран для вас.
  • SDL_Quit(); - Вам не нужно звонить что-нибудь, когда заканчивается ваша программа. Это не делает ничего, кроме замедления вашей программы. (По крайней мере, так оно и работает в Windows. В Linux иногда бывает необходимо, как отметил @keltar, а также предотвращает утечку детекторов, таких как валринг, от криков на вас о внутренних структурах SDL.)
  • #include <SDL2\SDL_opengl.h> - Это замена для <GL/gl.h>, которая вам не нужна, потому что у вас уже есть <GL\glew.h>.
+0

Большое вам спасибо, я так долго пытался заставить его работать. Добавление флага в SDL_CreateWindow() выполнило трюк. Я знаю, что код грязный (потому что я так долго возился с ним). – Chris

+0

Часть 'SDL_Quit' вполне спорна (например, valgrind); 'SDL_opengl.h' просто неправильно, он никогда не включается; это своего рода замена для 'gl.h'. – keltar

+0

@ keltar Хорошие моменты, я отредактировал ответ. – HolyBlackCat

1

Попробуйте добавить SDL_WINDOW_OPENGL к флагам создания окна.

Смежные вопросы