Sur cette page

QSGMaterial Class

La classe QSGMaterial encapsule l'état de rendu d'un programme de shader. En savoir plus...

En-tête : #include <QSGMaterial>
CMake : find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake : QT += quick
Hérité par :

QSGFlatColorMaterial, QSGOpaqueTextureMaterial et QSGVertexColorMaterial

Types publics

enum Flag { Blending, RequiresDeterminant, RequiresFullMatrixExceptTranslate, RequiresFullMatrix, NoBatching, CustomCompileStep }
flags Flags

Fonctions publiques

virtual int compare(const QSGMaterial *other) const
virtual QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const = 0
QSGMaterial::Flags flags() const
void setFlag(QSGMaterial::Flags flags, bool on = true)
virtual QSGMaterialType *type() const = 0
(since 6.8) int viewCount() const

Description détaillée

QSGMaterial et les sous-classes d’ QSGMaterialShader entretiennent une relation étroite. Pour un graphe de scène (y compris les graphes imbriqués), il existe une instance unique d’ QSGMaterialShader qui encapsule les shaders utilisés par le graphe de scène pour rendre ce matériau, comme par exemple un shader permettant la coloration uniforme de la géométrie. Chaque nœud de graphe de scène ( QSGGeometryNode ) peut disposer d’un QSGMaterial unique contenant les informations relatives à la configuration du shader lors du dessin de ce nœud, comme la couleur réelle à utiliser pour le rendu de la géométrie.

QSGMaterial dispose de deux fonctions virtuelles qui doivent toutes deux être implémentées. La fonction type() doit renvoyer une instance unique pour toutes les instances d’une sous-classe spécifique. La fonction createShader() doit renvoyer une nouvelle instance de QSGMaterialShader, spécifique à cette sous-classe de QSGMaterial.

Une implémentation minimale de QSGMaterial pourrait ressembler à ceci :

class Material : public QSGMaterial
{
public:
    QSGMaterialType *type() const override { static QSGMaterialType type; return &type; }
    QSGMaterialShader *createShader(QSGRendererInterface::RenderMode) const override { return new Shader; }
};

Consultez l’exemple « Custom Material » pour une introduction à l’implémentation d’une sous-classe de ` QQuickItem ` s’appuyant sur une instance de ` QSGGeometryNode ` et un matériau personnalisé.

Remarque : la méthode ` createShader()` n'est appelée qu'une seule fois par ` QSGMaterialType`, afin de réduire le travail redondant lié à la préparation des shaders. Si un `QSGMaterial` s'appuie sur plusieurs ensembles de combinaisons de shaders de sommets et de fragments, l'implémentation de ` type()` doit renvoyer un pointeur ` QSGMaterialType ` différent et unique pour chaque combinaison de shaders.

Remarque : toutes les classes préfixées par « QSG » doivent être utilisées exclusivement sur le thread de rendu du graphe de scène. Voir Graphe de scène et rendu pour plus d’informations.

Voir également « QSGMaterialShader» , «Scene Graph - Custom Material», «Scene Graph - Two Texture Providers» et «Scene Graph - Graph».

Documentation sur les types de membres

enum QSGMaterial::Flag
flags QSGMaterial::Flags

ConstanteValeurDescription
QSGMaterial::Blending0x0001Définissez cet indicateur sur « true » si le matériau nécessite que le mélange soit activé pendant le rendu.
QSGMaterial::RequiresDeterminant0x0002Définissez cet indicateur sur « true » si le matériau s'appuie sur le déterminant de la matrice des nœuds de géométrie pour le rendu.
QSGMaterial::RequiresFullMatrixExceptTranslate0x0004 | RequiresDeterminantDéfinissez cet indicateur sur « true » si le matériau s'appuie sur la matrice complète des nœuds de géométrie pour le rendu, à l'exception de la partie translation.
QSGMaterial::RequiresFullMatrix0x0008 | RequiresFullMatrixExceptTranslateDéfinissez cet indicateur sur « true » si le matériau s'appuie sur la matrice complète des nœuds de géométrie pour le rendu.
QSGMaterial::NoBatching0x0010Définissez cet indicateur sur « true » si le matériau utilise des shaders incompatibles avec le mécanisme de regroupement (batching) du graphe de scène. Cela s'applique dans certains cas d'utilisation avancés, tels que la manipulation directe d'gl_Position.z s dans le shader de sommet. De telles solutions sont souvent liées à une structure de scène spécifique et leur utilisation avec des contenus arbitraires dans une scène n'est probablement pas sans risque. Ce drapeau ne doit donc être activé qu’après une analyse approfondie, et ne sera jamais nécessaire pour la grande majorité des matériaux. L’activation de ce drapeau peut entraîner une baisse des performances en raison du nombre accru d’appels de dessin. Ce drapeau a été introduit dans Qt 6.3.
QSGMaterial::CustomCompileStepNoBatchingDans Qt 6, cet indicateur est identique à NoBatching. Préférez utiliser NoBatching à la place.

