Я использую SDL2 для взаимодействия с ОС и GLEW для загрузки функций OpenGL. Первоначально у меня были вызовы SDL_GL_SetAttribute() между созданием окна и созданием контекста. Я заметил, что мои вызовы SDL_GL_SetAttribute() малоэффективны, поэтому я перечитал документацию и обнаружил, что " Запрошенные атрибуты должны быть установлены перед созданием окна OpenGL". Если я попытаюсь это сделать, мне удастся получить только контекст OpenGL 1.1 (тот, который поставляет Microsoft). Если я вообще не вызываю SDL_GL_SetAttribute(), я без проблем получаю контекст 4.4.
Я заметил одну странную вещь: мои вызовы SDL_GL_GetAttribute() после создания контекста возвращают неточные значения. Если я не устанавливаю какие-либо атрибуты, я получаю:
SDL GL Context Major Version: 2
SDL GL Context Minor Version: 1
SDL GL Context Profile: Unknown
SDL GL Accelerated Visuals: True
SDL GL Double Buffering: True
SDL GL Depth Size: 24
----------------------------------------------------------------
Graphics Successfully Initialized
OpenGL Info
Version: 4.4.0
Vendor: NVIDIA Corporation
Renderer: GeForce GT 650M/PCIe/SSE2
Shading: 4.40 NVIDIA via Cg compiler
----------------------------------------------------------------
Если я выполню установку всех атрибутов, я получу:
SDL GL Context Major Version: 3
SDL GL Context Minor Version: 1
SDL GL Context Profile: Compatibility
SDL GL Accelerated Visuals: True
SDL GL Double Buffering: True
SDL GL Depth Size: 32
----------------------------------------------------------------
Graphics Successfully Initialized
OpenGL Info
Version: 1.1.0
Vendor: Microsoft Corporation
Renderer: GDI Generic
Shading: (null)
----------------------------------------------------------------
Обратите внимание, что в первом случае SDL говорит, что у меня контекст 2.1, а на самом деле я получаю контекст 4.4. Во втором случае он говорит, что у меня есть контекст 3.1 (то, что я просил), хотя на самом деле у меня есть контекст 1.1.
Мой текущий код установки (который соответствует тому, что описано в этом руководстве а>). Проверка ошибок опущена для краткости.
СДЛ
SDL_Init(SDL_INIT_VIDEO);
// Request compatibility because GLEW doesn't play well with core contexts.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32);
SDL_Window * window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(window);
SDL_GL_MakeCurrent(window, context)
// Print what the OS actually gave us for each value we requested.
SDL_GL_GetAttribute(/* ... */);
Непосредственно за ним следует GLEW
glewExperimental = GL_TRUE;
GLenum result = glewInit();
if(result != GLEW_OK)
{
// Handle & print error
}
if(GLEW_VERSION_1_1)
{
printf("----------------------------------------------------------------\n");
printf("Graphics Successfully Initialized\n");
printf("OpenGL Info\n");
printf(" Version: %s\n", glGetString(GL_VERSION));
printf(" Vendor: %s\n", glGetString(GL_VENDOR));
printf(" Renderer: %s\n", glGetString(GL_RENDERER));
printf(" Shading: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
printf("----------------------------------------------------------------\n");
}
else
{
printf("Unable to get any OpenGL version from GLEW!");
}
if(!GLEW_VERSION_3_1)
{
// Handle & print error
}