2017-02-17 16 views
0

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?

+0

Sind sie 'QGLWidget' oder' QOpenGLWidget'? Sie haben auch "QGLOpenGL" geschrieben. Wahrscheinlich hat der erstere das Verhalten gegeben, das du beschreibst ...? –

+0

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. –

+0

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. –

Antwort

3

Wenn sich beide QOpenGLWidgets im selben übergeordneten Fenster befinden, haben sie standardmäßig denselben Kontext. Wenn Sie das nicht möchten, ist es wahrscheinlich einfacher, ein neues Top-Level-Widget (beliebiges QWidget ohne Eltern) mit Ihrem zweiten QOpenGLWidget zu erstellen.

Bitte beachten Sie, dass dies sich von der älteren QGLWidget-Klasse unterscheidet. From Qt documentation:

Wenn mehrere QOpenGLWidgets als Kinder der gleichen Widget der obersten Ebene hinzugefügt werden, miteinander teilen sich ihre Kontexte. Dies gilt nicht für QOpenGLWidget-Instanzen, die zu verschiedenen Fenstern gehören.

Das bedeutet, dass alle QOpenGLWidgets im selben Fenster auf die gemeinsam nutzbaren Ressourcen des jeweiligen Benutzers, wie z. B. Texturen, zugreifen können und kein zusätzlicher globaler Freigabe-Kontext wie bei QGLWidget erforderlich ist.

+0

Das klappt endlich perfekt. Vielen Dank. –

+0

Glücklich es geholfen! Zögere nicht zu erzählen, wenn du denkst, dass es noch etwas zu erwähnen gibt, das dir geholfen hat. –

+0

Ich entdeckte, dass glReadPixels nicht wie erwartet mit der OpenGLWidget-Klasse funktionierte. Es gibt ein in der Anwendung ausgewähltes Bild aus der linken unteren Ecke zurück, anstatt die OGL-Canevas zu lesen. Dieser ftn sollte sich nicht der globalen Anwendung -pixels- sondern nur des OGL-wdgts bewusst sein. Und es liest nicht den guten Puffer und wählt ein Bild von dem angezeigten anstelle des hinteren aus, unabhängig von glReadBuffer-Aufrufen. In ccl verwende ich entweder das OGL-Widget nicht wie erwartet, aber die Dokumentation ist nicht wirklich klar, was mit den Puffern zu tun ist, oder es bedarf noch einiger Modifikationen. –

2

Es gibt kein Problem zu lösen.

Jedes QGLWidget hat seine eigene OpenGL context. Und, außer Sie sind explizit teilen Objekte zwischen ihnen, hat jeder Kontext seine eigene separate Liste von Objekten.

Sie können ein OpenGL-Objekt nur mit dem OpenGL-Kontext verwenden, der es erstellt hat. Solange Sie die Objekte getrennt halten und sie nur mit dem Kontext verwenden, der sie erstellt hat, sollten Sie in Ordnung sein.

Verwandte Themen