在 Linux + Intel 驱动程序上启用合成时,OpenGL 应用程序出现奇怪的效果

Strange effects with OpenGL app when compositing is enabled on Linux + Intel driver

我在使用这个非常简单的 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;
}

此代码应该只显示一个空白 window。当 运行 使用 NVidia 驱动程序时,它可以工作(即使启用了 window 管理器合成器),但是当我 运行 使用英特尔驱动程序和启用合成器时,我随机得到一个全黑屏幕大约一秒钟,然后 window 显示,然后黑屏又回来等等。 当我在 运行 程序之前使用 Alt+Shift+F12 禁用我的合成器 (KWin 5.10.4) 时,它可以工作。我还使用 Mutter(GNOME 合成器)对其进行了测试,结果也是如此。 如果我注释掉所有 SDL_GL_SetAttribute 部分、SDL_GLContext 变量声明,并将 SDL_WINDOW_OPENGL 更改为 SDL_WINDOW_SHOWN(基本上如果我将 window 设置为由 SDL 管理)。

我什至尝试使用 glfw 而不是 SDL,但我遇到了同样的问题。

我该如何解决?

更新:如果我在 KDE 合成器设置中禁用垂直同步,该程序也能正常工作。

您正在交换一个您从未清除过的帧缓冲区或绘制一个覆盖图元的帧缓冲区。因此结果是不确定的,可能会出现任何类型的输出。

glClear(GL_COLOR_BUFFER_BIT) 添加到您的内部绘图循环并查看它的作用。