C 在Linux+;英特尔驱动程序

C 在Linux+;英特尔驱动程序,c,linux,opengl,sdl,intel,C,Linux,Opengl,Sdl,Intel,我对这个非常简单的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);

我对这个非常简单的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;
}
#包括
#包括
#包括
int main(){
SDL_Init(SDL_Init_视频);
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_设置属性(SDL_GL_模具尺寸,8);
SDL_Window*Window=SDL_CreateWindow(“OpenGL”,SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,800,600,SDL_Window_OpenGL);
SDL_GLContext context=SDL_GL_CreateContext(窗口);
SDL_事件窗口事件;
while(true){
if(SDL_PollEvent(&windowEvent)){
如果(windowEvent.type==SDL_QUIT)中断;
}
SDL_GL_SwapWindow(窗口);
}
SDL_GL_DeleteContext(上下文);
SDL_退出();
返回0;
}
这段代码应该只显示一个空白窗口。当使用NVidia驱动程序运行它时,它可以工作(即使启用了窗口管理器合成器),但当我使用Intel驱动程序和合成器运行它时,我会随机获得一个大约一秒钟的全黑屏,然后窗口显示,然后黑屏返回等。 当我在运行程序之前用
Alt+Shift+F12
禁用合成器(KWin 5.10.4)时,它会工作。我还用Mutter(侏儒合成器)测试了它,同样的情况也发生了。 如果我注释掉所有
SDL\u GL\u SetAttribute
部分,注释掉
SDL\u GLContext
变量声明,并更改
SDL\u WINDOW\u OPENGL
,显示
SDL\u WINDOW\u
(基本上如果我将该窗口设置为由SDL管理的话),那么该程序就会工作

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

我该如何解决它


更新:如果我在KDE合成器设置中禁用vsync,该程序也会工作。

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


将一个
glClear(GL\u COLOR\u BUFFER\u BIT)
添加到您的内部绘图循环中,并查看它的作用。

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

glClear(GL\u COLOR\u BUFFER\u BIT)
添加到内部绘图循环中,然后查看它的作用