Sur cette page

QShaderBaker Class

Compile un shader GLSL/Vulkan en SPIR-V, le traduit dans d'autres langages de shader et recueille des métadonnées de réflexion. En savoir plus…

En-tête : #include <qshaderbaker.h>
CMake : find_package(Qt6 REQUIRED COMPONENTS ShaderTools)
target_link_libraries(mytarget PRIVATE Qt6::ShaderTools)
Depuis : Qt 6.6

Types publics

GeneratedShader
enum class GlslOption { GlslEsFragDefaultFloatPrecisionMedium }
flags GlslOptions
enum class SpirvOption { GenerateFullDebugInfo, StripDebugAndVarInfo }
flags SpirvOptions

Fonctions publiques

QShaderBaker()
~QShaderBaker()
QShader bake()
QString errorMessage() const
void setBatchableVertexShaderExtraInputLocation(int location)
void setBreakOnShaderTranslationError(bool enable)
void setGeneratedShaderVariants(const QList<QShader::Variant> &v)
void setGeneratedShaders(const QList<QShaderBaker::GeneratedShader> &v)
(since 6.9) void setGlslOptions(QShaderBaker::GlslOptions options)
(since 6.7) void setMultiViewCount(int count)
void setPerTargetCompilation(bool enable)
void setPreamble(const QByteArray &preamble)
void setSourceDevice(QIODevice *device, QShader::Stage stage, const QString &fileName = QString())
void setSourceFileName(const QString &fileName)
void setSourceFileName(const QString &fileName, QShader::Stage stage)
void setSourceString(const QByteArray &sourceString, QShader::Stage stage, const QString &fileName = QString())
void setSpirvOptions(QShaderBaker::SpirvOptions options)
void setTessellationMode(QShaderDescription::TessellationMode mode)
void setTessellationOutputVertexCount(int count)

Description détaillée

Avertissement : QShaderBaker , tout comme la famille de classes QRhi du module Qt GUI, notamment QShader et QShaderDescription, n'offre que 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 sur laquelle l'application a été développée. Les modifications entraînant une incompatibilité au niveau du code source sont toutefois censées être réduites au minimum et ne seront effectuées que dans les versions mineures (6.7, 6.8, etc.). Pour utiliser cette classe dans une application, liez-la à Qt::ShaderToolsPrivate (si vous utilisez CMake), et incluez les en-têtes portant le préfixe rhi, par exemple #include <rhi/qshaderbaker.h>.

QShaderBaker prend en entrée un shader graphique (vertex, fragment, etc.) ou de calcul, et en produit plusieurs variantes — sous forme de code source ou de bytecode —, accompagnées d’informations de réflexion. Les résultats sont représentés par une instance de QShader, qui offre également des fonctions simples et rapides de sérialisation et de désérialisation.

Remarque : il est recommandéaux applications et aux bibliothèques d'éviter d'utiliser cette classe directement. Il est plutôt conseillé à tous les utilisateurs de Qt de recourir à la compilation hors ligne en appelant l'outil en ligne de commande qsb au moment de la compilation via CMake. L'outil qsb utilise QShaderBaker et écrit la version sérialisée de l'QShader généré dans un fichier. L’utilisation de cette classe doit être limitée aux cas où la compilation à l’exécution est inévitable, par exemple lors de l’utilisation de chaînes de source de shaders fournies par l’utilisateur ou générées dynamiquement.

Pour l’instant, le format d’entrée est toujours supposé être du GLSL de type Vulkan. Consultez la spécification GL_KHR_vulkan_glsl pour un aperçu, en gardant à l'esprit que le module Qt Shader Tools est destiné à être utilisé en combinaison avec les classes QRhi du module Qt Rendering Hardware Interface, et qu'en conséquence, un certain nombre de concepts et de constructions (constantes push, tampons de stockage, sous-passes, etc.) ne sont pas applicables pour le moment. Des options supplémentaires pourraient être introduites à l’avenir, par exemple en activant le HLSL comme format source, une fois que la compilation du HLSL vers le SPIR-V sera jugée appropriée.

Les métadonnées de réflexion sont accessibles à partir de l’ QShader e résultant en appelant ` QShader::description()`. Cela est essentiel lorsqu’il s’agit de déterminer quel ensemble d’entrées de sommets et de ressources de shader un shader attend, ainsi que la disposition de celles-ci, car de nombreuses API graphiques modernes n’offrent pas de capacités de réflexion de shader intégrées.

Flux de travail type

Supposons qu’une application dispose d’un shader de sommets et d’un shader de fragments tels que ceux-ci :

Shader de sommets :