Le type Flags est un typedef pour QFlags<Flag>. Il stocke une combinaison OR de valeurs Flag.

Documentation des fonctions membres

[virtual] int QSGMaterial::compare(const QSGMaterial *other) const

Compare ce matériau à other et renvoie 0 s’ils sont égaux ; -1 si ce matériau doit être classé avant other et 1 si other doit être classé avant.

Le graphe de scène peut réorganiser les nœuds de géométrie afin de minimiser les changements d’état. La fonction de comparaison est appelée pendant le processus de tri afin que les matériaux puissent être classés de manière à minimiser les changements d’état à chaque appel à QSGMaterialShader::updateState().

Il est garanti que le pointeur « this » et « other » ont la même valeur de type().

[pure virtual] QSGMaterialShader *QSGMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const

Cette fonction renvoie une nouvelle instance de l'implémentation de ` QSGMaterialShader ` utilisée pour le rendu de la géométrie pour une implémentation spécifique de ` QSGMaterial`.

La fonction ne sera appelée qu’une seule fois pour chaque combinaison de type de matériau et d’ renderMode, et sera mise en cache en interne.

Pour la plupart des matériaux, l’ renderMode peut être ignorée. Certains matériaux peuvent nécessiter un traitement personnalisé pour des modes de rendu spécifiques. Par exemple, si le matériau implémente l’anticrénelage d’une manière qui doit tenir compte des transformations de perspective lorsque RenderMode3D est utilisé.

QSGMaterial::Flags QSGMaterial::flags() const

Renvoie les indicateurs du matériau.

void QSGMaterial::setFlag(QSGMaterial::Flags flags, bool on = true)

Définit les indicateurs « flags » sur ce matériau si la valeur de « on » est vraie ; dans le cas contraire, efface cet attribut.

[pure virtual] QSGMaterialType *QSGMaterial::type() const

Cette fonction est appelée par le graphe de scène pour récupérer l'identifiant unique de l'instance de ` QSGMaterialShader ` créée par la fonction ` createShader()`.

Pour de nombreux matériaux, l'approche courante consistera à renvoyer un pointeur vers une instance statique — et donc accessible globalement — d'QSGMaterialType. L'objet QSGMaterialType est un objet opaque. Son seul but est de fournir un moyen simple et sans risque de type pour générer des identifiants de matériaux uniques.

QSGMaterialType *type() const override
{
    static QSGMaterialType type;
    return &type;
}

[since 6.8] int QSGMaterial::viewCount() const

Renvoie le nombre de vues lorsque le matériau est utilisé dans un rendu multi-vues.

Remarque : la valeur renvoyée n’est valide que lorsqu’elle est appelée depuis ` createShader()` et par la suite. La valeur n’est pas nécessairement à jour avant que ` createShader()` ne soit invoqué par le graphe de scène.

Normalement, la valeur renvoyée est 1. Un nombre de vues supérieur à 2 implique un passage de rendu multi-vues. Les matériaux prenant en charge le mode multivue doivent interroger la fonction `viewCount()` dans ` createShader()` ou dans leur constructeur ` QSGMaterialShader `, et s’assurer que les shaders appropriés sont sélectionnés. Le shader de sommets doit ensuite utiliser ` gl_ViewIndex ` pour indexer le tableau de matrices de projection modèle-vue, car il existe plusieurs matrices en mode multivue (une pour chaque vue).

Prenons, à titre d’exemple, le shader de sommets simple suivant :

#version 440

layout(location = 0) in vec4 vertexCoord;
layout(location = 1) in vec4 vertexColor;

layout(location = 0) out vec4 color;

layout(std140, binding = 0) uniform buf {
    mat4 matrix[2];
    float opacity;
};

void main()
{
    gl_Position = matrix[gl_ViewIndex] * vertexCoord;
    color = vertexColor * opacity;
}

Ce shader est conçu pour gérer 2 vues, et 2 vues uniquement. Il n’est pas compatible avec d’autres nombres de vues. Lors de la configuration du shader, l’outil qsb doit être appelé avec l’option --view-count 2 ou, si vous utilisez l’intégration CMake, VIEW_COUNT 2 doit être spécifié dans la commande qt_add_shaders().

Remarque : une ligne contenant #extension GL_EXT_multiview : require est automatiquement injectée par qsb dès qu’un nombre de vues égal ou supérieur à 2 est défini.

Les développeurs sont encouragés à utiliser la variable de préprocesseur QSHADER_VIEW_COUNT, injectée automatiquement, afin de simplifier la gestion des différents nombres de vues. Par exemple, s’il est nécessaire de prendre en charge à la fois le mode sans vue multiple et le mode avec vue multiple (nombre de vues égal à 2) dans le même fichier source, la procédure suivante peut être suivie :

