Я столкнулся с проблемой, когда SDL сообщает, что не поддерживает контексты OpenGL 3.x. Я пытаюсь следовать этому руководству: Создание межплатформенного контекста OpenGL 3.2 в SDL (C / SDL) . В этом случае я использую GLEW, но мне также не удалось заставить gl3.h работать с этим.Это код, с которым я закончил:
#include
#include
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)
на самом деле ничего не делает, и в этом случае я не знаю, как создать соответствующий контекст или изменить контекст по умолчанию.)
РЕДАКТИРОВАТЬ: После некоторого тестирования благодаря полезная функция, которую дал мне Никол, я обнаружил, что независимо от параметров, которые я передаю в SDL_GL_SetAttribute
, контекст всегда имеет версию 1.1. Однако установка любой версии ниже 3.0 не выдаёт ошибку, говоря, что она не поддерживается. Итак, проблема в том, что SDL видит только "базовую" версию 1.1.
Для записи, я использую Visual C ++ 2010 express, GLEW 1.7.0 и последнюю версию SDL 1.3. Я новичок в использовании всех трех из них, и мне пришлось вручную создавать библиотеки SDL как для 32-разрядной, так и для 64-разрядной версии, так что многое может пойти не так.Однако до сих пор 32 и 64-битные версии делают то же самое.
РЕДАКТИРОВАТЬ: Я использую графический процессор nVidia 360M с последней версией драйвера, который, как сообщает OpenGL Extension Viewer 4.04, имеет полную совместимость до OpenGL 3.3.
Любая помощь приветствуется.
ОБНОВЛЕНИЕ : мне удалось заставить SDL перестать кричать на меня, что он не поддерживает контексты 3.x. Проблема заключалась в том, что SDL_GL_SetAttribute
должен быть установлен ДО того, как будет вызван 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 возвращает истину), что по-прежнему озадачил меня. glGetString (GL_VERSION)
также сообщает о версии 1.1.0. Кажется, что моя программа просто не знает более высоких версий, как будто они у меня вообще не установлены.