Hintergrund:glCreateShader gibt gleiche ID
ich eine Shader-Klasse in meinem c haben ++/OpenGL3.1/GLSL/Qt-Programm. Mein Programm verwendet mehrere Shader basierend auf verschiedenen GLSL-Quelldateien.
Meine Anwendung kann viele verschiedene 3D-Renderer basierend auf der QGLWidget-Implementierung ausführen und jeder erstellt seine eigenen Shader.
Wenn ich meinen ersten 3D-Renderer erstelle und meine Shader initialisiere, werden Shader-IDs mit Hilfe von GlCreateShader & glCreateProgram ohne Probleme erzeugt.
Problem:
Aber wenn ich einen zweiten 3D-Renderer erstellen, geben die OGL Funktionen die ID Abrufen genau das gleiche, aber ich erwarte, dass neue haben. Das bedeutet, dass meine beiden Renderer die Daten an das gleiche GPU-Programm senden werden ...
Es ist offensichtlich, dass im GPU-Programm einheitliche Variablen gemischt sind und beim Ausführen des zweiten Renderers der erste Renderer ein seltsames Rendering anzeigt.
In der Tat, wenn ich einen der beiden Renderer schließe, werden alle Shader getötet ... und der zweite Renderer kann nichts anzeigen.
Idee?
Ich bin völlig verloren und meine logische Schlussfolgerung ist, dass glCreateShader & glCreateProgram ID entsprechend ihrer eigenen Thread-ID geben. QGLWidget läuft wahrscheinlich einen eigenen Thread zum Aufruf der Rendering-Funktionen, kann es die Persistenz stören ...
Eine Idee, wie Sie dieses Problem lösen?
Sind sie 'QGLWidget' oder' QOpenGLWidget'? Sie haben auch "QGLOpenGL" geschrieben. Wahrscheinlich hat der erstere das Verhalten gegeben, das du beschreibst ...? –
Ich verwende derzeit QGLWidget (es ist was ich meinte, gleiten). Zuerst habe ich den 'with glFormat'-ctor aufgerufen und dann versucht, einen Kontext für beide Widgets zu erzeugen und QGLWidget ctor mit ihrem jeweiligen Kontext und einem anderen Top-Level-Elternteil (QWidget * dynamisch instanziiert) zu erstellen. Ich habe immer noch das gleiche Problem. –
Ich habe auch versucht, 'QOpenGLWidget' anstelle von QGLWidget zu verwenden, immer noch mit zwei verschiedenen Eltern. An dieser Stelle scheint es, dass es funktioniert, aber meine OpenGL-Widgets sind in andockbaren Widgets, und wenn sie abgedockt sind, wird es komisch. Scheint instabil, der Hintergrund wird schwarz und bei Mausereignissen nicht aktualisiert. –