C++ OpenGL窗口显示背景窗口中的内容,而不是空白窗口

C++ OpenGL窗口显示背景窗口中的内容,而不是空白窗口,c++,linux,opengl,graphics,C++,Linux,Opengl,Graphics,我正在使用Linux并尝试学习OpenGL。我参考了learnopengl.com网站,并编写了第一个程序 我似乎在编译程序时没有遇到命令问题 g++ -Wall -lGLEW -lglfw -lGL -lX11 -lpthread -lXrandr -lXi ./foo.cpp 但当我运行程序时,它会从后面显示内容,而不是像这样的空白窗口 但是请注意,此窗口不是透明的,因为如果我移动窗口,背景是相同的。但是如果我最小化并重新打开窗口,背景是新创建的。这在专用GPU和集成GPU中都会发生 我

我正在使用Linux并尝试学习OpenGL。我参考了learnopengl.com网站,并编写了第一个程序

我似乎在编译程序时没有遇到命令问题

g++ -Wall -lGLEW -lglfw -lGL -lX11 -lpthread -lXrandr -lXi ./foo.cpp
但当我运行程序时,它会从后面显示内容,而不是像这样的空白窗口

但是请注意,此窗口不是透明的,因为如果我移动窗口,背景是相同的。但是如果我最小化并重新打开窗口,背景是新创建的。这在专用GPU和集成GPU中都会发生

我需要做什么才能使它正常工作

这里有一些信息

System:    Host: aditya-pc Kernel: 4.4.13-1-MANJARO x86_64 (64 bit gcc: 6.1.1)
           Desktop: KDE Plasma 5.6.4 (Qt 5.6.0) Distro: Manjaro Linux
Machine:   System: HP (portable) product: HP Notebook v: Type1ProductConfigId
           Mobo: HP model: 8136 v: 31.36
           Bios: Insyde v: F.1F date: 01/18/2016
CPU:       Dual core Intel Core i5-6200U (-HT-MCP-) cache: 3072 KB
           flags: (lm nx sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx) bmips: 9603
           clock speeds: max: 2800 MHz 1: 583 MHz 2: 510 MHz 3: 670 MHz 4: 683 MHz
Graphics:  Card-1: Intel Skylake Integrated Graphics bus-ID: 00:02.0
           Card-2: Advanced Micro Devices [AMD/ATI] Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330]
           bus-ID: 01:00.0
           Display Server: X.Org 1.17.4 drivers: ati,radeon,intel
           Resolution: 1920x1080@60.06hz
           GLX Renderer: Mesa DRI Intel HD Graphics 520 (Skylake GT2)
           GLX Version: 3.0 Mesa 11.2.2 Direct Rendering: Yes
两个图形卡的信息

Amd卡

$ DRI_PRIME=1 glxinfo|grep OpenGL
OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD HAINAN (DRM 2.43.0, LLVM 3.8.0)
OpenGL core profile version string: 4.1 (Core Profile) Mesa 11.2.2
OpenGL core profile shading language version string: 4.10
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 11.2.2
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 11.2.2
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
OpenGL ES profile extensions:
英特尔集成

$ DRI_PRIME=0 glxinfo|grep OpenGL
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2) 
OpenGL core profile version string: 3.3 (Core Profile) Mesa 11.2.2
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 11.2.2
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 11.2.2
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
OpenGL ES profile extensions:

从技术上讲,你所经历的是未定义的行为。发生了这样的事情:您的程序要求图形系统创建一个新窗口,因为这个窗口将与OpenGL一起使用,所以您正在使用的库(GLFW)要求图形系统不要自行清除该窗口(原因是播放动画时,图形系统清除帧绘制之间的窗口将导致闪烁,这是不需要的)

因此,创建新窗口时需要图形内存。目前,有两种方式向用户显示窗口。一种是屏幕外渲染和屏幕上合成。另一种是屏幕上帧缓冲区窗口和像素所有权测试。在您的情况下,您将获得两种方式中的较晚者。这意味着您的窗口基本上只是主屏幕帧缓冲区中的一个矩形,当它被创建为新的时,之前存在的任何内容都将保留在窗口中,直到使用所需的内容绘制为止

当然,这种“留下像素”的行为是没有指定的,它是最合理的实现行为的产物(在禁用Areo的Microsoft Windows上的行为相同)

所规定的是,当窗口在周围移动时,其内容也随之移动。图形硬件,即使是1980年代后期的ies,也有专门的内置电路来有效地实现这一点。但这只适用于窗口停留在屏幕帧缓冲区内的情况。如果将窗口部分拖动到屏幕外部区域,然后再返回,您将看到边界像素沿边缘复制


那么,为了得到一个定义的结果,你必须做些什么呢?好吧,你必须实际地在窗口中绘制一些东西(可能像清除它一样简单)——如果是双缓冲的,就交换缓冲区。

你已经添加代码在窗口上绘制了吗?如果没有,你看到的对于具有默认绘制代码的窗口来说是正常的。