QSGMaterial Class
La classe QSGMaterial encapsule l'état de rendu d'un programme d'ombrage. Plus d'informations...
| En-tête : | #include <QSGMaterial> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Quick)target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake : | QT += quick |
| Héritée par : | QSGFlatColorMaterial, QSGOpaqueTextureMaterial, et QSGVertexColorMaterial |
- Liste de tous les membres, y compris les membres hérités
- QSGMaterial fait partie de Qt Quick Scene Graph Material Classes.
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
Les sous-classes QSGMaterial et QSGMaterialShader sont étroitement liées. Pour un graphique de scène (y compris les graphiques imbriqués), il existe une instance QSGMaterialShader unique qui encapsule les shaders utilisés par le graphique de scène pour rendre ce matériau, par exemple un shader pour la coloration plate de la géométrie. Chaque QSGGeometryNode peut avoir un QSGMaterial unique contenant la manière dont le shader doit être configuré lors du dessin de ce nœud, comme la couleur réelle à utiliser pour rendre la géométrie.
QSGMaterial possè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; } };
Voir l'exemple de matériau personnalisé pour une introduction à la mise en œuvre d'une sous-classe QQuickItem soutenue par une QSGGeometryNode et un matériau personnalisé.
Remarque : createShader() n'est appelé qu'une seule fois par QSGMaterialType, afin de réduire le travail redondant de préparation des shaders. Si un matériau QSGM est soutenu par plusieurs ensembles de combinaisons de vertex et de fragment shaders, l'implémentation de type() doit renvoyer un pointeur QSGMaterialType différent et unique pour chaque combinaison de shaders.
Remarque : toutes les classes portant le préfixe QSG doivent être utilisées uniquement dans le fil d'exécution du graphe de scène. Voir Scene Graph and Rendering pour plus d'informations.
Voir également QSGMaterialShader, Graphique de scène - Matériau personnalisé, Graphique de scène - Deux fournisseurs de textures, et Graphique de scène - Graphique.
Documentation des types de membres
enum QSGMaterial::Flag
flags QSGMaterial::Flags
| Constante | Valeur | Description |
|---|---|---|
QSGMaterial::Blending | 0x0001 | Attribuez la valeur true à ce drapeau si le matériau nécessite l'activation du blending lors du rendu. |
QSGMaterial::RequiresDeterminant | 0x0002 | Attribuez la valeur true à ce drapeau si le matériau s'appuie sur le déterminant de la matrice des nœuds géométriques pour le rendu. |
QSGMaterial::RequiresFullMatrixExceptTranslate | 0x0004 | RequiresDeterminant | Attribuer la valeur "true" à ce drapeau si le matériau s'appuie sur la matrice complète des nœuds géométriques pour le rendu, à l'exception de la partie translation. |
QSGMaterial::RequiresFullMatrix | 0x0008 | RequiresFullMatrixExceptTranslate | Attribuer la valeur "vrai" à ce drapeau si le matériau s'appuie sur la matrice complète des nœuds géométriques pour le rendu. |
QSGMaterial::NoBatching | 0x0010 | Attribuez la valeur true à ce drapeau si le matériau utilise des shaders incompatibles avec le mécanisme de mise en lots du graphe de scène. Cela s'applique à certaines utilisations avancées, telles que la manipulation directe de gl_Position.z dans le vertex shader. De telles solutions sont souvent liées à une structure de scène spécifique, et ne sont probablement pas sûres à utiliser avec des contenus arbitraires dans une scène. Ce drapeau ne doit donc être activé qu'après une étude appropriée et ne sera jamais nécessaire pour la grande majorité des matériaux. L'activation de ce drapeau peut conduire à une réduction des performances en raison de la nécessité d'effectuer plus d'appels de dessin. Cet indicateur a été introduit dans Qt 6.3. |
QSGMaterial::CustomCompileStep | NoBatching | Dans Qt 6, cet indicateur est identique à NoBatching. Il est préférable d'utiliser NoBatching à la place. |
Le type Flags est un typedef pour QFlags<Flag>. Il stocke une combinaison OU de valeurs de drapeaux.
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 géométriques 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 triés pour minimiser les changements d'état à chaque appel à QSGMaterialShader::updateState().
Le pointeur this et other sont garantis d'avoir le même type().
[pure virtual] QSGMaterialShader *QSGMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const
Cette fonction renvoie une nouvelle instance de l'implémentation QSGMaterialShader utilisée pour rendre 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 de renderMode et sera mise en cache en interne.
Pour la plupart des matériaux, l'adresse renderMode peut être ignorée. Quelques 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 prendre en compte les transformations de perspective lorsque le mode de rendu RenderMode3D est utilisé.
QSGMaterial::Flags QSGMaterial::flags() const
Renvoie les drapeaux du matériau.
void QSGMaterial::setFlag(QSGMaterial::Flags flags, bool on = true)
Définit l'indicateur flags sur ce matériau si on est vrai ; sinon, il efface l'attribut.
[pure virtual] QSGMaterialType *QSGMaterial::type() const
Cette fonction est appelée par le graphe de scène pour demander un identifiant unique à l'instance QSGMaterialShader instanciée par createShader().
Pour de nombreux matériaux, l'approche typique consistera à renvoyer un pointeur vers une instance statique, et donc globalement disponible, de QSGMaterialType. Le site QSGMaterialType est un objet opaque. Son but est uniquement de servir de moyen simple et sûr de générer des identificateurs 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 dans le cas où le matériau est utilisé dans un rendu multivues.
Remarque : la valeur de retour n'est valide que lorsqu'elle est appelée à partir de 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 de retour est 1. Un nombre de vues supérieur à 2 implique une passe de rendu multi-vues. Les matériaux qui supportent le multiview sont censés interroger viewCount() dans createShader(), ou dans leur constructeur QSGMaterialShader, et s'assurer que les shaders appropriés sont sélectionnés. Le nuanceur de sommets doit ensuite utiliser gl_ViewIndex pour indexer le tableau de matrices de projection de la vue du modèle, car il y a plusieurs matrices en mode multivue. (une pour chaque vue)
Prenons l'exemple d'un simple nuanceur de vertex :
#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 nuanceur est préparé pour gérer 2 vues, et 2 vues seulement. Il n'est pas compatible avec d'autres nombres de vues. Lors du conditionnement du shader, l'outil qsb doit être invoqué avec --view-count 2 ou, si l'on utilise l'intégration CMake, VIEW_COUNT 2 doit être spécifié dans la commande qt_add_shaders().
Remarque : une ligne avec #extension GL_EXT_multiview : require est injectée automatiquement par qsb chaque fois qu'un nombre de vues de 2 ou plus est défini.
Les développeurs sont encouragés à utiliser la variable de préprocesseur injectée automatiquement QSHADER_VIEW_COUNT pour simplifier la gestion des différents nombres de vues. Par exemple, s'il est nécessaire de prendre en charge à la fois le non-multiview et le multiview avec un nombre de vues de 2 dans le même fichier source, il est possible de procéder comme suit :
#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 maintenant être exécuté par qsb ou qt_add_shaders() deux fois, une fois sans spécifier le nombre de vues, et une fois avec le nombre de vues fixé à 2. Le matériel peut alors choisir le fichier .qsb approprié en fonction 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 fragment shader)
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 fragment shader doit être traité de la même manière que le vertex shader, même si le code du fragment shader ne peut pas dépendre du nombre de vues (gl_ViewIndex), pour une portabilité maximale. Il y a deux raisons d'inclure les nuanceurs de fragment dans l'ensemble multivues. La première est que le mélange de différentes versions de shaders dans le même pipeline graphique peut être problématique, en fonction de l'API graphique sous-jacente : avec D3D12 par exemple, le mélange de shaders HLSL pour le modèle de shaders 5.0 et 6.1 génèrerait une erreur. D'autre part, le fait d'avoir QSHADER_VIEW_COUNT défini dans les nuanceurs de fragment peut être très utile, par exemple lors du partage d'une disposition uniforme des tampons entre l'étape des sommets et celle des fragments.
Note : Pour OpenGL, la version minimale de GLSL pour les vertex shaders s'appuyant sur gl_ViewIndex est 330. Les versions inférieures peuvent être acceptées au moment de la construction, mais peuvent conduire à une erreur au moment de l'exécution, en fonction de l'implémentation d'OpenGL.
Par commodité, il existe également une option MULTIVIEW pour qt_add_shaders(). Cette option exécute d'abord l'outil qsb normalement, puis remplace VIEW_COUNT par 2, fixe GLSL, HLSL, MSL à des valeurs par défaut appropriées, et exécute à nouveau qsb, cette fois en produisant des fichiers .qsb auxquels un suffixe a été ajouté. L'implémentation matérielle peut alors utiliser la surcharge QSGMaterialShader::setShaderFileName() en prenant un argument viewCount, qui choisit automatiquement le bon fichier .qsb.
Ce qui suit est donc en grande partie équivalent à l'exemple d'appel montré ci-dessus, sauf qu'aucun fichier de sortie géré manuellement ne doit être spécifié. Notez qu'il peut y avoir des cas où les versions du langage d'ombrage choisies automatiquement ne sont pas suffisantes, auquel 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
)Voir QRhi::MultiView, QRhiColorAttachment::setMultiViewCount(), et QRhiGraphicsPipeline::setMultiViewCount() pour d'autres détails de bas niveau sur la prise en charge du multiview dans Qt. Le moteur de rendu de graphe de scène Qt Quick est prêt à reconnaître les cibles de rendu multivues, lorsqu'elles sont spécifiées via QQuickRenderTarget::fromRhiRenderTarget() ou les fonctions spécifiques de l'API 3D, telles que fromVulkanImage() avec un argument arraySize supérieur à 1. Le moteur de rendu propagera 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.