Sur cette page

QShaderDescription Class

Décrit l'interface d'un shader. Plus d'informations...

En-tête : #include <QShaderDescription>
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 GuiI, y compris QShader et QShaderDescription, offre des garanties de compatibilité limitées. Il n'y a aucune garantie de compatibilité source ou binaire pour ces classes, ce qui signifie que l'API n'est garantie que pour fonctionner avec la version de Qt avec laquelle l'application a été développée. Les changements incompatibles avec la source sont cependant destinés à être maintenus au minimum et ne seront effectués que dans les versions mineures (6.7, 6.8, et ainsi de suite). Pour utiliser ces classes dans une application, créez un lien vers Qt::GuiPrivate (si vous utilisez CMake) et incluez les en-têtes avec le préfixe rhi, par exemple #include <rhi/qshaderdescription.h>.

Un nuanceur possède généralement un ensemble d'entrées et de sorties. Un nuanceur de sommets, par exemple, possède 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 nuanceur de l'étape de fragmentation reçoit des données de l'étape de sommet (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 vertex et la disposition des tampons uniformes (quels sont les noms des membres ? quelle est leur taille, leur décalage, etc.), les applications et les cadres peuvent avoir besoin de les découvrir dynamiquement au moment de l'exécution. C'est typiquement 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 peuvent ne plus fournir de moyen d'interroger les informations de réflexion des shaders au moment de l'exécution. Par conséquent, ces données sont désormais générées automatiquement par QShaderBaker et sont fournies sous la forme d'un objet QShaderDescription pour chaque QShader.

Exemple

Prenons le nuanceur 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 nuanceur a deux entrées : position à l'emplacement 0 avec un type de vec4, et color à l'emplacement 1 avec un type de vec3. Il a une sortie : v_color bien que cela ne soit généralement pas intéressant pour les applications. Ce qui est plus important, c'est qu'il y a un bloc uniforme à la liaison 0 avec une taille de 68 octets et deux membres, une matrice 4x4 nommée mvp à l'offset 0, et un flottant opacity à l'offset 64.

Tout ceci est décrit par un objet QShaderDescription. QShaderDescription peut être sérialisé en JSON et dans un format binaire via QDataStream, et peut être désérialisé à partir de ce format binaire. En pratique, cela est rarement nécessaire puisque QShader se charge automatiquement de la QShaderDescription associée, mais si la QShaderDescription du shader ci-dessus était écrite au format JSON (comme c'est le cas avec l'option -d de l'outil qsb ), elle ressemblerait à ce qui suit :

{
    "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 telle que celle décrite ci-dessus. Pour des raisons de simplicité, les structures internes ne contiennent que des membres de données publiques, compte tenu également du fait que leur disposition n'est pas susceptible de 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

Drapeaux d'image.

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

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

enum QShaderDescription::ImageFormat

Format de l'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

Drapeaux du qualificateur.

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

Le type QualifierFlags est un 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 membre 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 séparés.
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 des fonctions membres

QShaderDescription::QShaderDescription()

Construit un nouveau QShaderDescription vide.

Remarque : le fait d'être vide implique que isValid() renvoie false pour l'instance nouvellement construite.

QShaderDescription::QShaderDescription(const QShaderDescription &other)

Construit une copie de other.

[noexcept] QShaderDescription::~QShaderDescription()

Destructeur.

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

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

Avec les 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 JSON textuel)

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

Cela ne signifie pas que les versions du shader dans d'autres langages doivent également utiliser un échantillonneur d'images combiné, surtout si l'on considère que le concept n'existe pas partout. Par exemple, une version HLSL utilisera probablement un objet Texture2D et SamplerState avec les registres t1 et s1, respectivement.

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

Renvoie la taille locale d'un nuanceur de calcul.

Par exemple, pour un nuanceur de calcul avec 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 nouveau QShaderDescription chargé à partir de stream. version spécifie la version qsb.

Voir aussi serialize().

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

Renvoie la liste des composants actifs utilisés en entrée. Par exemple, un shader d'évaluation de tessellation lisant les valeurs de gl_TessCoord et gl_Position aura TessCoordBuiltin et PositionBuiltin listés ici.

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

Renvoie la liste des variables d'entrée. Cela comprend les entrées du sommet (parfois appelées attributs) pour l'étape du sommet, et les entrées pour les autres étapes (parfois appelées variations).

bool QShaderDescription::isValid() const

Retourne vrai si le site QShaderDescription contient au moins une entrée dans l'une des listes de variables et de blocs.

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

Renvoie la liste des variables intégrées actives utilisées en entrée. Par exemple, un vertex shader aura très souvent PositionBuiltin comme variable intégrée de 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 de poussée.

Note : Evitez de vous appuyer sur les blocs de constantes push pour les shaders qui doivent être utilisés en combinaison avec l'interface matérielle de rendu de Qt, car celle-ci ne les supporte pas actuellement.

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

Sérialise ce QShaderDescription en stream. version spécifie la version qsb.

Voir aussi deserialize() et toJson().

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

Renvoie la liste des blocs de stockage de shaders.

Par exemple, avec les 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 membre du bloc de stockage est indéfinie. Cela se traduit par size 0 et une dimension de tableau de [0]. knownSize exclut la taille du dernier membre du bloc de stockage car elle ne sera connue qu'au moment de l'exécution. L'espacement en octets entre les éléments du tableau pour un dernier membre avec une taille de tableau indéfinie est runtimeArrayStride. Cette valeur est déterminée selon les règles de la norme d'agencement de la mémoire tampon (std140, std430).

Remarque : les SSBO ne sont pas disponibles avec certaines API graphiques, telles que 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 seront probablement présentes dans les nuanceurs de calcul. Par exemple, layout (binding = 0, rgba8) uniform readonly image2D inputImage; génère ce qui suit : (présenté ici sous forme de JSON textuel)

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

Note : Les objets images séparés ne sont pas compatibles avec certaines API graphiques, telles que OpenGL 2.x ou OpenGL ES antérieur à 3.1.

QShaderDescription::TessellationMode QShaderDescription::tessellationMode() const

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

Si elle n'est pas définie, la valeur renvoyée est UnknownTessellationMode.

Par exemple, pour un nuanceur d'évaluation de tessellation avec la déclaration suivante, la fonction renvoie TrianglesTessellationMode.

layout(triangles) in;

uint QShaderDescription::tessellationOutputVertexCount() const

Renvoie le nombre de sommets en sortie.

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

layout(vertices = 3) out;

QShaderDescription::TessellationPartitioning QShaderDescription::tessellationPartitioning() const

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

Si elle n'est pas définie, la valeur renvoyée est UnknownTessellationPartitioning.

Par exemple, pour un nuanceur d'évaluation de tessellation avec 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 de la tessellation pour un contrôle de tessellation ou un nuanceur d'évaluation.

Si elle n'est pas définie, la valeur renvoyée est UnknownTessellationWindingOrder.

Par exemple, pour un nuanceur d'évaluation de tessellation avec la déclaration suivante, la fonction renvoie CcwTessellationWindingOrder.

layout(triangles, fractional_odd_spacing, ccw) in;

QByteArray QShaderDescription::toJson() const

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

Remarque : il n'existe pas de méthode de désérialisation pour le texte JSON.

Voir aussi serialize().

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

Renvoie la liste des blocs uniformes.

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

Attribue other à cet objet.

Non-membres apparenté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.