#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;
};

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

Shader de fragment :

#version 440

layout(location = 0) in vec3 v_color;
layout(location = 0) out vec4 fragColor;

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

void main()
{
    fragColor = vec4(v_color * opacity, opacity);
}

Pour obtenir des instances d’ QShader s pouvant être transmises telles quelles à une fonction QRhiGraphicsPipeline, deux options s’offrent à vous : générer le pack de shaders hors ligne ou lors de l’exécution.

La première consiste à exécuter l'outil qsb:

qsb --glsl "100 es,120" --hlsl 50 --msl 12 color.vert -o color.vert.qsb
qsb --glsl "100 es,120" --hlsl 50 --msl 12 color.frag -o color.frag.qsb

L’exemple utilise les cibles de traduction adaptées à QRhi. Il s’agit notamment de GLSL/ES 100, GLSL 120, HLSL Shader Model 5.0 et Metal Shading Language 1.2.

Notez que les options de ligne de commande correspondent à ce qui peut être spécifié via setGeneratedShaders(). Une fois les fichiers résultants disponibles, ils peuvent être fournis avec l’application (généralement intégrés dans l’exécutable via le système de ressources Qt) et peuvent être chargés puis transmis à QShader::fromSerialized() au moment de l’exécution.

Bien que cela ne soit pas illustré ici, qsb offre d’autres fonctionnalités : il est également capable d’appeler fxc sous Windows ou les outils XCode appropriés sous macOS pour compiler le code de shader HLSL ou Metal généré en bytecode et d’inclure les versions compilées dans le fichier QShader. Une fois qu’un pack de shaders « baked » a été enregistré dans un fichier, son contenu peut être examiné en exécutant qsb -d sur celui-ci. Exécutez qsb avec --help pour plus d’informations.

Une autre approche consiste à effectuer la même opération lors de l’exécution. Cela implique de créer une instance de QShaderBaker, d’appeler la méthode setSourceFileName(), puis de configurer les cibles de traduction via la méthode setGeneratedShaders() :

baker.setGeneratedShaderVariants({ QShader::StandardShader });
QList<QShaderBaker::GeneratedShader> targets;
targets.append({ QShader::SpirvShader, QShaderVersion(100) });
targets.append({ QShader::GlslShader, QShaderVersion(100, QShaderVersion::GlslEs) });
targets.append({ QShader::SpirvShader, QShaderVersion(120) });
targets.append({ QShader::HlslShader, QShaderVersion(50) });
targets.append({ QShader::MslShader, QShaderVersion(12) });
baker.setGeneratedShaders(targets);
QShader shaders = baker.bake();
if (!shaders.isValid())
    qWarning() << baker.errorMessage();

Voir également QShader.

Documentation sur les types de membres

[alias] QShaderBaker::GeneratedShader

Synonyme de std::pair<QShader::Source, QShaderVersion>.

enum class QShaderBaker::GlslOption
flags QShaderBaker::GlslOptions

ConstanteValeurDescription
QShaderBaker::GlslOption::GlslEsFragDefaultFloatPrecisionMedium0x01Émet l'precision mediump float; dans les shaders de fragments pour GLSL ES.

Le type GlslOptions est une définition de type (typedef) pour QFlags<GlslOption>. Il stocke une combinaison (ou) de valeurs GlslOption.

enum class QShaderBaker::SpirvOption
flags QShaderBaker::SpirvOptions

ConstanteValeurDescription
QShaderBaker::SpirvOption::GenerateFullDebugInfo0x01Génère et stocke des informations de débogage supplémentaires dans le binaire SPIR-V.
QShaderBaker::SpirvOption::StripDebugAndVarInfo0x02Supprime toutes les informations de débogage et les noms de variables du binaire SPIR-V.

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

Documentation des fonctions membres

QShaderBaker::QShaderBaker()

Crée un nouvel objet QShaderBaker.

[noexcept] QShaderBaker::~QShaderBaker()

Destructeur.

QShader QShaderBaker::bake()

Lance le processus de compilation et de traduction.

Renvoie une instance de ` QShader `. Pour vérifier si le processus s'est déroulé correctement, appelez ` QShader::isValid()`. Lorsque cette fonction indique ` false`, appelez ` errorMessage()` pour récupérer le journal.

Il s’agit d’une opération coûteuse en ressources. Lorsque vous appelez cette fonction depuis des applications, il peut être conseillé de le faire sur un thread distinct.

Remarque : les instancesQShaderBaker sont réutilisables : après avoir appelé bake(), la même instance peut être réutilisée avec des entrées différentes. En revanche, une instance QShaderBaker ne doit être utilisée que sur un seul thread pendant toute sa durée de vie.

