QOpenGLVertexArrayObject Class

Die Klasse QOpenGLVertexArrayObject umhüllt ein OpenGL-Vertex-Array-Objekt. Mehr...

Kopfzeile: #include <QOpenGLVertexArrayObject>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
Vererbt: QObject

Öffentliche Typen

class Binder

Öffentliche Funktionen

QOpenGLVertexArrayObject(QObject *parent = nullptr)
virtual ~QOpenGLVertexArrayObject()
void bind()
bool create()
void destroy()
bool isCreated() const
GLuint objectId() const
void release()

Detaillierte Beschreibung

Ein Vertex Array Object (VAO) ist ein OpenGL-Container-Objekt, das den Status kapselt, der benötigt wird, um der OpenGL-Pipeline Daten zu den einzelnen Vertex-Attributen zu übergeben. Anders ausgedrückt, ein VAO speichert die Zustände von Pufferobjekten (siehe QOpenGLBuffer) und deren zugehörigen Status (z.B. Vertex-Attribut-Divisoren). Dies ermöglicht eine sehr einfache und effiziente Methode zum Umschalten zwischen OpenGL-Pufferzuständen für das Rendern verschiedener "Objekte" in einer Szene. Die Klasse QOpenGLVertexArrayObject ist ein dünner Wrapper um eine OpenGL VAO.

Für den Desktop werden VAOs als Kernfunktion in OpenGL 3.0 oder neuer und durch das GL_ARB_vertex_array_object für ältere Versionen unterstützt. Bei OpenGL ES 2 werden VAOs durch die optionale Erweiterung GL_OES_vertex_array_object bereitgestellt. Sie können die Version von OpenGL mit QOpenGLContext::surfaceFormat() und das Vorhandensein von Erweiterungen mit QOpenGLContext::hasExtension() überprüfen.

Wie bei den anderen Qt OpenGL Klassen hat QOpenGLVertexArrayObject eine create() Funktion, um das zugrundeliegende OpenGL Objekt zu erstellen. Damit kann der Entwickler sicherstellen, dass ein gültiger aktueller OpenGL-Kontext vorhanden ist.

Sobald Sie erfolgreich ein VAO erstellt haben, ist das typische Verwendungsmuster:

  • In der Initialisierungsfunktion der Szene, für jedes visuelle Objekt:
    • Binden Sie die VAO
    • Setzen des Vertex-Datenstatus für dieses visuelle Objekt (Scheitelpunkte, Normalen, Texturkoordinaten usw.)
    • Entbinden (release()) des VAOs
  • In der Renderfunktion, für jedes visuelle Objekt:
    • Binden Sie die VAO (und das Shader-Programm, falls erforderlich)
    • Aufruf einer glDraw*()-Funktion
    • Aufheben der Bindung (release()) der VAO

Das Binden der VAO in der Renderfunktion hat zur Folge, dass der gesamte Zustand der Vertex-Daten, der in der Initialisierungsphase eingerichtet wurde, wiederhergestellt wird. Auf diese Weise können wir beim Einrichten eines VAOs viele Zustände festlegen und effizient zwischen den Zustandsgruppen der zu rendernden Objekte wechseln. Die Verwendung von VAOs ermöglicht es dem OpenGL-Treiber auch, die Validierungsprüfungen der Vertexdaten zu amortisieren.

Hinweis: Vertex Array Objects sind, wie alle anderen OpenGL-Container-Objekte, spezifisch für den Kontext, für den sie erstellt wurden, und können nicht innerhalb einer Kontextgruppe gemeinsam genutzt werden.

Siehe auch QOpenGLVertexArrayObject::Binder und QOpenGLBuffer.

Dokumentation der Mitgliedsfunktionen

[explicit] QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject *parent = nullptr)

Erzeugt ein QOpenGLVertexArrayObject mit dem angegebenen parent. Sie müssen create() mit einem gültigen OpenGL-Kontext aufrufen, bevor Sie es verwenden.

[virtual noexcept] QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()

Zerstört die QOpenGLVertexArrayObject und die zugrunde liegende OpenGL-Ressource.

void QOpenGLVertexArrayObject::bind()

Bindet dieses Vertex-Array-Objekt an den OpenGL-Bindungspunkt. Von diesem Zeitpunkt an und bis zum Aufruf von release() oder bis ein anderes Vertex-Array-Objekt gebunden wird, werden alle Änderungen, die am Vertex-Datenstatus vorgenommen werden, in diesem Vertex-Array-Objekt gespeichert.

Wenn dann ein anderes Vertex-Array-Objekt gebunden wird, können Sie später den mit diesem Objekt verknüpften Zustand wiederherstellen, indem Sie bind() für dieses Objekt erneut aufrufen. Dies ermöglicht einen effizienten Wechsel zwischen Scheitelpunktdatenzuständen in Rendering-Funktionen.

bool QOpenGLVertexArrayObject::create()

Erzeugt das zugrundeliegende OpenGL-Vertex-Array-Objekt. Es muss ein gültiger OpenGL-Kontext vorhanden sein, der Vertex-Array-Objekte unterstützt, damit diese Funktion erfolgreich ist.

Gibt true zurück, wenn das OpenGL-Vertex-Array-Objekt erfolgreich erstellt wurde.

Wenn der Rückgabewert false ist, ist die Unterstützung für Vertex-Array-Objekte nicht verfügbar. Dies ist kein Fehler: Auf Systemen mit OpenGL 2.x oder OpenGL ES 2.0 werden Vertex-Array-Objekte möglicherweise nicht unterstützt. Der Anwendung steht es in diesem Fall frei, die Ausführung fortzusetzen, aber sie muss dann auch darauf vorbereitet sein, in einer VAO-losen Weise zu arbeiten. Das bedeutet, dass anstelle eines einfachen Aufrufs von bind() der Wert von isCreated() überprüft werden muss und die Vertex-Arrays auf herkömmliche Weise initialisiert werden müssen, wenn kein Vertex-Array-Objekt vorhanden ist.

Siehe auch isCreated().

void QOpenGLVertexArrayObject::destroy()

Zerstört das zugrunde liegende OpenGL-Vertex-Array-Objekt. Es muss ein gültiger OpenGL-Kontext vorhanden sein, der Vertex-Array-Objekte unterstützt, damit diese Funktion erfolgreich ist.

bool QOpenGLVertexArrayObject::isCreated() const

Gibt true zurück, wenn das zugrundeliegende OpenGL-Vertex-Array-Objekt erstellt worden ist. Wenn dies true zurückgibt und der zugehörige OpenGL-Kontext aktuell ist, dann können Sie bind() dieses Objekt verwenden.

GLuint QOpenGLVertexArrayObject::objectId() const

Gibt die ID des zugrunde liegenden OpenGL-Vertex-Array-Objekts zurück.

void QOpenGLVertexArrayObject::release()

Hebt die Bindung dieses Vertex-Array-Objekts auf, indem das Standard-Vertex-Array-Objekt (id = 0) gebunden wird.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.