SDL 无法创建 OpenGL 窗口

Posted

技术标签:

【中文标题】SDL 无法创建 OpenGL 窗口【英文标题】:SDL can't create OpenGL windows 【发布时间】:2016-03-18 09:58:13 【问题描述】:

这是我的代码:

void Game::init()

    SDL_Init(SDL_INIT_EVERYTHING);

    _window = SDL_CreateWindow("Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, _screenWidth, _screenHeight, SDL_WINDOW_OPENGL);

由于某种原因,这不起作用,但是当我将 SDL_WINDOW_OPENGL 替换为 SDL_WINDOW_RESIZABLESDL_WINDOW_FULLSCREEN 之类的东西时,它可以正常工作。当我使用SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN 时它也不起作用。有什么我能做的吗?

我在 Ubuntu 上使用 Kdevelop,如果这有什么不同的话。

更新:

所以我知道出了什么问题。事实证明,当您构建同时支持 GLX 和 EGL 的 SDL 时,它总是使用 EGL。我必须用--disable-video-opengles编译它

【问题讨论】:

SDL_GetError() 说什么? @TristanBrindle 它说“视频驱动程序不支持 OpenGL”...这很奇怪,因为我知道我的驱动程序支持它。 嗯,这给了你关于它为什么不工作的答案......我会检查你的视频驱动程序的安装,或者你的 SDL 库的编译标志 @TristanBrindle 好的,谢谢! 【参考方案1】:

是的,您很可能确实支持 OpenGL,但哪个版本?在 Ubuntu 上,您可以通过打开终端并输入 glxinfo | grep OpenGL 来获取此信息,这应该会为您提供支持的最高版本。之后,您需要在 SDL 中设置这些属性。例如,要创建 OpenGL 3.3 上下文:

SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

确保在创建上下文或窗口之前执行此操作。

【讨论】:

我确实尝试过。我知道我的显卡支持 OpenGL 3.5,但我认为问题出在 SDL。所有其他 3D 应用程序似乎都运行良好,包括 glxgear。 SDL_Init 应该是first SDL call in your program。 @Kash OpenGL 没有这样的版本,OpenGL 3 中的最高版本是 3.3 @Nasser 实际上最高版本是 4.5。它在 OpenGL 的网站上说:OpenGL 4.5... 甚至我的显卡网站都说我的模型支持 OpenGL 4.5(我不小心输入了 3.5) @Kash 我想你可能误解了我的评论,我说“OpenGL 3 的最高版本是 3.3”,我知道OpenGL 4.5。很抱歉造成混乱,也许我可以更清楚地表达出来。【参考方案2】:

您是否有双显卡设置,例如英伟达擎天柱?程序无法正常启动的原因可能是您的驱动程序没有从集成的 Intel GPU 切换到专用的 AMD 或 NVidia GPU。

我在朋友的笔记本电脑上至少遇到过一次这个问题。

【讨论】:

其实没有。我想到了。问题出在 SDL @Kash 你是怎么解决的?

以上是关于SDL 无法创建 OpenGL 窗口的主要内容,如果未能解决你的问题,请参考以下文章

SDL + OpenGL:创建缓冲区时访问冲突

OpenGL 不绘制到 SDL2 窗口

SDL OpenGL 窗口无响应,透明

SDL2:如何同时拥有 SDL2 菜单和 OpenGL 上下文?

SDL_Renderer opengl 冲突

SDL2 OpenGL 窗口立即关闭