当前位置: 首页 > 知识库问答 >
问题:

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

高高雅
2023-03-14

我正在使用Linux并试图学习OpenGL。我参考了learnopengl.com网站,并在这里编译了第一个可用的程序。

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

g++ -Wall -lGLEW -lglfw -lGL -lX11 -lpthread -lXrandr -lXi ./foo.cpp

但是当我运行程序时,它会从后面显示东西,而不是像这样的空白窗口

但是请注意,此窗口不透明,因为如果我移动窗口,背景是相同的。但是,如果我最小化并重新打开窗口,则背景是新创建的。专用和集成 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:

共有1个答案

全鸿晖
2023-03-14

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

这样就创建了一个新窗口,它需要图形内存。现在有两种方式向用户呈现窗口。一种是屏幕外渲染和屏幕上合成。另一种是屏幕上的帧缓冲区窗口和像素所有权测试。在你的情况下,你会得到两者中的后者。这意味着您的窗口实际上只是主屏幕帧缓冲区中的一个矩形,当它被创建为新的时,之前存在的任何内容都将保留在窗口中,直到用所需的内容绘制。

当然,这种“留下像素”的行为在任何地方都没有指定,它是最合理的实现行为的产物(它在Microsoft Windows上的行为相同,但禁用了Area o)。

指定的是,当窗口在屏幕周围移动时,其内容也会随之移动。即使是1980年代后期的图形硬件也内置了特殊的电路来有效地执行此操作。但这只能在窗口停留在屏幕帧缓冲区内时有效。如果您将窗口部分拖出屏幕区域并再次拖回,您会看到边框像素沿边缘复制。

那么你要怎么做才能得到一个确定的结果呢?好吧,你将不得不实际绘制一些东西(可能就像清除它一样简单)到窗口——如果是双缓冲的,交换缓冲区。

 类似资料:
  • 我尝试使用OpenGL绘制贝塞尔曲面。我的程序读取一个输入文件,其中包含用于绘图的采样点数量、用于表面着色的控制点和调色板。它必须输出一个带有曲面图的新窗口,我可以在其中操纵曲面和控制点的属性。 从Bernstein多项式生成的点被三角化,并通过从三角形的最小和最大高度映射它来按调色板分配颜色。 不幸的是,它打开了一个窗口,其中当前窗口的一部分在操作系统中打开,而没有为surface创建新界面。

  • 我在这里遵循GLUT教程。我将第一个示例“YAT”复制并粘贴到xcode中,稍微修改了包含,发现出现了一个空白窗口。未修改的代码设置为显示线框茶壶。对我来说,这不会发生。 但是,如果我取消对创建金牛座的注释,则金牛座和茶壶的一部分会出现在窗口中。在//draw下,似乎还有一些随机的非注释行和注释行的组合,它们实际上会导致对象出现……或者只是一个空白屏幕。 P、 我知道每个人都说不要使用GLUT,但

  • 这是我的代码,请记住,我在几天前学习了python,所以我的代码可能制作不正确,等等。我正在尝试制作一个窗口,该窗口将显示一些文本(测试版),并将显示两个小矩形,我想成为按钮。

  • 在过去的几天里,我一直在解决这个问题。尝试在

  • 我通过GLX在Linux中编写了一个OpenGL应用程序。它使用双缓冲与glXSwapBuffers和同步到VBlank设置通过NVIDIA X服务器设置设置。我正在使用Compiz,并且可以平滑地移动窗口并且没有撕裂(在Compiz设置中启用了同步到VBlank)。但当我 > 尝试移动 OpenGL 窗口或调整其大小,或 通过OpenGL窗口占用的区域移动其他窗口 系统断断续续,停顿3-4秒。将