Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.12.2022, 08:16

Mehrere OpenGL-Instanzen in einer Applikation?

Hi,

ich habe hier eine Anwendung, welche von OpenGL Gebrauch macht (da wxWidgets als Basis verwendet wird, ist es kein reines OpenGL, aber das Prinzip bleibt das gleiche). Der Code sieht dabei im Prinzip folgendermaßen aus:

- wenn ein solcher OpenGL-View erzeugt wird, so passiert das alles in eigenen Objekten, sprich es ist alles gekapselt und zumindest meine Applikation verwendet keine globalen Variablen

- während der Erzeugung werden alle Strukturen neu angelegt, Shaders mit glCreateShader() erzeugt, Shader-Programme mit glCreateProgram() neu angelegt etc.

- wenn ein solcher OpenGL-View wieder gelöscht wird, so werden im Destruktor alle Ressourcen wieder freigegeben, also z.B. Shaders mit glDeleteShader() gelöscht

Das funktioniert so weit hervorragend, so lange nur ein OpenGL-View verwendet wird.

Wenn ich aber

- einen OpenGL-View erzeuge

- einen zweiten OpenGL-View mit komplett eigenen Objekten und in einem eigenen Fenster erzeuge

- den zweiten View wieder lösche

...dann funktioniert der Erste nicht mehr richtig. Sprich es wird noch alles angezeigt, aber die Anzeige ist statisch. Ursache ist, dass keines der Shaderprogramme in den bestehenden Elementen mehr gefunden wird und z.B. ein Aufruf

transformLoc = glGetUniformLocation(element->shaderProgram,"inputTransform");

immer nur 0 zurückliefert. Heißt, das Shaderprogramm ist nicht mehr vorhanden/"inputTransform" kann nicht mehr gefunden werden.

Das lässt mich jetzt vermuten, dass die Deinitialisierung des zweiten OpenGL-Views irgendwas gelöscht hat, was vom ersten View noch benötigt werden würde. Deswegen meine Frage: ist in OpenGL irgendwas zu beachten, wenn mehrere Views verwendet werden sollen? Oder gibt es irgend eine globale Initialiasierung, die das Verhalten erklären würde (und die ich aktuell nicht sehen kann, weil sie irgendwo in wxWidgets gekapselt ist)?

Bin für jeden Hinweis dankbar :-)

Jonathan

Community-Fossil

  • Private Nachricht senden

2

13.12.2022, 08:30

Was du mit "alles in eigenen Objekten" meinst ist mir nicht ganz klar. OpenGL ist ja eine State-Machine mit haufenweise globaler Variablen auf die man nicht direkt Zugriff hat, und das macht eben leider eine Menge Probleme.


Paralleles OpenGL hab ich nie wirklich gemacht, aber es gibt ja zumindest das Prinzip der Contexte, das schon so in die Richtung geht:

https://www.khronos.org/opengl/wiki/OpenGL_Context

Vielleicht reicht es ja schon, für beide Programmteile unterschiedliche Contexte zu verwenden und die entsprechend richtig zu managen.
Lieber dumm fragen, als dumm bleiben!

3

13.12.2022, 09:38

Was du mit "alles in eigenen Objekten" meinst ist mir nicht ganz klar.


Ich meine Objekte im Sinne objektorientierter Programmierung. Sprch der Code ist in einer eigenen Klasse enthalten und für jeden neuen OpenGL-View wird eine neue Instanz dieser Klasse erzeugt. D.h. alle Variablen etc. existieren exklusiv nur für diese Instanz und werden nicht global verwendet (also werden auch nicht global gelöscht nur weil eine Instanz entfernt wird).

4

13.12.2022, 11:08

Update: wie ich gerade sehe, schlägt der Aufruf zu glCreateProgram() fehl, wenn das Problem auftritt. Die Funktion liefert 0 zurück und ein anschließender Aufruf glGetError() liefert den Fehlercode 0x0502 (aka GL_INVALID_OPERATION).

5

13.12.2022, 14:10

Und Lösung gefunden: aus irgend einem Grund geht der Kontext verloren. Wenn ich dem ersten OpenGL-View diesen nach dem Schließen des Dialoges wieder setze, dann funktioniert es wie gewünscht!

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

14.12.2022, 11:27

OpenGL ist eigentlich auf einen Kontext pro Prozess festgenagelt - alles globaler State, wie Jonathan schon schrieb. Es hat aber auch so ContextSwitch-Befehle, mit dem man zwischen mehreren Kontexten hin- und herschalten kann. Keine Ahnung mehr, wie die hießen. Und das Internet warnte, dass ein Kontextwechsel sacklangsam sei.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige