Sur cette page

QShaderDescription Class

Décrit l'interface d'un shader. En savoir plus...

En-tête : #include <qshaderdescription.h>
CMake : find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake : QT += gui
Depuis : Qt 6.6

Types publics

(since 6.6) struct BlockVariable
(since 6.6) struct BuiltinVariable
(since 6.6) struct InOutVariable
(since 6.6) struct PushConstantBlock
(since 6.6) struct StorageBlock
(since 6.6) struct UniformBlock
enum BuiltinType { PositionBuiltin, PointSizeBuiltin, ClipDistanceBuiltin, CullDistanceBuiltin, VertexIdBuiltin, …, ViewIndexBuiltin }
enum ImageFlag { ReadOnlyImage, WriteOnlyImage }
flags ImageFlags
enum ImageFormat { ImageFormatUnknown, ImageFormatRgba32f, ImageFormatRgba16f, ImageFormatR32f, ImageFormatRgba8, …, ImageFormatR8ui }
enum QualifierFlag { QualifierReadOnly, QualifierWriteOnly, QualifierCoherent, QualifierVolatile, QualifierRestrict }
flags QualifierFlags
enum TessellationMode { UnknownTessellationMode, TrianglesTessellationMode, QuadTessellationMode, IsolineTessellationMode }
enum TessellationPartitioning { UnknownTessellationPartitioning, EqualTessellationPartitioning, FractionalEvenTessellationPartitioning, FractionalOddTessellationPartitioning }
enum TessellationWindingOrder { UnknownTessellationWindingOrder, CwTessellationWindingOrder, CcwTessellationWindingOrder }
enum VariableType { Unknown, Float, Vec2, Vec3, Vec4, …, Half4 }

Fonctions publiques

QShaderDescription()
QShaderDescription(const QShaderDescription &other)
~QShaderDescription()
QList<QShaderDescription::InOutVariable> combinedImageSamplers() const
std::array<uint, 3> computeShaderLocalSize() const
QList<QShaderDescription::BuiltinVariable> inputBuiltinVariables() const
QList<QShaderDescription::InOutVariable> inputVariables() const
bool isValid() const
QList<QShaderDescription::BuiltinVariable> outputBuiltinVariables() const
QList<QShaderDescription::InOutVariable> outputVariables() const
QList<QShaderDescription::PushConstantBlock> pushConstantBlocks() const
void serialize(QDataStream *stream, int version) const
QList<QShaderDescription::StorageBlock> storageBlocks() const
QList<QShaderDescription::InOutVariable> storageImages() const
QShaderDescription::TessellationMode tessellationMode() const
uint tessellationOutputVertexCount() const
QShaderDescription::TessellationPartitioning tessellationPartitioning() const
QShaderDescription::TessellationWindingOrder tessellationWindingOrder() const
QByteArray toJson() const
QList<QShaderDescription::UniformBlock> uniformBlocks() const
QShaderDescription &operator=(const QShaderDescription &other)

Membres publics statiques

QShaderDescription deserialize(QDataStream *stream, int version)
bool operator==(const QShaderDescription &lhs, const QShaderDescription &rhs)

Description détaillée

Avertissement : la famille de classes QRhi du module Qt GUI, notamment QShader et QShaderDescription, offre des garanties de compatibilité limitées. Il n'existe aucune garantie de compatibilité au niveau du code source ou des binaires pour ces classes, ce qui signifie que le fonctionnement de l'API n'est garanti qu'avec la version de Qt utilisée pour le développement de l'application. Les modifications entraînant une incompatibilité au niveau du code source sont toutefois destinées à être réduites au minimum et ne seront apportées que dans les versions mineures (6.7, 6.8, etc.). Pour utiliser ces classes dans une application, liez-vous à Qt::GuiPrivate (si vous utilisez CMake), et incluez les en-têtes portant le préfixe rhi, par exemple #include <rhi/qshaderdescription.h>.

