Richtig Verwendungen von QOpenGLFunctions

8

Ich arbeite gerade daran, das Qt5-GUI-Modul für den Zugriff auf OpenGL-Funktionen zu verwenden. Dann entdecke ich QOpenGLFunctions , was nützlich ist, weil:

  • Es schließt OpenGL für Desktop und OpenGL ES ein und stellt sicher, dass ich die OpenGL-API auf "portable" Weise benutze.
  • Ich muss mir keine Sorgen darüber machen, OpenGL-Header einzubinden, Qt macht es für mich.

Aber ich habe Zweifel über eine korrekte Art, es zu benutzen. In den folgenden Zeilen werden nur die drei Möglichkeiten aufgeführt, die ich über die Verwendung dieser Klasse weiß. Meine Frage ist: Gibt es eine gute Möglichkeit, QOpenGLFunctions zu verwenden?

Vererbt von QOpenGLFunctions

Qt offizielle Dokumentation sagt 'erben Sie Klasse von QOpenGLFunctions und verwenden Sie glXXXX-Klassen wie zuvor. Aber ich mag diesen Weg nicht so:

  • Wenn meine Klasse vorher von einer anderen Klasse erben sollte, muss ich eine Mehrfachvererbung vornehmen. Etwas, das ich nicht irgendwie bin. Selbst wenn solche Fälle sowieso sicher sind, ist es Ästhetik.
  • Jede glXXXX-Wrapping-Klasse ist nicht-const. Ich würde alle Methoden erzwingen, die OpenGL als nicht-konstant verwenden. Das macht nicht viel Sinn. Ja OpenGLFunctions class kann nicht-const sein, wenn ich glClear(...) mache, aber warum meine Methode DrawableShape::render(...) wäre?

Und über die Vererbung von QOpenGLFunctions . Sein Konstruktor akzeptiert möglicherweise ein Argument: den aktuellen OpenGL-Kontext. Dieser Parameter scheint mir sehr wichtig zu sein, aber keine Qt-Dokumentation ruft diesen Konstruktor auf. Stattdessen lassen sie den Compiler den No-Parameter-Konstruktor wählen.

Sie haben QOpenGLFunctions als Mitglied

Eine andere Idee sollte sein, eine Instanz von QOpenGLFunctions als Mitglied einer Klasse zu haben, die glXXXXX-Funktionen aufruft, oder zumindest einen Verweis auf eine Instanz, und alle OpenGL-Funktionen von dieser Instanz aufzurufen.

Übergabe von QOpenGLFunctions als Parameter

Für jede Funktion, die OpenGL verwendet, sendet der Aufrufer QOpenGLFunctions . Auf diese Weise:

%Vor%

Aber wie könnte ich sicher sein, dass diese Funktion es braucht und das nicht? Ich meine, der Quellcode wird mit der Zeit immer größer und ich fürchte das Risiko, dass jede Methode der Klassen diesen Parameter empfängt ...

    
Oragon Efreet 09.06.2014, 14:47
quelle

1 Antwort

1

Nach dem gleichen Prinzip anderer objektorientierter Wrapper-Bibliotheken können Sie eine kleine Variation Ihrer dritten Optionen in Betracht ziehen.

Definieren Sie eine Klasse, die Ihren aktuellen OpenGL-Kontext darstellt und QOpenGLFunctions ebenfalls erweitert.

%Vor%

Der Rendering-Thread initialisiert eine GL-Instanz, die den aktuellen Kontext bereitstellt, und übergibt ihn an alle Rendering-Instanzen, die OpenGL-Operationen ausführen müssen. Auf diese Weise können Sie sicher sein, dass Sie bei der Initialisierung und Verwendung von OpenGL-Strukturen und Puffern nicht mehrere Kontexte mischen.

%Vor%     
Pierluigi 02.10.2014, 07:56
quelle

Tags und Links