Создание контекста OpenGL 3.2/3.x в SDL 1.3
Я столкнулся с проблемой, когда 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. Похоже, что моя программа просто не знает о каких-либо более высоких версиях, как будто я их вообще не устанавливаю.
Ответы
Ответ 1
так как я не знаю, вы уже нашли решение, вот мое:
Я изо всех сил изо всех сил старался сегодня и вчера с этим. Невозможно использовать расширенные функции GL, поэтому я даже отлаживал файл opengl32.dll, чтобы увидеть, что он действительно работает и переносит вызовы в DLL OpenGL, специфичную для аппаратного обеспечения (nvoglnt.dll). Так что, должно быть, была другая причина. Были даже советы в Интернете, чтобы ссылаться на opengl32.lib перед всеми другими библиотеками, потому что SelectPixelFormat и некоторые другие функции перезаписываются друг другом.
Но это тоже не было причиной. Мое решение состояло в том, чтобы включить ускоренные визуальные эффекты здесь:
// init SDL
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_HAPTIC | SDL_INIT_TIMER) < 0) {
fprintf(stderr, "Could not init SDL");
return 1;
}
// we must wish our OpenGL Version!!
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
потому что в текущей версии SDL (15 декабря 2011 г.) он проверяет ее в SDL_windowsopengl.c
if (_this->gl_config.accelerated >= 0) {
*iAttr++ = WGL_ACCELERATION_ARB;
*iAttr++ = (_this->gl_config.accelerated ? WGL_FULL_ACCELERATION_ARB :
WGL_NO_ACCELERATION_ARB);
}
и этот атрибут инициализируется -1, если вы не определили его самостоятельно.
И: Никогда устанавливать атрибуты версии перед инициализацией SDL, потому что для атрибутов настроек требуется правильная инициализация видеообъекта!
Надеюсь, это поможет.
Ответ 2
Я последовал этому руководству. Все отлично работает на windowsz и linux.
http://people.cs.uct.ac.za/~aflower/tutorials.html