Un shader dispose généralement d’un ensemble d’entrées et de sorties. Un shader de sommets, par exemple, comporte un certain nombre de variables d’entrée et peut utiliser un ou plusieurs tampons uniformes pour accéder aux données (par exemple, une matrice modelview) fournies par l’application. Le shader de l’étape des fragments reçoit des données de l’étape des sommets (dans une configuration simple) et peut également s’appuyer sur des données provenant de tampons uniformes, d’images et d’échantillonneurs.

En ce qui concerne les entrées de sommets et la structure des tampons uniformes (quels sont les noms des éléments ? quelles sont leur taille, leur décalage, etc.), les applications et les frameworks peuvent avoir besoin de les découvrir de manière dynamique lors de l’exécution. C’est souvent le cas lorsque le shader n’est pas intégré mais fourni par une entité externe, comme l’utilisateur.

Les API graphiques modernes et allégées ne proposent parfois plus de moyen d’interroger les informations de réflexion du shader à l’exécution. Par conséquent, ces données sont désormais générées automatiquement par QShaderBaker et fournies sous la forme d’un objet `QShaderDescription` pour chaque ` QShader`.

Exemple

Prenons le shader de sommets suivant :

#version 440

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 v_color;

layout(std140, binding = 0) uniform buf {
    mat4 mvp;
    float opacity;
} ubuf;

void main()
{
    v_color = color;
    gl_Position = ubuf.mvp * position;
}

Ce shader possède deux entrées : position à l’emplacement 0, de type vec4, et color à l’emplacement 1, de type vec3. Il possède une sortie : v_color, bien que celle-ci ne présente généralement aucun intérêt pour les applications. Plus important encore, il existe un bloc uniforme à la liaison 0, d’une taille de 68 octets et comportant deux membres : une matrice 4x4 nommée mvp à l’offset 0, et un flottant opacity à l’offset 64.

Tout cela est décrit par un objet `QShaderDescription`. `QShaderDescription` peut être sérialisé au format JSON et au format binaire via QDataStream, et peut être désérialisé à partir de ce format binaire. En pratique, cela est rarement nécessaire puisque ` QShader ` gère automatiquement le `QShaderDescription` associé, mais si le `QShaderDescription` du shader ci-dessus était écrit au format JSON (comme le fait l’option « -d » de l’outil qsb ), il ressemblerait à ceci :

{
    "inputs": [
        {
            "location": 1,
            "name": "color",
            "type": "vec3"
        },
        {
            "location": 0,
            "name": "position",
            "type": "vec4"
        }
    ],
    "outputs": [
        {
            "location": 0,
            "name": "v_color",
            "type": "vec3"
        }
    ],
    "uniformBlocks": [
        {
            "binding": 0,
            "blockName": "buf",
            "members": [
                {
                    "matrixStride": 16,
                    "name": "mvp",
                    "offset": 0,
                    "size": 64,
                    "type": "mat4"
                },
                {
                    "name": "opacity",
                    "offset": 64,
                    "size": 4,
                    "type": "float"
                }
            ],
            "set": 0,
            "size": 68,
            "structName": "ubuf"
        }
    ]
}

L'API C++ permet d'accéder à une structure de données comme celle ci-dessus. Par souci de simplicité, les structures internes ne contiennent que des membres de données publics, d'autant plus que leur disposition ne devrait pas changer à l'avenir.

Voir également QShaderBaker et QShader.

Documentation sur les types de membres

enum QShaderDescription::BuiltinType

Type de variable intégrée.

ConstanteValeur
QShaderDescription::PositionBuiltin0
QShaderDescription::PointSizeBuiltin1
QShaderDescription::ClipDistanceBuiltin3
QShaderDescription::CullDistanceBuiltin4
QShaderDescription::VertexIdBuiltin5
QShaderDescription::InstanceIdBuiltin6
QShaderDescription::PrimitiveIdBuiltin7
QShaderDescription::InvocationIdBuiltin8
QShaderDescription::LayerBuiltin9
QShaderDescription::ViewportIndexBuiltin10
QShaderDescription::TessLevelOuterBuiltin11
QShaderDescription::TessLevelInnerBuiltin12
QShaderDescription::TessCoordBuiltin13
QShaderDescription::PatchVerticesBuiltin14
QShaderDescription::FragCoordBuiltin15
QShaderDescription::PointCoordBuiltin16
QShaderDescription::FrontFacingBuiltin17
QShaderDescription::SampleIdBuiltin18
QShaderDescription::SamplePositionBuiltin19
QShaderDescription::SampleMaskBuiltin20
QShaderDescription::FragDepthBuiltin22
QShaderDescription::NumWorkGroupsBuiltin24
QShaderDescription::WorkgroupSizeBuiltin25
QShaderDescription::WorkgroupIdBuiltin26
QShaderDescription::LocalInvocationIdBuiltin27
QShaderDescription::GlobalInvocationIdBuiltin28
QShaderDescription::LocalInvocationIndexBuiltin29
QShaderDescription::VertexIndexBuiltin42
QShaderDescription::InstanceIndexBuiltin43
QShaderDescription::ViewIndexBuiltin4440

enum QShaderDescription::ImageFlag
flags QShaderDescription::ImageFlags

Indicateurs d'image.

ConstanteValeur
QShaderDescription::ReadOnlyImage1 << 0
QShaderDescription::WriteOnlyImage1 << 1

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

enum QShaderDescription::ImageFormat

Format d'image.

ConstanteValeur
QShaderDescription::ImageFormatUnknown0
QShaderDescription::ImageFormatRgba32f1
QShaderDescription::ImageFormatRgba16f2
QShaderDescription::ImageFormatR32f3
QShaderDescription::ImageFormatRgba84
QShaderDescription::ImageFormatRgba8Snorm5
QShaderDescription::ImageFormatRg32f6
QShaderDescription::ImageFormatRg16f7
QShaderDescription::ImageFormatR11fG11fB10f8
QShaderDescription::ImageFormatR16f9
QShaderDescription::ImageFormatRgba1610
QShaderDescription::ImageFormatRgb10A211
QShaderDescription::ImageFormatRg1612
QShaderDescription::ImageFormatRg813
QShaderDescription::ImageFormatR1614
QShaderDescription::ImageFormatR815
QShaderDescription::ImageFormatRgba16Snorm16
QShaderDescription::ImageFormatRg16Snorm17
QShaderDescription::ImageFormatRg8Snorm18
QShaderDescription::ImageFormatR16Snorm19
QShaderDescription::ImageFormatR8Snorm20
QShaderDescription::ImageFormatRgba32i21
QShaderDescription::ImageFormatRgba16i22
QShaderDescription::ImageFormatRgba8i23
QShaderDescription::ImageFormatR32i24
QShaderDescription::ImageFormatRg32i25
QShaderDescription::ImageFormatRg16i26
QShaderDescription::ImageFormatRg8i27
QShaderDescription::ImageFormatR16i28
QShaderDescription::ImageFormatR8i29
QShaderDescription::ImageFormatRgba32ui30
QShaderDescription::ImageFormatRgba16ui31
QShaderDescription::ImageFormatRgba8ui32
QShaderDescription::ImageFormatR32ui33
QShaderDescription::ImageFormatRgb10a2ui34
QShaderDescription::ImageFormatRg32ui35
QShaderDescription::ImageFormatRg16ui36
QShaderDescription::ImageFormatRg8ui37
QShaderDescription::ImageFormatR16ui38
QShaderDescription::ImageFormatR8ui39

enum QShaderDescription::QualifierFlag
flags QShaderDescription::QualifierFlags

Indicateurs de qualification.

ConstanteValeur
QShaderDescription::QualifierReadOnly1 << 0
QShaderDescription::QualifierWriteOnly1 << 1
QShaderDescription::QualifierCoherent1 << 2
QShaderDescription::QualifierVolatile1 << 3
QShaderDescription::QualifierRestrict1 << 4

Le type QualifierFlags est une définition de type (typedef) pour QFlags<QualifierFlag>. Il stocke une combinaison OU de valeurs QualifierFlag.

enum QShaderDescription::TessellationMode

ConstanteValeur
QShaderDescription::UnknownTessellationMode0
QShaderDescription::TrianglesTessellationMode1
QShaderDescription::QuadTessellationMode2
QShaderDescription::IsolineTessellationMode3