QString QShaderBaker::errorMessage() const

Renvoie le message d'erreur issu de la dernière exécution de ` bake()`, ou une chaîne vide s'il n'y a pas eu d'erreur.

Remarque : les erreurs incluent les erreurs de lecture de fichier, les échecs de compilation et de traduction. Le fait de ne pas spécifier de cibles ou de variantes n’est pas considéré comme une erreur, même si l’ QShader qui en résulte n’est pas valide.

void QShaderBaker::setBatchableVertexShaderExtraInputLocation(int location)

Lors de la génération d'une variante « QShader::BatchableVertexShader », le paramètre « location » spécifie l'emplacement d'entrée pour l'entrée de sommet insérée. La valeur par défaut est 7 et ne doit être modifiée que si le shader de sommet utilise déjà l'emplacement d'entrée 7.

void QShaderBaker::setBreakOnShaderTranslationError(bool enable)

Définit le comportement en cas d’échec de la conversion du shader (de SPIR-V vers GLSL/HLSL/MSL). Par défaut, ce paramètre est défini sur `true`, ce qui fait que la fonction ` bake()` renvoie une erreur si le shader demandé ne peut pas être généré. Si ce comportement n’est pas souhaité et que l’objectif est de générer ce qui est possible tout en ignorant silencieusement le reste, définissez ` enable ` sur `false`.

Le ciblage de plusieurs versions de GLSL peut entraîner des erreurs lorsqu’une fonctionnalité n’est pas traduisible vers une version donnée. Par exemple, tenter de traduire un shader utilisant textureSize() vers GLSL ES 100 entraînerait l’échec de l’appel bake() dans son intégralité, avec le message d’erreur « textureSize n’est pas pris en charge dans ESSL 100 ». Si l’absence d’un shader GLSL ES 100 dans le résultat est acceptable, même s’il a été demandé, alors définir cet indicateur sur « false » permet à l’ bake() de s’exécuter avec succès.

void QShaderBaker::setGeneratedShaderVariants(const QList<QShader::Variant> &v)

Spécifie quelles variantes de shader sont générées. Chaque version de shader peut comporter plusieurs variantes dans le fichier QShader généré.

Dans la plupart des cas, le fichier ` v ` contient une seule entrée : ` QShader::StandardShader`.

Remarque : si aucune variante n’est définie, le fichier « QShader » résultant sera vide et donc invalide.

void QShaderBaker::setGeneratedShaders(const QList<QShaderBaker::GeneratedShader> &v)

Spécifie le type de shaders à compiler ou à traduire. Par défaut, rien n'est généré ; il est donc obligatoire d'appeler cette fonction avant bake()

Remarque : si cette fonction n’est pas appelée, ou si ` v ` est vide ou ne contient que des entrées non valides, le fichier ` QShader ` résultant sera vide et donc invalide.

Par exemple, la cible de « baking » minimale possible est SPIR-V, sans aucune conversion supplémentaire vers d’autres langages. Pour demander cela, procédez comme suit :

baker.setGeneratedShaders({ QShader::SpirvShader, QShaderVersion(100) });

Remarque : QShaderBaker ne prend en charge que les cibles SPIR-V et les sources lisibles par l'homme. La compilation ultérieure vers des formats intermédiaires spécifiques à l'API, tels que QShader::DxbcShader ou QShader::MetalLibShader, est gérée par l'outil en ligne de commande qsb et ne fait pas partie de l'API d'exécution QShaderBaker.

[since 6.9] void QShaderBaker::setGlslOptions(QShaderBaker::GlslOptions options)

Définit des options s supplémentaires pour les sources GLSL et GLSL ES générées. Par défaut, aucun indicateur n’est défini.

Cette fonction a été introduite dans Qt 6.9.

[since 6.7] void QShaderBaker::setMultiViewCount(int count)

