作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用这个非常简单的 SDL2+OpenGL 代码时遇到问题:
#include <GL/glew.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
int main() {
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
SDL_Window *window = SDL_CreateWindow("OpenGL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_OPENGL);
SDL_GLContext context = SDL_GL_CreateContext(window);
SDL_Event windowEvent;
while(true) {
if(SDL_PollEvent(&windowEvent)) {
if(windowEvent.type == SDL_QUIT) break;
}
SDL_GL_SwapWindow(window);
}
SDL_GL_DeleteContext(context);
SDL_Quit();
return 0;
}
这段代码应该只显示一个空白窗口。当使用 NVidia 驱动程序运行它时它可以工作(即使启用了窗口管理器合成器),但是当我使用英特尔驱动程序运行它并启用合成器时我随机得到一个全黑屏幕大约一秒钟,然后窗口显示,然后是黑色屏幕回来等。当我在运行程序之前使用 Alt+Shift+F12
禁用我的合成器 (KWin 5.10.4) 时,它可以工作。我还使用 Mutter(GNOME 合成器)对其进行了测试,结果也是如此。如果我注释掉所有 SDL_GL_SetAttribute
部分、SDL_GLContext
变量声明,并将 SDL_WINDOW_OPENGL
更改为 SDL_WINDOW_SHOWN
(基本上如果我将窗口设置为由 SDL 管理)。
我什至尝试使用 glfw
而不是 SDL
,但我遇到了同样的问题。
我该如何解决?
更新:如果我在 KDE 合成器设置中禁用垂直同步,该程序也能正常工作。
最佳答案
您正在交换一个您从未清除过的帧缓冲区或绘制一个覆盖图元的帧缓冲区。因此结果是不确定的,可能会出现任何类型的输出。
将 glClear(GL_COLOR_BUFFER_BIT)
添加到您的内部绘图循环中,看看它做了什么。
关于c - 在 Linux + Intel 驱动程序上启用合成时,OpenGL 应用程序会产生奇怪的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45756875/
我是一名优秀的程序员,十分优秀!