QOpenGLTextureBlitter Class

Die Klasse QOpenGLTextureBlitter bietet eine bequeme Möglichkeit, texturierte Quads über OpenGL zu zeichnen. Mehr...

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

Öffentliche Typen

enum Origin { OriginBottomLeft, OriginTopLeft }

Öffentliche Funktionen

QOpenGLTextureBlitter()
~QOpenGLTextureBlitter()
void bind(GLenum target = GL_TEXTURE_2D)
void blit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin sourceOrigin)
void blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform)
bool create()
void destroy()
bool isCreated() const
void release()
void setOpacity(float opacity)
void setRedBlueSwizzle(bool swizzle)
bool supportsExternalOESTarget() const
bool supportsRectangleTarget() const

Statische öffentliche Mitglieder

QMatrix3x3 sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::Origin origin)
QMatrix4x4 targetTransform(const QRectF &target, const QRect &viewport)

Detaillierte Beschreibung

Das Zeichnen von texturierten Quads, um den Inhalt einer Textur auf den Bildschirm zu bringen, ist eine übliche Operation bei der Entwicklung von 2D-Benutzeroberflächen. QOpenGLTextureBlitter bietet eine Komfortklasse, um die Wiederholung von Vertex-Daten, Shader-Quellen, Puffer- und Programmverwaltung sowie Matrixberechnungen zu vermeiden.

Eine QOpenGLWidget Unterklasse kann zum Beispiel folgendes tun, um den in einen Framebuffer gerenderten Inhalt an der Pixelposition (x, y) zu zeichnen:

void OpenGLWidget::initializeGL()
{
    m_blitter.create();
    m_fbo = new QOpenGLFramebufferObject(size);
}

void OpenGLWidget::paintGL()
{
    m_fbo->bind();
    // update offscreen content
    m_fbo->release();

    m_blitter.bind();
    const QRect targetRect(QPoint(x, y), m_fbo->size());
    const QMatrix4x4 target = QOpenGLTextureBlitter::targetTransform(targetRect, QRect(QPoint(0, 0), m_fbo->size()));
    m_blitter.blit(m_fbo->texture(), target, QOpenGLTextureBlitter::OriginBottomLeft);
    m_blitter.release();
}

Der Blitter implementiert GLSL-Shader sowohl für GLSL 1.00 (geeignet für OpenGL (ES) 2.x und Kompatibilitätsprofile neuerer OpenGL-Versionen) als auch für Version 150 (geeignet für Kernprofilkontexte mit OpenGL 3.2 und neuer).

Member Type Dokumentation

enum QOpenGLTextureBlitter::Origin

KonstanteWertBeschreibung
QOpenGLTextureBlitter::OriginBottomLeft0Zeigt an, dass die Daten in der Textur der OpenGL-Konvention für Koordinatensysteme folgen, was bedeutet, dass Y von unten nach oben verläuft.
QOpenGLTextureBlitter::OriginTopLeft1Zeigt an, dass die Daten in der Textur Y von oben nach unten verlaufen lassen, was typisch für normale, nicht gespiegelte Bilddaten ist.

Siehe auch blit().

Dokumentation der Mitgliedsfunktionen

QOpenGLTextureBlitter::QOpenGLTextureBlitter()

Konstruiert eine neue QOpenGLTextureBlitter-Instanz.

Hinweis: Im Konstruktor werden keine Grafikressourcen initialisiert. Dies macht es sicher, einfache QOpenGLTextureBlitter-Mitglieder in Klassen zu platzieren, da die tatsächliche Initialisierung, die vom OpenGL-Kontext abhängt, nur in create() stattfindet.

[noexcept] QOpenGLTextureBlitter::~QOpenGLTextureBlitter()

Zerstört die Instanz.

Hinweis: Wenn der OpenGL-Kontext - oder ein Kontext, der Ressourcen mit ihm teilt - der beim Aufruf von create() aktuell war, nicht aktuell ist, werden die Grafikressourcen nicht freigegeben. Es wird daher empfohlen, destroy() manuell aufzurufen, anstatt sich auf den Destruktor zu verlassen, um die OpenGL-Ressourcen zu bereinigen.

void QOpenGLTextureBlitter::bind(GLenum target = GL_TEXTURE_2D)

Bindet die vom Blitter verwendeten Grafikressourcen. Diese Funktion muss vor dem Aufruf von blit() aufgerufen werden. Code, der den OpenGL-Status verändert, sollte zwischen dem Aufruf von bind() und blit() vermieden werden, da sonst Konflikte entstehen können.

target ist das Texturziel für die Quelltextur und muss entweder GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE oder GL_OES_EGL_image_external sein.

Siehe auch release() und blit().

void QOpenGLTextureBlitter::blit(GLuint texture, const QMatrix4x4 &targetTransform, QOpenGLTextureBlitter::Origin sourceOrigin)

Führt den Blit mit der Quelltextur texture durch.

targetTransform gibt die angewandte Transformation an. Diese wird normalerweise von der Hilfsfunktion targetTransform() erzeugt.