enum QShaderDescription::TessellationPartitioning

ConstanteValeur
QShaderDescription::UnknownTessellationPartitioning0
QShaderDescription::EqualTessellationPartitioning1
QShaderDescription::FractionalEvenTessellationPartitioning2
QShaderDescription::FractionalOddTessellationPartitioning3

enum QShaderDescription::TessellationWindingOrder

ConstanteValeur
QShaderDescription::UnknownTessellationWindingOrder0
QShaderDescription::CwTessellationWindingOrder1
QShaderDescription::CcwTessellationWindingOrder2

enum QShaderDescription::VariableType

Représente le type d'une variable ou d'un élément de bloc.

ConstanteValeurDescription
QShaderDescription::Unknown0 
QShaderDescription::Float1 
QShaderDescription::Vec22 
QShaderDescription::Vec33 
QShaderDescription::Vec44 
QShaderDescription::Mat25 
QShaderDescription::Mat2x36 
QShaderDescription::Mat2x47 
QShaderDescription::Mat38 
QShaderDescription::Mat3x29 
QShaderDescription::Mat3x410 
QShaderDescription::Mat411 
QShaderDescription::Mat4x212 
QShaderDescription::Mat4x313 
QShaderDescription::Int14 
QShaderDescription::Int215 
QShaderDescription::Int316 
QShaderDescription::Int417 
QShaderDescription::Uint18 
QShaderDescription::Uint219 
QShaderDescription::Uint320 
QShaderDescription::Uint421 
QShaderDescription::Bool22 
QShaderDescription::Bool223 
QShaderDescription::Bool324 
QShaderDescription::Bool425 
QShaderDescription::Double26 
QShaderDescription::Double227 
QShaderDescription::Double328 
QShaderDescription::Double429 
QShaderDescription::DMat230 
QShaderDescription::DMat2x331 
QShaderDescription::DMat2x432 
QShaderDescription::DMat333 
QShaderDescription::DMat3x234 
QShaderDescription::DMat3x435 
QShaderDescription::DMat436 
QShaderDescription::DMat4x237 
QShaderDescription::DMat4x338 
QShaderDescription::Sampler1D39 
QShaderDescription::Sampler2D40 
QShaderDescription::Sampler2DMS41 
QShaderDescription::Sampler3D42 
QShaderDescription::SamplerCube43 
QShaderDescription::Sampler1DArray44 
QShaderDescription::Sampler2DArray45 
QShaderDescription::Sampler2DMSArray46 
QShaderDescription::Sampler3DArray47 
QShaderDescription::SamplerCubeArray48 
QShaderDescription::SamplerRect49 
QShaderDescription::SamplerBuffer50 
QShaderDescription::SamplerExternalOES51 
QShaderDescription::Sampler52Pour les échantillonneurs autonomes.
QShaderDescription::Image1D53 
QShaderDescription::Image2D54 
QShaderDescription::Image2DMS55 
QShaderDescription::Image3D56 
QShaderDescription::ImageCube57 
QShaderDescription::Image1DArray58 
QShaderDescription::Image2DArray59 
QShaderDescription::Image2DMSArray60 
QShaderDescription::Image3DArray61 
QShaderDescription::ImageCubeArray62 
QShaderDescription::ImageRect63 
QShaderDescription::ImageBuffer64 
QShaderDescription::Struct65 
QShaderDescription::Half66 
QShaderDescription::Half267 
QShaderDescription::Half368 
QShaderDescription::Half469 

Documentation sur les fonctions de membre

QShaderDescription::QShaderDescription()

Crée un nouvel objet QShaderDescription vide.

Remarque : le fait qu'il soit vide implique que la méthode ` isValid()` renvoie ` false ` pour l'instance nouvellement créée.

QShaderDescription::QShaderDescription(const QShaderDescription &other)

Crée une copie de other.

[noexcept] QShaderDescription::~QShaderDescription()

Destructeur.

QList<QShaderDescription::InOutVariable> QShaderDescription::combinedImageSamplers() const

