SDL_GL_CreateContext()不起作用

时间:2017-03-24 14:51:10

标签: c++ opengl sdl

我正在尝试用SDL学习openGL。我的程序在家里的计算机上运行正常,但是在我学校的计算机上它无法正常工作。更具体地说,它并不适用于我学校的特定计算机型号OptiPlex 9030 AIO。当我调用函数SDL_GL_CreateContext()时,它返回null意味着它失败了。我的问题是为什么以及如何解决它?我一直试图弄清楚最近几天,我只是没有得到它。我认为唯一可能导致这个问题的是,它并不适合所有人使用的计算机使用intel hd 4000 gpu。

SDL_GetError()的输出是操作成功完成。

我正在为visual studio和openGL 4.5使用最新版本的SDL2开发人员库。

这是我的代码

this->window = NULL;
// Initialize SDL 
if (SDL_Init(SDL_INIT_VIDEO) < 0)
    sdl_die("Couldn't initialize SDL");
atexit(SDL_Quit);
SDL_GL_LoadLibrary(NULL); // Default OpenGL is fine.

// Request an OpenGL 4.5 context (should be core)
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);
// Also request a depth buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
// Request a debug context.
SDL_GL_SetAttribute(
    SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG
);

// Create the window
if (SCREEN_FULLSCREEN) {
    this->window = SDL_CreateWindow(
        caption,
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_OPENGL
    );
}
else {
    this->window = SDL_CreateWindow(
        caption,
        SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
        SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL
    );
}
if (this->window == NULL) sdl_die("Couldn't set video mode");


//not working code
this->maincontext = SDL_GL_CreateContext(this->window);
if (maincontext == NULL)
    sdl_die("Failed to create OpenGL context");

// Check OpenGL properties
printf("OpenGL loaded\n");
gladLoadGLLoader(SDL_GL_GetProcAddress);
printf("Vendor:   %s\n", glGetString(GL_VENDOR));
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("Version:  %s\n", glGetString(GL_VERSION));

// Enable the debug callback
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(this->openglCallbackFunction, nullptr);
glDebugMessageControl(
    GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, true
);

// Use v-sync
SDL_GL_SetSwapInterval(1);

// Disable depth test and face culling.
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);

int w, h;
SDL_GetWindowSize(this->window, &w, &h);
glViewport(0, 0, w, h);
glClearColor(0.0f, 0.5f, 1.0f, 0.0f);

我的sdl_die()代码也提供了错误信息

void sdl_die(const char * message)
{
    fprintf(stderr, "%s: %s\n", message, SDL_GetError());
    exit(2);
}

提前感谢。

1 个答案:

答案 0 :(得分:1)

代码对我来说没什么问题,所以你应该检查当前安装的GPU是否支持你所推荐的OpenGL-Version 4.5。您可以使用Caps-Viewer来检查(例如,您可以在此处找到一个:[GL-CapsViewer 1)。如果不是:确保安装了最新的GPU驱动程序,并检查GPU是否支持您请求的OpenGL版本。

如果不支持,请尝试将版本减少到3.1。