Я столкнулся с проблемой, когда SDL говорит, что он не поддерживает контексты OpenGL 3.x. Я стараюсь следовать этому руководству: Создание кросс-платформы OpenGL 3.2 Контекст в SDL (C/SDL). Я использую GLEW в этом случае, но я не мог заставить gl3.h работать с этим. Это код, в котором я закончил:
#include <glew.h>
#include <SDL.h>
int Testing::init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
printSDLError();
system("pause");
return 1; // Error
}
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//set double buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
//Create window
window = SDL_CreateWindow("OpenGL 3.2 test",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
600, 400, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(window == NULL) return 3; // Error
//Print errors to console if there are any
printSDLError(__LINE__);
//Set up OpenGL context.
glContext = SDL_GL_CreateContext(window);
printSDLError(__LINE__);
if(glContext == NULL)
{
DEBUGLINE("OpenGL context could not be created.");
system("pause");
return 4;
}
//Initialize glew
GLenum err = glewInit();
if(err != GLEW_OK)
{
DEBUGLINE("GLEW unable to be initialized: " << glewGetErrorString(err));
system("pause");
return 2;
}
return 0; // OK code, no error.
}
Единственная проблема, о которой идет речь, - это попытаться вызвать SDL_GL_CreateContext(window)
, где SDL сообщает, что "GL 3.x не поддерживается". Тем не менее, как учебник, так и этот образец пакета (который я не утруждал тестированием) сообщали об успехе в объединении SDL 1.3 и OpenGL 3.2. Я знаю, что SDL 1.3 находится в середине разработки, но я несколько сомневаюсь, что даже непреднамеренная поддержка будет удалена.
Контекст все еще создается, и GLEW может инициализировать только штраф. (Я не могу понять, насколько я должен видеть версию контекста, который был создан, поскольку он должен быть основным профилем, и я не знаю, как это найти. Согласно учебнику, SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3)
на самом деле ничего не делает, и в этом случае я не знаю, как создать соответствующий контекст или изменить контекст по умолчанию.)
EDIT: после некоторого тестирования благодаря полезной функции, которую дал мне Nicol, я обнаружил, что независимо от параметров, которые я передаю в SDL_GL_SetAttribute
, контекст всегда является версией 1.1. Однако включение любой версии ниже 3.0 не выплеснет ошибку, говоря, что она не поддерживается. Поэтому проблема в том, что "основная" версия SDL видит только 1.1.
Для записи я использую Visual С++ 2010 express, GLEW 1.7.0 и последнюю версию SDL 1.3. Я новичок в использовании всех трех из них, и мне пришлось вручную создавать библиотеки SDL для 32-разрядных и 64-разрядных версий, поэтому многое может пойти не так. Тем не менее, 32 и 64-битные версии делают то же самое.
EDIT: Я использую nVidia 360M GPU с последним драйвером, который OpenGL Extension Viewer 4.04 сообщает, что он полностью совместим с OpenGL 3.3.
Любая помощь приветствуется.
UPDATE. Мне удалось заставить SDL перестать кричать на меня, что он не поддерживает контексты 3.x. Проблема заключалась в том, что SDL_GL_SetAttribute
должен быть установлен BEFORE SDL_Init
:
//Request OpenGL 3.2 context.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
//Initialize SDL
if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
{
DEBUGLINE("Error initializing SDL.");
return 1; // Error
}
К сожалению, GLEW по-прежнему отказывается признать что-либо выше OpenGL 1.1 (только GLEW_VERSION_1_1 возвращает true), который все еще озадачен. glGetString(GL_VERSION)
также сообщает 1.1.0. Похоже, что моя программа просто не знает о каких-либо более высоких версиях, как будто я их вообще не устанавливаю.