Renvoie la liste des échantillonneurs d'images combinés

Avec des shaders GLSL/Vulkan comme source, un uniforme layout(binding = 1) uniform sampler2D tex; génère ce qui suit : (présenté ici sous forme de texte JSON)

"combinedImageSamplers": [
     {
         "binding": 1,
         "name": "tex",
         "set": 0,
         "type": "sampler2D"
     }
 ]

Cela ne signifie pas que les versions du shader écrites dans d’autres langages doivent également utiliser un échantillonneur d’image combiné, d’autant plus que ce concept n’existe pas forcément partout. Par exemple, une version HLSL utilisera probablement simplement un objet `Texture2D` et un objet `SamplerState` avec les registres `t1` et `s1`, respectivement.

std::array<uint, 3> QShaderDescription::computeShaderLocalSize() const

Renvoie la taille locale d'un shader de calcul.

Par exemple, pour un shader de calcul présentant la déclaration suivante, la fonction renvoie { 256, 16, 1}.

layout(local_size_x = 256, local_size_y = 16, local_size_z = 1) in;

[static] QShaderDescription QShaderDescription::deserialize(QDataStream *stream, int version)

Renvoie un nouvel objet ` QShaderDescription ` chargé à partir de stream. ` version ` spécifie la version de qsb.

Voir également serialize().

QList<QShaderDescription::BuiltinVariable> QShaderDescription::inputBuiltinVariables() const

Renvoie la liste des fonctions intégrées actives utilisées en entrée. Par exemple, un shader d’évaluation de tessellation lisant les valeurs de `gl_TessCoord` et `gl_Position` affichera ici les éléments suivants : ` TessCoordBuiltin ` et ` PositionBuiltin `.

QList<QShaderDescription::InOutVariable> QShaderDescription::inputVariables() const

Renvoie la liste des variables d'entrée. Celle-ci comprend les entrées de sommets (parfois appelées « attributs ») pour l'étape des sommets, ainsi que les entrées pour les autres étapes (parfois appelées « variables »).

bool QShaderDescription::isValid() const

Renvoie « true » si l'QShaderDescription ion contient au moins une entrée dans l'une des listes « variable » ou « block ».

QList<QShaderDescription::BuiltinVariable> QShaderDescription::outputBuiltinVariables() const

Renvoie la liste des variables intégrées actives utilisées comme données d'entrée. Par exemple, un shader de sommet aura très souvent la variable intégrée « PositionBuiltin » comme sortie.

QList<QShaderDescription::InOutVariable> QShaderDescription::outputVariables() const

Renvoie la liste des variables de sortie.

QList<QShaderDescription::PushConstantBlock> QShaderDescription::pushConstantBlocks() const

Renvoie la liste des blocs de constantes « push ».

Remarque : évitez de recourir aux blocs constants « push » pour les shaders destinés à être utilisés avec l'interface matérielle de rendu Qt, car celle-ci ne les prend actuellement pas en charge.

void QShaderDescription::serialize(QDataStream *stream, int version) const

Sérialise cette URL QShaderDescription vers stream. version spécifie la version de qsb.

Voir également deserialize() et toJson().

QList<QShaderDescription::StorageBlock> QShaderDescription::storageBlocks() const

Renvoie la liste des blocs de stockage de shaders.

Par exemple, avec des shaders GLSL/Vulkan comme source, la déclaration

struct Stuff {
    vec2 a;
    vec2 b;
};
layout(std140, binding = 0) buffer StuffSsbo {
    vec4 whatever;
    Stuff stuff[];
} buf;

génère ce qui suit : (présenté ici sous forme de JSON textuel)

"storageBlocks": [ {
    "binding": 0,
    "blockName": "StuffSsbo",
    "instanceName": "buf",
    "knownSize": 16,
    "runtimeArrayStride": 16
    "members": [
        {
            "name": "whatever",
            "offset": 0,
            "size": 16,
            "type": "vec4"
        },
        {
            "arrayDims": [
                0
            ],
            "name": "stuff",
            "offset": 16,
            "size": 0,
            "structMembers": [
                {
                    "name": "a",
                    "offset": 0,
                    "size": 8,
                    "type": "vec2"
                },
                {
                    "name": "b",
                    "offset": 8,
                    "size": 8,
                    "type": "vec2"
                }
            ],
            "type": "struct"
        }
    ],
    "set": 0
} ]

