使用 SDL2 指定 OpenGL 版本

Posted

技术标签:

【中文标题】使用 SDL2 指定 OpenGL 版本【英文标题】:Specify OpenGL version using SDL2 【发布时间】:2014-03-03 22:07:46 【问题描述】:

我在 OS X 10.9.2 上使用 Macbook air,我的显卡是 (Intel HD Graphics 4000 1024 MB) Apple 声明具有我的规格的 Macbook air 最高支持 Opengl 4.1,您可以在此处阅读 -> http://support.apple.com/kb/HT5942 。 但是,当我使用 SDL2 并强制系统使用 opengl 3.2 并且当我通过 glGetString() 查询 OpenGL 版本时,我得到以下行:

2.1 INTEL-8.24.11

我的代码:

#include <iostream>
#include <SDL2/SDL.h>
#include <opengL/gl3.h>

using namespace std;


void sdldie(const char *msg)

printf("%s: %s\n", msg, SDL_GetError());
SDL_Quit();
exit(1);




void checkSDLError(int line = -1)

#ifndef NDEBUG
const char *error = SDL_GetError();
if (*error != '\0')

    printf("SDL Error: %s\n", error);
    if (line != -1)
        printf(" + line: %i\n", line);
    SDL_ClearError();

#endif



int main(int argc, const char * argv[])



SDL_Window *mainwindow; /* Our window handle */
SDL_GLContext maincontext;

if (SDL_Init(SDL_INIT_VIDEO) < 0) /* Initialize SDL's Video subsystem */
    sdldie("Unable to initialize SDL");

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);

mainwindow = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                              512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if (!mainwindow) /* Die if creation failed */
    sdldie("Unable to create window");

checkSDLError(__LINE__);

/* Create our opengl context and attach it to our window */
maincontext = SDL_GL_CreateContext(mainwindow);
checkSDLError(__LINE__);

cout << glGetString(GL_VERSION);

/* This makes our buffer swap syncronized with the monitor's vertical refresh */
SDL_GL_SetSwapInterval(1);

/* Clear our buffer with a red background */
glClearColor ( 1.0, 0.0, 0.0, 1.0 );
glClear ( GL_COLOR_BUFFER_BIT );
/* Swap our back buffer to the front */
SDL_GL_SwapWindow(mainwindow);
/* Wait 2 seconds */
SDL_Delay(2000);

/* Same as above, but green */
glClearColor ( 0.0, 1.0, 0.0, 1.0 );
glClear ( GL_COLOR_BUFFER_BIT );
SDL_GL_SwapWindow(mainwindow);
SDL_Delay(2000);

/* Same as above, but blue */
glClearColor ( 0.0, 0.0, 1.0, 1.0 );
glClear ( GL_COLOR_BUFFER_BIT );
SDL_GL_SwapWindow(mainwindow);
SDL_Delay(2000);

/* Delete our opengl context, destroy our window, and shutdown SDL */
SDL_GL_DeleteContext(maincontext);
SDL_DestroyWindow(mainwindow);
SDL_Quit();



return 0;

【问题讨论】:

【参考方案1】:

在 OSX 上,您需要为 2.1 后的版本请求核心上下文。

尝试将此添加到您的属性中:

SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE );

【讨论】:

顺便说一句,虽然我指定了 3.2 版,但它显示的是 4.1 INTEL-8.24.11 这是否意味着我可以使用 opengl 4.1? 是的。虽然在其他系统上它可能只给你 3.2。因此,如果您确实想要使用 4.1,请务必请求 4.1。

以上是关于使用 SDL2 指定 OpenGL 版本的主要内容,如果未能解决你的问题,请参考以下文章

SDL2 使用高版本opengl

如何让 OpenGL-ES 在带有 SDL2 的 Raspberry Pi 上工作?

SDL2中使用OpenGL绘图

使用 SDL2 和 OpenGL 显示蓝色

SDL2 / Opengl3 无法显示任何内容

SDL2 OpenGL 窗口立即关闭