Я запускаю отображение, рендерер и контекст 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, и мне нужно использовать другую библиотеку для связывания этих функций?
glClearColor (...)
иglClear (...)
являются частью OpenGL 1.0.glCreateProgram (...)
является частью GL 2.0, аglActiveTexture (...)
является частью GL 1.3. Вам нужен GLEW, чтобы получить эти функции на такой платформе, как Windows, которая предоставляет только OpenGL 1.1 и оставляет все, что новее, на усмотрение драйвера дисплея для расширения во время выполнения. Я бы посоветовал вам сделать что-то для этого:const GLchar* version = glGetString (GL_VERSION), renderer = glGetString (GL_RENDERER); printf ("%s %s\n", version, renderer);
и изменить свой вопрос с этой информацией. - person Andon M. Coleman   schedule 24.01.2014SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, versionNumber);
иSDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, versionNumber);
- person BWG   schedule 24.01.2014(*context = SDL_GL_CreateContext(display)) == NULL
и никогда не дает NULL? - person BWG   schedule 24.01.2014glGetString (...)
. Похоже, вы делаете это в классе, и вы можете создавать экземпляр своего класса до создания контекста. - person Andon M. Coleman   schedule 24.01.2014