Auf dieser Seite

QCanvasCustomBrush Class

QCanvasCustomBrush ist ein Pinsel mit benutzerdefinierten Shadern. Mehr...

Überschrift: #include <QCanvasCustomBrush>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Seit: Qt 6.11
Status: Technologievorschau

Diese Klasse befindet sich in der Technologievorschau und kann sich noch ändern.

Öffentliche Funktionen

QCanvasCustomBrush()
QCanvasCustomBrush(QCanvasCustomBrush &&)
~QCanvasCustomBrush()
bool isAnimationRunning() const
void setAnimationRunning(bool running)
void setData1(const QVector4D &data)
void setData2(const QVector4D &data)
void setData3(const QVector4D &data)
void setData4(const QVector4D &data)
void setFragmentShader(const QShader &fragmentShader)
void setFragmentShader(const QString &fragmentShader)
void setVertexShader(const QShader &vertexShader)
void setVertexShader(const QString &vertexShader)
operator QVariant() const
bool operator!=(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
QDataStream &operator<<(QDataStream &stream, const QCanvasCustomBrush &brush)
bool operator==(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
QDataStream &operator>>(QDataStream &stream, QCanvasCustomBrush &brush)

Ausführliche Beschreibung

QCanvasCustomBrush ist ein Strich-/Füllpinsel mit benutzerdefinierten Vertex- und/oder Fragment-Shadern.

Diese Shader sollten in GLSL im Vulkan-Stil geschrieben sein, ähnlich wie die Shader „ Qt Quick “ und „ ShaderEffect “. Sie müssen immer eine „ QC_INCLUDE “-Anweisung enthalten, entweder mit „ "customfrag.glsl" “ oder „ "customvert.glsl" “. Dadurch werden ein Uniform-Block, die Bild- und Schriftarttexturen sowie einige Hilfsfunktionen zur Verfügung gestellt.

iTime ist ein Beispiel für ein häufig verwendetes Element im integrierten Uniform-Block. Durch den Aufruf von ` setAnimationRunning()` mit ` true ` wird dieser Wert in jedem Frame automatisch aktualisiert und kann zur Steuerung animierter Inhalte verwendet werden.

Integrierte Shader-Eingaben, Uniforms und Hilfsfunktionen

Die Anweisung ` QC_INCLUDE ` ist keine Standard-Präprozessor-Direktive. Sie wird zur Erstellungszeit von `qt_add_custom_brush_shaders()` verarbeitet, bevor der Shader an die reguläre Shader-Kompilierungspipeline übergeben wird. Die Anweisung wird durch einen Block aus GLSL-Quellcode ersetzt, der die Shader-Eingänge und -Ausgänge, die Textur-Sampler, einen gemeinsamen Uniform-Block und – bei Fragment-Shadern – eine Reihe von Hilfsfunktionen deklariert. Verwenden Sie „ "customvert.glsl" “ in Vertex-Shadern und „ "customfrag.glsl" “ in Fragment-Shadern.

Das bedeutet, dass ein benutzerdefinierter Pinsel-Shader diese Eingaben, Ausgaben, Sampler oder Uniforms nicht selbst deklariert; sie werden alle durch die Anweisung „ QC_INCLUDE “ bereitgestellt.

Vertex-Shader-Schnittstelle

Ein Vertex-Shader, der „ "customvert.glsl" “ enthält, verfügt über die folgenden deklarierten Eingänge und Ausgänge:

  • in vec2 vertex - Die Vertex-Position im Canvas-Koordinatensystem.
  • in vec2 tcoord - Die dem Scheitelpunkt zugeordnete Texturkoordinate.
  • out vec2 texCoord - Wird an den Fragment-Shader weitergeleitet. In der Regel auf „ tcoord “ gesetzt.
  • out vec2 fragCoord - Wird an den Fragment-Shader weitergeleitet. Wird in der Regel auf ` vertex` gesetzt.

Hinweis: Diese Variablen stehen implizit über die Anweisung „ QC_INCLUDE “ zur Verfügung. Der Vertex-Shader-Ausschnitt selbst darf sie nicht deklarieren.

Darüber hinaus stehen die folgenden transformationsbezogenen Uniforms zur Verfügung:

  • vec4 viewRect - Das Viewport-Rechteck als (x, y, Breite, Höhe).
  • int ndcIsYDown - Ungleich Null, wenn die Y-Achse des normalisierten Gerätekordinatensystems nach unten zeigt, wie es bei einigen Grafik-APIs der Fall ist. Berücksichtigen Sie dies bei der Berechnung von ` gl_Position`.
  • mat3 vertMatrix - Die aktuelle Transformationsmatrix.

Ein Vertex-Shader muss ` gl_Position` schreiben und soll ` texCoord ` sowie ` fragCoord ` an die Fragmentstufe weiterleiten.

Hinweis: Benutzerdefinierte Vertex-Shader sind eher selten. Von den meisten benutzerdefinierten Pinseln wird erwartet, dass sie den standardmäßigen, integrierten Vertex-Shader in Kombination mit einem benutzerdefinierten, von der Anwendung bereitgestellten Fragment-Shader verwenden.

Ein typischer Vertex-Shader sieht wie folgt aus:

#version 440

QC_INCLUDE "customvert.glsl"

void main()
{
    texCoord = tcoord;
    fragCoord = vertex;
    vec2 v = (vertMatrix * vec3(vertex, 1.0)).xy;
    if (ndcIsYDown != 0)
        gl_Position = vec4(2.0 * (v.x + viewRect.x) / viewRect.z - 1.0,
                           -1.0 + 2.0 * (v.y + viewRect.y) / viewRect.w, 0.0, 1.0);
    else
        gl_Position = vec4(2.0 * (v.x + viewRect.x) / viewRect.z - 1.0,
                           1.0 - 2.0 * (v.y + viewRect.y) / viewRect.w, 0.0, 1.0);
}

Fragment-Shader-Schnittstelle

Ein Fragment-Shader, der „ "customfrag.glsl" “ enthält, verfügt über die folgenden deklarierten Ein- und Ausgänge:

  • in vec2 texCoord - Die interpolierte Texturkoordinate.
  • in vec2 fragCoord - Die interpolierte Fragmentposition im selben Koordinatensystem wie die Geometrie. Wird häufig zur Steuerung prozeduraler Effekte verwendet.
  • out vec4 fragColor - Die resultierende Fragmentfarbe, die der Shader schreiben muss. Die erwartete Ausgabe verwendet vorvervielfachtes Alpha.

Hinweis: Diese Variablen stehen implizit über die Anweisung „ QC_INCLUDE “ zur Verfügung. Der Fragment-Shader-Ausschnitt selbst darf sie nicht deklarieren.

Es stehen zwei Textur-Sampler zur Verfügung:

  • sampler2D tex - Die Bildtextur.
  • sampler2D fontTex - Die Schrifttextur, die ein vorzeichenbehaftetes Distanzfeld der Glyphen enthält. Dies ist relevant, wenn der Pinsel zum Ausfüllen von Text verwendet wird.

Die Komfortkonstanten ` TAU ` (entspricht 2 * pi) und ` SQRT2 ` sind ebenfalls definiert.

Gemeinsame Uniforms

Sowohl Vertex- als auch Fragment-Shader, die „ QC_INCLUDE “ verwenden, haben Zugriff auf einen gemeinsamen Uniform-Block. Die am häufigsten verwendeten Elemente sind:

  • float iTime - Ein Zeitwert in Sekunden, der bei jedem Frame aktualisiert wird, solange isAnimationRunning() gleich true ist. Verwenden Sie ihn zur Steuerung von Animationen. Siehe setAnimationRunning().
  • vec4 data1, ` vec4 data2`, ` vec4 data3`, ` vec4 data4 ` - Benutzerdefinierte Daten, die dem Shader zur Verfügung gestellt werden. Diese werden in C++ über ` setData1()`, ` setData2()`, ` setData3()` und ` setData4()` gesetzt.
  • float globalAlpha - Die aktuelle globale Deckkraft des Painters. Fragment-Shader sollten normalerweise fragColor mit diesem Wert multiplizieren.
  • vec4 colorEffects - Die Parameter des aktiven Farbeffekts. Werden normalerweise über `applyColorEffects()` angewendet und nicht direkt abgerufen.
  • float fontAlphaMin, float fontAlphaMax – Die Schwellenwerte für das Signed-Distance-Field, die beim Antialiasing von Glyphen verwendet werden.

Hilfsfunktionen für Fragment-Shader

Die Fragment-Shader-Include-Datei stellt die folgenden Hilfsfunktionen bereit:

  • float clipMask() - Gibt die Clip- (Scheren-)Abdeckung im Bereich [0, 1] für das aktuelle Fragment zurück. Multiplizieren Sie „ fragColor “ mit diesem Wert, um das Clipping des Painters zu berücksichtigen.
  • float antialiasingAlpha() - Gibt die Antialiasing-Abdeckung im Bereich [0, 1] zurück, die aus ` texCoord` abgeleitet wird. Multiplizieren Sie ` fragColor ` mit diesem Wert, um antialiasierte Kanten zu erhalten.
  • float sdfFontAlphaRaw() - Gibt den rohen, vorzeichenbehafteten Distance-Field-Wert zurück, der an der Position ` texCoord` aus ` fontTex ` abgetastet wurde, ohne Antialiasing. Wenden Sie ` smoothstep() ` bei Bedarf manuell an.
  • float sdfFontAlpha() - Gibt den Glyphen-Alpha-Wert zurück, der von fontTex an der Position texCoord abgetastet wurde, wobei das standardmäßige Anti-Aliasing basierend auf fontAlphaMin und fontAlphaMax angewendet wird.
  • void applyColorEffects(inout vec4 color) - Wendet die aktiven Kontrast-, Helligkeits- und Sättigungseffekte direkt auf color an.

Ein typischer Fragment-Shader berechnet fragColor, multipliziert diesen Wert mit globalAlpha, multipliziert ihn optional mit clipMask() und antialiasingAlpha(), um Clipping und Anti-Aliasing zu unterstützen, und ruft schließlich applyColorEffects() auf.

Wenn es um Text geht, sollte auch sdfFontAlpha() berücksichtigt werden. Zum Beispiel:

#version 440

QC_INCLUDE "customfrag.glsl"

void main()
{
    float a = 0.6 + 0.2 * sin(0.1 * fragCoord.x + 4.0 * iTime);
    vec4 color = vec4(a, a, a, 1.0);
    fragColor = sdfFontAlpha() * globalAlpha * color;
    applyColorEffects(fragColor);
}

Hinzufügen der Shader zum Projekt

Shader, die mit `QCanvasCustomBrush` verwendet werden, müssen immer über die CMake-Funktion `qt_add_custom_brush_shaders` – die vom Qt Canvas Painter-Paket bereitgestellt wird – zum Anwendungsprojekt hinzugefügt werden. Diese Funktion führt zur Build-Zeit eine zusätzliche Vorverarbeitung durch, bevor intern die Standardfunktion ` qt_add_shaders()` aufgerufen wird.

Beispiel:

qt_add_custom_brush_shaders(app "app_custombrush_shaders"
    PREFIX
        "/shaders"
    FILES
        brush1.frag
)

Verwendung des Pinsels

Zur Laufzeit kann die generierte Datei ` .qsb ` beispielsweise wie folgt verwendet werden:

QCanvasCustomBrush customBrush(":/shaders/brush1.frag.qsb"));
customBrush.setAnimationRunning(true); // iTime updates automatically
// expose custom data to the shader in data1
customBrush.setData1(QVector4D(1.0, 2.0, 3.0, 4.0));

Der `QCanvasCustomBrush` kann dann beispielsweise in einer Füllung verwendet werden:

painter->setFillStyle(customBrush);

Shader Tools Einzelheiten zur CMake-Funktion finden Sie unter `qt_add_custom_brush_shaders`, und Informationen zur Arbeit mit plattformübergreifendem Shader-Code in Qt finden Sie in der Dokumentation zum Qt XML-ph-0000@deepl.internal-Modul.

Hinweis: Shader für benutzerdefinierte Pinsel müssen immer die Anweisung ` QC_INCLUDE ` enthalten und über die CMake-Funktion ` qt_add_custom_brush_shaders ` zum Projekt hinzugefügt werden. `qt_add_shaders()` ist für benutzerdefinierte Pinsel-Shader nicht geeignet.

Hinweis: `qt_add_custom_brush_shaders ` übersetzt den Shader-Code in die folgenden Ziele: GLSL 300 es, 150, 130, HLSL 5.0 und MSL 1.2. Derzeit sind hierfür keine weiteren Konfigurationsmöglichkeiten vorgesehen.

Siehe auch qt_add_custom_brush_shaders und Qt Canvas Painter – Beispiel in der Galerie.

Dokumentation zu den Member-Funktionen

QCanvasCustomBrush::QCanvasCustomBrush()

Erstellt einen benutzerdefinierten Standardpinsel.

[constexpr noexcept default] QCanvasCustomBrush::QCanvasCustomBrush(QCanvasCustomBrush &&)

Erstellt eine Instanz von „ QCanvasCustomBrush “ mithilfe von „Move“.

[noexcept] QCanvasCustomBrush::~QCanvasCustomBrush()

Löscht den benutzerdefinierten Pinsel.

bool QCanvasCustomBrush::isAnimationRunning() const

Gibt „true“ zurück, wenn die Zeit läuft.

void QCanvasCustomBrush::setAnimationRunning(bool running)

Setzt den Status der Laufzeit auf „ running “. Ist dieser Wert „true“, wird die Shader-Uniform „ iTime “ automatisch aktualisiert und kann verwendet werden, um die aktuelle Laufzeit der Animation im Shader abzurufen.

Der Standardwert ist „ false “.

Siehe auch isAnimationRunning().

void QCanvasCustomBrush::setData1(const QVector4D &data)

Setzt den Wert von „data1“ auf „ data “. Auf diese Weise können benutzerdefinierte Daten in Shadern festgelegt werden.

void QCanvasCustomBrush::setData2(const QVector4D &data)

Setzt den Wert von „data2“ auf „ data “. Auf diese Weise können benutzerdefinierte Daten in Shadern festgelegt werden.

void QCanvasCustomBrush::setData3(const QVector4D &data)

Setzt den Wert von „data3“ auf „ data “. Auf diese Weise können benutzerdefinierte Daten in Shadern festgelegt werden.

void QCanvasCustomBrush::setData4(const QVector4D &data)

Setzt den Wert von „data4“ auf „ data “. Dadurch können benutzerdefinierte Daten in Shadern festgelegt werden.

void QCanvasCustomBrush::setFragmentShader(const QShader &fragmentShader)

Legt fest, dass der benutzerdefinierte Pinsel „ fragmentShader “ verwendet.

void QCanvasCustomBrush::setFragmentShader(const QString &fragmentShader)

Legt fest, dass der benutzerdefinierte Pinsel „ fragmentShader “ verwendet. Dies muss der Pfad zu einer gültigen QSB-Datei sein. Die Datei kann lokal gespeichert oder über das Qt-Ressourcensystem in die Anwendung eingebettet sein.

void QCanvasCustomBrush::setVertexShader(const QShader &vertexShader)

Legt fest, dass der benutzerdefinierte Pinsel „ vertexShader “ verwendet.

void QCanvasCustomBrush::setVertexShader(const QString &vertexShader)

Legt fest, dass der benutzerdefinierte Pinsel „ vertexShader “ verwendet. Dabei muss es sich um den Pfad zu einer gültigen QSB-Datei handeln. Die Datei kann lokal gespeichert oder über das Qt-Ressourcensystem in die Anwendung eingebettet sein.

QCanvasCustomBrush::operator QVariant() const

Gibt den benutzerdefinierten Pinsel als „ QVariant “ zurück.

Verwandte Nicht-Mitglieder

[noexcept] bool operator!=(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)

Gibt „ true “ zurück, wenn sich der benutzerdefinierte Pinsel „ lhs “ von „ rhs “ unterscheidet; andernfalls „ false “.

Siehe auch operator==().

QDataStream &operator<<(QDataStream &stream, const QCanvasCustomBrush &brush)

Schreibt die angegebenen „ brush “ in die angegebenen „ stream “ und gibt eine Referenz auf die „ stream “ zurück.

Hinweis: Diese Funktion serialisiert die aus den .qsb-Dateien geladenen Shader, nicht die Dateinamen.

Siehe auch „Serialisierung vonQt-Datentypen“.

[noexcept] bool operator==(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)

Gibt „ true “ zurück, wenn der benutzerdefinierte Pinsel „ lhs “ mit „ rhs “ übereinstimmt; andernfalls „ false “.

Siehe auch operator!=().

QDataStream &operator>>(QDataStream &stream, QCanvasCustomBrush &brush)

Liest den angegebenen ` brush ` aus dem angegebenen ` stream ` und gibt eine Referenz auf den ` stream` zurück.

Siehe auch „Serialisierung vonQt-Datentypen“.

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