Remarque : la taille du dernier élément du bloc de stockage n’est pas définie. Cela se traduit par une valeur « size » égale à 0 et une dimension de tableau de « [0] ». L’ knownSize du bloc de stockage exclut la taille du dernier élément, car celle-ci ne sera connue qu’au moment de l’exécution. Le pas en octets entre les éléments du tableau pour un dernier élément dont la taille est indéfinie est de runtimeArrayStride. Cette valeur est déterminée selon les règles de la norme de disposition de la mémoire tampon spécifiée (std140, std430).

Remarque : les SSBO ne sont pas disponibles avec certaines API graphiques, telles qu’OpenGL 2.x ou OpenGL ES antérieures à la version 3.1.

QList<QShaderDescription::InOutVariable> QShaderDescription::storageImages() const

Renvoie la liste des variables d'image.

Celles-ci apparaîtront probablement dans les shaders de calcul. Par exemple, layout (binding = 0, rgba8) uniform readonly image2D inputImage; génère ce qui suit : (présenté ici sous forme de texte JSON)

"storageImages": [
     {
         "binding": 0,
         "imageFormat": "rgba8",
         "name": "inputImage",
         "set": 0,
         "type": "image2D"
     }
 ]

Remarque : les objets imagedistincts ne sont pas compatibles avec certaines API graphiques, telles qu’OpenGL 2.x ou OpenGL ES antérieures à la version 3.1.

QShaderDescription::TessellationMode QShaderDescription::tessellationMode() const

Renvoie le mode d'exécution de la tessellation pour un shader de contrôle ou d'évaluation de la tessellation.

Si ce paramètre n’est pas défini, la valeur renvoyée est UnknownTessellationMode.

Par exemple, pour un shader d’évaluation de tessellation présentant la déclaration suivante, la fonction renvoie « TrianglesTessellationMode ».

layout(triangles) in;

uint QShaderDescription::tessellationOutputVertexCount() const

Renvoie le nombre de sommets de sortie.

Par exemple, pour un shader de contrôle de tessellation présentant la déclaration suivante, la fonction renvoie 3.

layout(vertices = 3) out;

QShaderDescription::TessellationPartitioning QShaderDescription::tessellationPartitioning() const

Renvoie le mode de partitionnement de tessellation pour un shader de contrôle ou d'évaluation de tessellation.

Si ce paramètre n’est pas défini, la valeur renvoyée est UnknownTessellationPartitioning.

Par exemple, pour un shader d’évaluation de tessellation présentant la déclaration suivante, la fonction renvoie « FractionalOddTessellationPartitioning ».

layout(triangles, fractional_odd_spacing, ccw) in;

QShaderDescription::TessellationWindingOrder QShaderDescription::tessellationWindingOrder() const

Renvoie l'ordre d'enroulement d'une tessellation pour un shader de contrôle ou d'évaluation de tessellation.

Si ce paramètre n’est pas défini, la valeur renvoyée est UnknownTessellationWindingOrder.

Par exemple, pour un shader d’évaluation de tessellation présentant la déclaration suivante, la fonction renvoie « CcwTessellationWindingOrder ».

layout(triangles, fractional_odd_spacing, ccw) in;

QByteArray QShaderDescription::toJson() const

Renvoie une version textuelle JSON sérialisée des données.

Remarque : aucune méthode de désérialisationn'est fournie pour le texte JSON.

Voir également serialize().

QList<QShaderDescription::UniformBlock> QShaderDescription::uniformBlocks() const

Renvoie la liste des blocs uniformes.

QShaderDescription &QShaderDescription::operator=(const QShaderDescription &other)

Attribue la propriété « other » à cet objet.

Non-membres associés

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

Renvoie ` true ` si les deux objets ` QShaderDescription `, ` lhs ` et ` rhs `, sont égaux.

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