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 |
- Liste de tous les membres, y compris les membres hérités
- QSGMaterial fait partie des classes de matériaux de graphe de scène d'Qt Quick .
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
| Constante | Valeur | Description |
|---|---|---|
QSGMaterial::Blending | 0x0001 | Définissez cet indicateur sur « true » si le matériau nécessite que le mélange soit activé pendant le rendu. |
QSGMaterial::RequiresDeterminant | 0x0002 | Dé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::RequiresFullMatrixExceptTranslate | 0x0004 | RequiresDeterminant | Dé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::RequiresFullMatrix | 0x0008 | RequiresFullMatrixExceptTranslate | Dé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::NoBatching | 0x0010 | Dé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::CustomCompileStep | NoBatching | Dans 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.