2016-07-09 4 views
1

Ich verwende Linux und versuche OpenGL zu lernen. Ich verweise auf die Website learnopengl.com und habe das erste Programm available here kompiliert.OpenGL-Fenster zeigt Zeug aus dem Hintergrund Windows statt leeres Fenster

Ich scheine das Programm ohne Problem zu kompilieren mit ihm

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

Befehl Aber wenn ich das Programm ausführen zeigt es Sachen von hinten, statt leerem Fenster, wie diese

enter image description here

Beachten Sie jedoch, dass dieses Fenster nicht transparent ist. Wenn Sie das Fenster verschieben, ist der Hintergrund identisch. Aber wenn ich das Fenster minimiere und wieder öffne, wird der Hintergrund neu erstellt. Dies geschieht sowohl für dedizierte als auch für integrierte GPU.

Was muss ich tun, damit es richtig funktioniert? Hier

einige Informationen

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: [email protected] 
      GLX Renderer: Mesa DRI Intel HD Graphics 520 (Skylake GT2) 
      GLX Version: 3.0 Mesa 11.2.2 Direct Rendering: Yes 

Die zwei Grafikkarte info

Amd Karte

$ 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: 

Intel integriert

$ 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: 
+2

Haben Sie den Code zum Zeichnen auf Ihrem Fenster noch hinzugefügt?Wenn nicht, ist das, was Sie sehen, normal für ein Fenster mit Standard-Zeichencode. –

Antwort

1

Technisch, was Sie erleben, ist un definiertes Verhalten Also hier ist was passiert: Ihr Programm fordert das Grafiksystem auf, ein neues Fenster zu erstellen, und da dieses Fenster mit OpenGL verwendet wird, fordert die verwendete Bibliothek (GLFW) das Grafiksystem auf, das Fenster nicht selbst zu löschen (Der Grund dafür ist, dass beim Abspielen von Animationen das Grafiksystem, das das Fenster zwischen den Frame-Draws löscht, Flicker verursacht, was unerwünscht ist).

Damit ein neues Fenster erstellt wird und dafür Grafikspeicher benötigt wird. Heutzutage gibt es zwei Möglichkeiten, dem Benutzer ein Fenster zu präsentieren. Eines ist das Off-Screen-Rendering mit Bildkomposition. Die andere ist eine Bildschirm-Framebuffer-Fensterung mit Pixeleigentums-Tests. In deinem Fall bekommst du den späteren der beiden. Das bedeutet, dass Ihr Fenster im Wesentlichen nur ein Rechteck im Framebuffer des Hauptbildschirms ist und wenn es neu erstellt wird, bleibt alles, was vorher dort war, im Fenster, bis es mit dem gewünschten Inhalt gezeichnet wird.

Natürlich ist dieses "Pixel zurückgelassen" Verhalten nirgends angegeben, es ist ein Artefakt, wie die vernünftigste Implementierung verhält (es verhält sich das gleiche auf Microsoft Windows mit Areo deaktiviert).

Was bedeutet, dass wenn ein Fenster verschoben wird, sein Inhalt mitbewegt wird. Grafikhardware, sogar so alt wie in den späten 1980-er Jahren, hat spezielle Schaltungen eingebaut, um dies effizient zu machen. Dies funktioniert jedoch nur so lange, wie das Fenster innerhalb des Bildschirm-Framebuffers bleibt. Wenn Sie das Fenster teilweise außerhalb des Bildschirmbereichs und wieder zurück ziehen, werden die Randpixel an den Kanten repliziert.

Was also müssen Sie tun, um ein definiertes Ergebnis zu erhalten? Nun, Sie müssen tatsächlich etwas zeichnen (es könnte so einfach sein wie das Löschen), und wenn es doppelt gepuffert ist, tauschen Sie die Puffer aus.

Verwandte Themen