#version 440

layout(location = 0) in vec4 vertexCoord;
layout(location = 1) in vec4 vertexColor;

layout(location = 0) out vec4 color;

layout(std140, binding = 0) uniform buf {
#if QSHADER_VIEW_COUNT >= 2
    mat4 matrix[QSHADER_VIEW_COUNT];
#else
    mat4 matrix;
#endif
    float opacity;
};

void main()
{
#if QSHADER_VIEW_COUNT >= 2
    gl_Position = matrix[gl_ViewIndex] * vertexCoord;
#else
    gl_Position = matrix * vertexCoord;
#endif
    color = vertexColor * opacity;
}

Le même fichier source peut désormais être traité deux fois via ` qsb ` ou ` qt_add_shaders() ` : une fois sans spécifier le nombre de vues, et une fois avec le nombre de vues défini sur 2. Le matériel peut alors choisir le fichier .qsb approprié en fonction de la valeur de `viewCount()` au moment de l’exécution.

Avec CMake, cela pourrait ressembler à ce qui suit. Dans cet exemple, le fichier « QSGMaterialShader » correspondant est censé choisir entre :/shaders/example.vert.qsb et :/shaders/multiview/example.vert.qsb en fonction de la valeur de viewCount(). (Il en va de même pour le shader de fragment.)

qt_add_shaders(application "application_shaders"
    PREFIX
        /
    FILES
        shaders/example.vert
        shaders/example.frag
)

qt_add_shaders(application "application_multiview_shaders"
    GLSL
        330,300es
    HLSL
        61
    MSL
        12
    VIEW_COUNT
        2
    PREFIX
        /
    FILES
        shaders/example.vert
        shaders/example.frag
    OUTPUTS
        shaders/multiview/example.vert
        shaders/multiview/example.frag
)

Remarque : le shader de fragment doit être traité de la même manière que le shader de sommet, même si le code du shader de fragment ne peut présenter aucune dépendance vis-à-vis du nombre de vues (gl_ViewIndex), afin d’assurer une portabilité maximale. Il y a deux raisons d’inclure également les shaders de fragment dans l’ensemble multivue. La première est que le mélange de différentes versions de shaders au sein d’un même pipeline graphique peut poser problème, selon l’API graphique sous-jacente : avec D3D12, par exemple, le mélange de shaders HLSL pour les modèles de shader 5.0 et 6.1 générerait une erreur. L’autre est que le fait de disposer d’ QSHADER_VIEW_COUNT s définies dans les shaders de fragment peut s’avérer très utile, par exemple lors du partage d’une structure de tampon uniforme entre les étapes de sommet et de fragment.

Remarque : pour OpenGL, la version minimale de GLSL requise pour les shaders de sommets utilisant l’ gl_ViewIndex est 330. Des versions antérieures peuvent être acceptées lors de la compilation, mais peuvent entraîner une erreur lors de l’exécution, selon l’implémentation d’OpenGL.

Pour plus de commodité, il existe également une option ` MULTIVIEW ` pour `qt_add_shaders()`. Celle-ci exécute d’abord l’outil ` qsb ` normalement, puis remplace ` VIEW_COUNT ` par ` 2`, définit ` GLSL`, ` HLSL` et ` MSL ` sur des valeurs par défaut appropriées, et relance ` qsb `, générant cette fois-ci des fichiers `.qsb` avec un suffixe ajouté. L’implémentation du matériau peut alors utiliser la surcharge de la fonction ` QSGMaterialShader::setShaderFileName()` prenant un argument de type ` viewCount `, qui sélectionne automatiquement le fichier .qsb approprié.

Ce qui suit est donc globalement équivalent à l’exemple d’appel présenté ci-dessus, à la différence qu’il n’est pas nécessaire de spécifier manuellement des fichiers de sortie. Notez qu’il peut arriver que les versions du langage de shading choisies automatiquement ne soient pas suffisantes ; dans ce cas, les applications doivent continuer à tout spécifier explicitement.

qt_add_shaders(application "application_multiview_shaders"
    MULTIVIEW
    PREFIX
        /
    FILES
        shaders/example.vert
        shaders/example.frag
)

Consultez QRhi::MultiView, QRhiColorAttachment::setMultiViewCount() et QRhiGraphicsPipeline::setMultiViewCount() pour plus de détails de bas niveau sur la prise en charge multivue dans Qt. Le moteur de rendu de graphe de scène Qt Quick est prêt à reconnaître les cibles de rendu multivue, lorsqu’elles sont spécifiées via QQuickRenderTarget::fromRhiRenderTarget() ou les fonctions spécifiques à l’API 3D, telles que fromVulkanImage() avec un argument arraySize supérieur à 1. Le moteur de rendu transmettra alors le nombre de vues aux pipelines graphiques et aux matériaux.

Cette fonction a été introduite dans Qt 6.8.

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