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:
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:
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:
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 ...
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%