c++ - SDL_GL_CreateContext() 不工作

标签 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);
}

提前致谢。

最佳答案

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

如果不支持,请尝试将版本降低到 3.1。

关于c++ - SDL_GL_CreateContext() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43002599/

相关文章:

c++ - 枚举的 reinterpret_cast 错误

c++ - Vulkan 统一着色器数据

c++ - 使用 pow() 时的 GLSL 问题

java - GLSL 统一行为

c++ - 头文件中的变量未在范围内声明

C++11 动态线程池

c++ - 奇怪的链接器错误

c - 链接到 libGL 添加了对 NVidia 库的引用

c++ - 未延迟的无限 while 循环是不好的做法吗?

python - SDL: "working natively in C++"是什么意思?