QCanvasCustomBrush Class
QCanvasCustomBrush est un pinceau doté de shaders personnalisés. En savoir plus...
| En-tête : | #include <QCanvasCustomBrush> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter) target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| Depuis : | Qt 6.11 |
| Statut : | Aperçu technologique |
Cette classe est en avant-première technologique et est susceptible d'être modifiée.
Fonctions publiques
| 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 |
Éléments non membres associés
| 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) |
Description détaillée
QCanvasCustomBrush est un pinceau de tracé/remplissage doté de shaders de sommets et/ou de fragments personnalisés.
Ces shaders doivent être écrits en GLSL de style Vulkan, à l’instar des shaders Qt Quick ShaderEffect . Ils doivent toujours contenir une instruction QC_INCLUDE, avec soit "customfrag.glsl", soit "customvert.glsl". Cela permet d’accéder à un bloc uniform, aux textures d’image et de police, ainsi qu’à quelques fonctions d’aide.
iTime Voici un exemple d’élément couramment utilisé dans le bloc « uniform » intégré. L’appel de ` setAnimationRunning()` avec ` true ` entraînera la mise à jour automatique de cette valeur à chaque image, ce qui peut être utilisé pour générer du contenu animé.
Entrées de shader intégrées, uniformes et fonctions d’aide
L’instruction QC_INCLUDE n’est pas une directive de préprocesseur standard. Elle est gérée par qt_add_custom_brush_shaders() lors de la compilation, avant que le shader ne soit transmis au pipeline de compilation de shaders habituel. Cette instruction est remplacée par un bloc de code source GLSL qui déclare les entrées et sorties du shader, les échantillonneurs de texture, un bloc d’uniformes partagés et, pour les shaders de fragments, un ensemble de fonctions d’aide. Utilisez ` "customvert.glsl" ` dans les shaders de sommets et ` "customfrag.glsl" ` dans les shaders de fragments.
Cela signifie qu’un shader de pinceau personnalisé ne déclare pas lui-même ces entrées, sorties, échantillonneurs ou uniformes ; ils sont tous mis à disposition par l’instruction ` QC_INCLUDE `.
Interface du shader de sommets
Un shader de sommets qui inclut « "customvert.glsl" » dispose des entrées et sorties suivantes :
in vec2 vertex- La position du sommet dans le système de coordonnées du canevas.in vec2 tcoord- La coordonnée de texture associée au sommet.out vec2 texCoord- Transmis au shader de fragment. Généralement défini sur `tcoord`.out vec2 fragCoord- Transmis au shader de fragment. Généralement défini sur `vertex`.
Remarque : ces variables sont disponibles implicitement via la directive ` QC_INCLUDE `. L’extrait de code du shader de sommet lui-même ne doit pas les déclarer.
De plus, les uniformes suivants, liés à la transformation, sont disponibles :
vec4 viewRect- Le rectangle de la fenêtre d’affichage, sous la forme (x, y, largeur, hauteur).int ndcIsYDown- Différent de zéro lorsque l’axe Y du système de coordonnées normalisé du périphérique est orienté vers le bas, comme c’est le cas avec certaines API graphiques. Tenez-en compte lors du calcul de `gl_Position`.mat3 vertMatrix- La matrice de transformation actuelle.
Un shader de sommets doit écrire l’ gl_Position, et est censé transmettre l’ texCoord et l’ fragCoord à l’étape des fragments.
Remarque : les shaders de sommetspersonnalisés sont moins courants. La plupart des pinceaux personnalisés sont censés utiliser le shader de sommets intégré par défaut, en combinaison avec un shader de fragments personnalisé fourni par l’application.
Un shader de sommets type se présente comme suit :
#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);
}Interface du shader de fragment
Un shader de fragment qui inclut "customfrag.glsl" dispose des entrées et sorties suivantes :
in vec2 texCoord- La coordonnée de texture interpolée.in vec2 fragCoord- La position du fragment interpolée, dans le même système de coordonnées que la géométrie. Généralement utilisée pour générer des effets procéduraux.out vec4 fragColor- La couleur du fragment résultant, que le shader doit écrire. La sortie attendue utilise un alpha pré-multiplié.
Remarque : ces variables sont disponibles implicitement via la directive ` QC_INCLUDE `. L’extrait de shader de fragment lui-même ne doit pas les déclarer.
Deux échantillonneurs de texture sont disponibles :
sampler2D tex- La texture d’image.sampler2D fontTex- La texture de police, contenant un champ de distance signé des glyphes. Pertinent lorsque le pinceau est utilisé pour remplir du texte.
Les constantes de commodité ` TAU ` (égale à 2 * pi) et ` SQRT2 ` sont également définies.
Uniformes communs
Les shaders de sommets et de fragments qui utilisent ` QC_INCLUDE ` ont accès à un bloc d’uniformes partagé. Les membres les plus couramment utilisés sont :
float iTime- Une valeur temporelle, en secondes, mise à jour à chaque image tant que isAnimationRunning() est égal àtrue. Utilisez-la pour piloter des animations. Voir setAnimationRunning().vec4 data1,vec4 data2,vec4 data3,vec4 data4- Données personnalisées mises à la disposition du shader. Définissez-les depuis C++ via setData1(), setData2(), setData3() et setData4().float globalAlpha- L'opacité globale actuelle du « painter ». Les shaders de fragment doivent normalement multiplierfragColorpar cette valeur.vec4 colorEffects- Les paramètres d'effets de couleur actifs. Ils sont généralement appliqués via la fonction applyColorEffects() plutôt que d'être consultés directement.float fontAlphaMin,float fontAlphaMax- Les seuils du champ de distance signé utilisés lors de l’anticrénelage des glyphes.
Fonctions d'aide pour les shaders de fragment
L'en-tête du shader de fragment fournit les fonctions d'aide suivantes :
float clipMask()- Renvoie la couverture de découpage (clip), dans l’intervalle [0, 1], pour le fragment actuel. MultipliezfragColorpar cette valeur pour respecter le découpage du peintre.float antialiasingAlpha()- Renvoie la couverture d’anticrénelage, comprise entre 0 et 1, dérivée detexCoord. MultipliezfragColorpar cette valeur pour obtenir des arêtes anticrénelées.float sdfFontAlphaRaw()- Renvoie la valeur brute du champ de distance signé échantillonnée à partir de `fontTex` à `texCoord`, sans anticrénelage. Appliquez manuellement `smoothstep()` si nécessaire.float sdfFontAlpha()- Renvoie l’alpha du glyphe échantillonné à partir defontTexà l’adressetexCoord, avec l’anticrénelage par défaut appliqué en fonction defontAlphaMinetfontAlphaMax.void applyColorEffects(inout vec4 color)- Applique les effets actifs de contraste, de luminosité et de saturation àcolorsur place.
Un shader de fragment typique calcule fragColor, le multiplie par globalAlpha, le multiplie éventuellement par clipMask() et antialiasingAlpha() pour prendre en charge le clipping et l’anticrénelage, puis appelle enfin applyColorEffects().
Lorsque du texte est impliqué, il faut également tenir compte de sdfFontAlpha(). Par exemple :
#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);
}Ajout des shaders au projet
Les shaders utilisés avec QCanvasCustomBrush doivent toujours être ajoutés au projet d’application via la fonction CMake qt_add_custom_brush_shaders, fournie par le package Qt Canvas Painter. Cette fonction effectue un prétraitement supplémentaire au moment de la compilation avant d’invoquer en interne la fonction standard qt_add_shaders().
Par exemple :
qt_add_custom_brush_shaders(app "app_custombrush_shaders"
PREFIX
"/shaders"
FILES
brush1.frag
)Utilisation du pinceau
Au moment de l’exécution, le fichier ` .qsb ` généré peut être utilisé, par exemple, comme suit :
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));Le `QCanvasCustomBrush` peut alors être utilisé dans un remplissage, par exemple :
painter->setFillStyle(customBrush);Consultez qt_add_custom_brush_shaders pour plus de détails sur la fonction CMake, ainsi que la documentation du module Qt Shader Tools pour savoir comment travailler avec du code de shader multiplateforme dans Qt.
Remarque : les shaders destinés aux pinceaux personnalisés doivent toujours contenir la directive ` QC_INCLUDE ` et doivent être ajoutés au projet via la fonction CMake `qt_add_custom_brush_shaders`. La fonction `qt_add_shaders()` n’est pas adaptée aux shaders de pinceaux personnalisés.
Remarque : qt_add_custom_brush_shaders compile le code de shader vers les cibles suivantes : GLSL 300 es, 150, 130, HLSL 5.0 et MSL 1.2. Il n'existe actuellement aucune autre option de configuration pour cette fonctionnalité.
Voir également qt_add_custom_brush_shaders et Qt Canvas Painter - Exemple de galerie.
Documentation des fonctions membres
QCanvasCustomBrush::QCanvasCustomBrush()
Crée un pinceau personnalisé par défaut.
[constexpr noexcept default] QCanvasCustomBrush::QCanvasCustomBrush(QCanvasCustomBrush &&)
Crée par « move » une instance de ` QCanvasCustomBrush`.
[noexcept] QCanvasCustomBrush::~QCanvasCustomBrush()
Supprime le pinceau personnalisé.
bool QCanvasCustomBrush::isAnimationRunning() const
Renvoie « true » si le chronomètre est en marche.
void QCanvasCustomBrush::setAnimationRunning(bool running)
Définit l'état de durée d'exécution sur « running ». Lorsque cette valeur est vraie, la variable uniforme du shader « iTime » est mise à jour automatiquement et peut être utilisée pour obtenir la durée d'exécution actuelle de l'animation dans le shader.
La valeur par défaut est false.
Voir également isAnimationRunning().
void QCanvasCustomBrush::setData1(const QVector4D &data)
Définit la valeur de la variable « data1 » sur « data ». Cela permet de définir des données personnalisées dans les shaders.
void QCanvasCustomBrush::setData2(const QVector4D &data)
Définit la valeur de la variable « data2 » sur « data ». Cela permet de définir des données personnalisées dans les shaders.
void QCanvasCustomBrush::setData3(const QVector4D &data)
Définit la valeur « data3 » de l'uniform sur « data ». Cela permet de définir des données personnalisées dans les shaders.
void QCanvasCustomBrush::setData4(const QVector4D &data)
Définit la valeur de la variable « data4 » sur « data ». Cela permet de définir des données personnalisées dans les shaders.
void QCanvasCustomBrush::setFragmentShader(const QShader &fragmentShader)
Définit le pinceau personnalisé à utiliser : fragmentShader.
void QCanvasCustomBrush::setFragmentShader(const QString &fragmentShader)
Définit le pinceau personnalisé à utiliser : fragmentShader. Il doit s'agir du chemin d'accès à un fichier qsb valide. Ce fichier peut être un fichier local ou intégré à l'application via le système de ressources Qt.
void QCanvasCustomBrush::setVertexShader(const QShader &vertexShader)
Définit le pinceau personnalisé à utiliser : vertexShader.
void QCanvasCustomBrush::setVertexShader(const QString &vertexShader)
Définit le pinceau personnalisé à utiliser : vertexShader. Il doit s'agir du chemin d'accès à un fichier qsb valide. Ce fichier peut être un fichier local ou intégré à l'application via le système de ressources Qt.
QCanvasCustomBrush::operator QVariant() const
Renvoie le pinceau personnalisé sous la forme d'un objet ` QVariant`.
Éléments non membres associés
[noexcept] bool operator!=(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
Renvoie « true » si le pinceau personnalisé lhs est différent de rhs; « false » dans le cas contraire.
Voir également operator==().
QDataStream &operator<<(QDataStream &stream, const QCanvasCustomBrush &brush)
Écrit l'brush on fournie dans l'stream on indiquée et renvoie une référence à l'stream on.
Remarque : cette fonction sérialise les shaders chargés à partir des fichiers .qsb, et non les noms de fichiers.
Voir également Sérialisation des types de données Qt.
[noexcept] bool operator==(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
Renvoie « true » si le pinceau personnalisé lhs est égal à rhs; « false » dans le cas contraire.
Voir également operator!=().
QDataStream &operator>>(QDataStream &stream, QCanvasCustomBrush &brush)
Lit l'brush donné à partir de l'stream spécifié et renvoie une référence vers l'stream.
Voir également Sérialisation des types de données Qt.
© 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.