sourceOrigin gibt an, ob die Bilddaten gespiegelt werden müssen. Wenn texture einer Textur entspricht, die an einen FBO-Pass angehängt ist, wird OriginBottomLeft verwendet. Wenn texture hingegen auf nicht gespiegelten Bilddaten basiert, wird OriginTopLeft übergeben. Dies ist effizienter als die Verwendung von QImage::mirrored().

Siehe auch targetTransform(), Origin, und bind().

void QOpenGLTextureBlitter::blit(GLuint texture, const QMatrix4x4 &targetTransform, const QMatrix3x3 &sourceTransform)

Führt den Blit mit der Quelltextur texture durch.

targetTransform gibt die angewandte Transformation an. Diese wird normalerweise von der Hilfsfunktion targetTransform() erzeugt.

sourceTransform spezifiziert die auf die Quelle angewendete Transformation. Dadurch kann nur ein Teilbereich der Quelltextur verwendet werden. Dies wird normalerweise von der Hilfsfunktion sourceTransform() generiert.

Siehe auch sourceTransform(), targetTransform(), Origin, und bind().

bool QOpenGLTextureBlitter::create()

Initialisiert die vom Blitter verwendeten Grafikressourcen.

Gibt bei Erfolg true zurück, bei einem Fehler false. Fehler können auftreten, wenn es keinen aktuellen OpenGL-Kontext auf dem aktuellen Thread gibt oder wenn die Shader-Kompilierung aus irgendeinem Grund fehlschlägt.

Siehe auch isCreated() und destroy().

void QOpenGLTextureBlitter::destroy()

Gibt alle vom Blitter gehaltenen Grafikressourcen frei. Es wird davon ausgegangen, dass der OpenGL-Kontext oder ein anderer Kontext, der sich die Ressourcen mit ihm teilt, auf dem Thread, der beim Aufruf von create() aktuell war, aktuell ist.

Die Funktion hat keine Auswirkung, wenn der Blitter nicht im erstellten Zustand ist.

Siehe auch create().

bool QOpenGLTextureBlitter::isCreated() const

Gibt true zurück, wenn create() aufgerufen wurde und erfolgreich war. false andernfalls.

Siehe auch create() und destroy().

void QOpenGLTextureBlitter::release()

Hebt die Bindung der vom Blitter verwendeten Grafikressourcen auf.

Siehe auch bind().

void QOpenGLTextureBlitter::setOpacity(float opacity)

Ändert die Deckkraft auf opacity. Die Standard-Deckkraft beträgt 1,0.

Hinweis: Der Blitter ändert den Blend-Status nicht. Der Aufrufer von blit() muss sicherstellen, dass die richtigen Überblendungseinstellungen aktiv sind.

void QOpenGLTextureBlitter::setRedBlueSwizzle(bool swizzle)

Legt fest, ob Swizzling für die roten und blauen Farbkanäle auf swizzle aktiviert ist. Eine BGRA-zu-RGBA-Konvertierung (die im Shader auf der GPU stattfindet, anstatt einer langsamen CPU-seitigen Transformation) kann nützlich sein, wenn die Quelltextur Daten von einem QImage mit einem Format wie QImage::Format_ARGB32 enthält, das auf Little-Endian-Systemen auf BGRA abgebildet wird.

Standardmäßig ist die Rot-Blau-Umwandlung deaktiviert, da eine Textur, die an ein Framebuffer-Objekt angehängt ist, oder eine Textur, die auf einem bytegeordneten QImage -Format (wie QImage::Format_RGBA8888) basiert, dies benötigt.

[static] QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture, const QSize &textureSize, QOpenGLTextureBlitter::Origin origin)

Berechnet eine 3x3-Matrix, die als Eingabe für blit() geeignet ist. Dies wird verwendet, wenn nur ein Teil der Textur im Blit verwendet werden soll.

subTexture ist das gewünschte Quellrechteck in Pixeln, textureSize ist die volle Breite und Höhe der Texturdaten. origin gibt die Ausrichtung der Bilddaten in Bezug auf die Y-Achse an.

Siehe auch blit() und Origin.

bool QOpenGLTextureBlitter::supportsExternalOESTarget() const

Gibt true zurück, wenn bind() GL_TEXTURE_EXTERNAL_OES als Zielargument annimmt.

Siehe auch bind() und blit().

bool QOpenGLTextureBlitter::supportsRectangleTarget() const

Gibt true zurück, wenn bind() GL_TEXTURE_RECTANGLE als Zielargument annimmt.

Siehe auch bind() und blit().

[static] QMatrix4x4 QOpenGLTextureBlitter::targetTransform(const QRectF &target, const QRect &viewport)

Berechnet eine für blit() geeignete Zieltransformation.

target ist das Zielrechteck in Pixeln. viewport beschreibt die Abmessungen der Quelle und wird in den meisten Fällen auf (0, 0, Bildbreite, Bildhöhe) gesetzt.

Für eine nicht skalierte Ausgabe sollte die Größe von target und viewport übereinstimmen.

Siehe auch blit().

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