Lors de la transcompilation de shaders utilisant le mode multivue (par exemple, un shader de sommets utilisant `gl_ViewIndex` pour un moteur de rendu s'appuyant sur `GL_OVR_multiview2`, `VK_KHR_multiview`, etc.), il est nécessaire, pour certaines cibles, de déclarer le nombre de vues dans le shader. Cela n’est pas fait dans le code GLSL de type Vulkan, et n’est pas pertinent pour des cibles telles que SPIR-V ou HLSL, mais est requis pour OpenGL et GLSL ; la valeur doit donc être fournie sous forme de métadonnées supplémentaires.

Par défaut, la valeur est 0, ce qui désactive l’injection de l’instruction ` num_views `. Définir la valeur sur 1 n’est pas utile, car il s’agit de toute façon de l’ num_views par défaut. Par conséquent, ` count ` doit être >= 2 pour avoir un effet. Lorsqu’elle est définie, par exemple, sur 2, le shader GLSL généré contiendra une instruction ` layout(num_views = 2) in; `.

Définir une valeur « count » égale ou supérieure à 2 injecte également certaines instructions de préprocesseur : « QSHADER_VIEW_COUNT » est défini sur « count », tandis que l’extension « GL_EXT_multiview » est automatiquement activée. Par conséquent, définir la valeur appropriée de « count » peut également s’avérer pertinent avec d’autres types de shaders, par exemple lorsqu’un tampon uniforme est partagé entre le shader de sommet et le shader de fragment et que les deux shaders doivent pouvoir écrire quelque chose comme « #if QSHADER_VIEW_COUNT >= 2 ».

Cette fonction a été introduite dans Qt 6.7.

void QShaderBaker::setPerTargetCompilation(bool enable)

Définit la compilation par cible sur « enable ». Par défaut, cette option est désactivée, ce qui signifie que le code source Vulkan/GLSL est compilé en SPIR-V une seule fois par variante. (Donc une fois par défaut, deux fois s’il s’agit d’un shader de sommet et si la variante « Batchable » est également demandée). Le code SPIR-V obtenu est ensuite traduit vers les différents langages cibles (GLSL, HLSL, MSL).

En mode de compilation par cible, il existe une étape de compilation GLSL vers SPIR-V distincte pour chaque cible, c’est-à-dire pour chaque version GLSL/HLSL/MSL demandée via ` setGeneratedShaders()`. La source d’entrée est la même, mais des définitions de préprocesseur spécifiques à la cible y sont insérées. Ce processus est nettement plus long, mais permet aux applications de fournir un seul shader et d’utiliser des blocs d’ #ifdef s pour les différencier. Lorsque ce mode est désactivé, la seule façon d’obtenir le même résultat consiste à fournir plusieurs versions du fichier de shader, à traiter chacune d’elles séparément, à livrer des fichiers {.qsb} pour chacune d’entre elles et à choisir le fichier approprié en fonction d’une logique d’exécution.

Les macros suivantes seront automatiquement définies dans ce mode. Notez que les macros sont toujours liées aux langages de shader, et non aux API graphiques.

  • QSHADER_SPIRV - définie lorsque la cible est SPIR-V (généralement destiné à être utilisé par Vulkan).
  • QSHADER_SPIRV_VERSION - le numéro de version SPIR-V ciblé, tel que 100.
  • QSHADER_GLSL - définie lorsque la cible est GLSL ou GLSL ES (généralement utilisé par OpenGL ou OpenGL ES)
  • QSHADER_GLSL_VERSION - le numéro de version de GLSL ou GLSL ES ciblé, tel que 100, 300 ou 330.
  • QSHADER_GLSL_ES - défini uniquement lorsque la cible est GLSL ES
  • QSHADER_HLSL - défini lorsque le ciblage est HLSL (généralement destiné à Direct 3D)
  • QSHADER_HLSL_VERSION - la version du modèle de shader HLSL ciblée, telle que 50
  • QSHADER_MSL - défini lorsque le langage de shaders Metal (Metal Shading Language) est ciblé (généralement utilisé par Metal)
  • QSHADER_MSL_VERSION - la version ciblée du MSL, telle que 12 ou 20.

Cela permet d’écrire du code de shader comme celui-ci.

#if QSHADER_HLSL || QSHADER_MSL
vec2 uv = vec2(uv_coord.x, 1.0 - uv_coord.y);
#else
vec2 uv = uv_coord;
#endif

Remarque : les numérosde version suivent la syntaxe « QShaderVersion » inspirée de GLSL et sont donc toujours un nombre entier unique.

Remarque : il n’ existe qu’un seul QShaderDescription par QShader, quel que soit le nombre de cibles individuelles. Par conséquent, les membres des blocs uniform, les entrées de sommets, etc. ne doivent pas être rendus conditionnels à l’aide des macros décrites ci-dessus.

Avertissement : soyez conscient des différences entre les concepts des API graphiques et ceux des langages de shading. QShaderBaker et les outils associés fonctionnent strictement selon le concept des langages de shading, sans tenir compte de la manière dont les résultats sont exploités par la suite. Par conséquent, si les couches supérieures de la pile graphique Qt commencent un jour à utiliser SPIR-V également pour une API autre que Vulkan, l’hypothèse selon laquelle QSHADER_SPIRV implique Vulkan ne sera plus valable.

void QShaderBaker::setPreamble(const QByteArray &preamble)

Spécifie une directive « preamble » personnalisée qui est traitée avant le code de shader normal.

Cela va au-delà d’un simple ajout en début de chaîne source : la validité de la directive de version GLSL, qui doit impérativement précéder tout le reste, n’est pas affectée. Les numéros de ligne dans les messages d’erreur générés restent également inchangés, le contenu de l’ preamble étant ignoré.

Les préambules permettent notamment d’insérer de manière transparente des instructions d’ #define générées dynamiquement.

void QShaderBaker::setSourceDevice(QIODevice *device, QShader::Stage stage, const QString &fileName = QString())

Définit la source device. Cela permet d'utiliser n'importe quelle QIODevice au lieu de se limiter aux fichiers. stage spécifie l'étape du shader, tandis que le paramètre facultatif fileName contient un nom de fichier utilisé dans les messages d'erreur.

Avertissement : device doit contenir du contenu fiable. Il est conseillé aux développeurs d’applications d’évaluer soigneusement les implications potentielles avant de transmettre des données fournies par l’utilisateur provenant de sources qui ne sont pas sous le contrôle de l’application.

void QShaderBaker::setSourceFileName(const QString &fileName)

Définit le nom du fichier source du shader sur « fileName ». Il s'agit du fichier qui sera lu lors de l'appel de la fonction bake(). L'étape du shader est déduite automatiquement à partir de l'extension du fichier. Si cela n'est pas souhaité ou n'est pas possible, utilisez plutôt la surcharge avec l'argument « stage ».

Les extensions de fichier prises en charge sont les suivantes :

  • .vert - shader de sommets
  • .frag - shader de fragment (pixel)
  • .tesc - shader de contrôle de tessellation (hull)
  • .tese - shader d'évaluation de tessellation (domaine)
  • .geom - shader de géométrie
  • .comp - shader de calcul

Avertissement : le fichier « fileName » est censé contenir du contenu fiable. Il est conseillé aux développeurs d'applications d'évaluer soigneusement les implications potentielles avant de transmettre des fichiers source fournis par l'utilisateur qui ne font pas partie de l'application.

void QShaderBaker::setSourceFileName(const QString &fileName, QShader::Stage stage)

Définit le nom du fichier source du shader sur fileName. Il s'agit du fichier qui sera lu lors de l'appel de la fonction bake(). L'étape du shader est spécifiée par stage.

Avertissement : le fichier fileName doit contenir du contenu fiable. Il est conseillé aux développeurs d’applications d’évaluer soigneusement les implications potentielles avant de transmettre des fichiers source fournis par l’utilisateur qui ne font pas partie de l’application.

void QShaderBaker::setSourceString(const QByteArray &sourceString, QShader::Stage stage, const QString &fileName = QString())

Définit l'sourceString du shader d'entrée. ` stage ` spécifie l'étape du shader, tandis que le paramètre facultatif ` fileName ` contient un nom de fichier utilisé dans les messages d'erreur.

Avertissement : sourceString doit contenir du contenu fiable. Il est conseillé aux développeurs d’applications d’évaluer soigneusement les implications potentielles avant de transmettre des données fournies par l’utilisateur provenant de sources qui ne sont pas sous le contrôle de l’application.

void QShaderBaker::setSpirvOptions(QShaderBaker::SpirvOptions options)

Définit des options s supplémentaires pour le fichier binaire SPIR-V généré. Par défaut, aucun indicateur n'est activé.

void QShaderBaker::setTessellationMode(QShaderDescription::TessellationMode mode)

Lors de la génération du code de shader MSL pour un shader de contrôle de tessellation, l'mode s de tessellation (triangles ou quadrilatères) doit être connue à l'avance. En GLSL, cela est généralement déclaré dans le shader d'évaluation de la tessellation, mais pour Metal, cette information doit également être connue lors de la génération du shader de calcul à partir du shader de contrôle de tessellation.

Si ce paramètre n'est pas défini, la valeur par défaut est « triangles ».

void QShaderBaker::setTessellationOutputVertexCount(int count)

Lors de la génération du code de shader MSL pour un shader d'évaluation de tessellation, l'count de sommets de sortie du shader de contrôle de tessellation doit être connue à l'avance. En GLSL, celle-ci est généralement déclarée dans le shader de contrôle de tessellation, mais pour Metal, elle doit également être connue lors de la génération du shader de sommets à partir du shader d'évaluation de tessellation.

Si elle n'est pas définie, la valeur par défaut est 3.

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