Sur cette page

QShaderBaker Class

Compile un shader GLSL/Vulkan en SPIR-V, traduit dans d'autres langages d'ombrage et rassemble les métadonnées de réflexion. Plus d'informations...

Header: #include <QShaderBaker>
Since: 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

Attention : QShaderBaker, tout comme la famille de classes QRhi du module Qt Gui, 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 le code source sont toutefois réduits au minimum et ne seront apportés que dans les versions mineures (6.7, 6.8, etc.). Pour utiliser cette classe dans une application, créez un lien vers Qt::ShaderToolsPrivate (si vous utilisez CMake) et incluez les en-têtes avec le préfixe rhi, par exemple #include <rhi/qshaderbaker.h>.

QShaderBaker prend un shader graphique (vertex, fragment, etc.) ou de calcul, et en produit plusieurs variantes (source ou bytecode), ainsi que des informations de réflexion. Les résultats sont représentés par une instance QShader, qui permet également une sérialisation et une désérialisation simples et rapides.

Note : Il est recommandé aux applications et aux bibliothèques d'éviter d'utiliser directement cette classe. Tous les utilisateurs de Qt XML sont encouragés à recourir à la compilation hors ligne en invoquant 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 du fichier QShader généré dans un fichier. L'utilisation de cette classe doit être limitée aux cas où la compilation au moment de l'exécution ne peut être évitée, comme lorsqu'on travaille avec des chaînes de source de shaders fournies par l'utilisateur ou générées dynamiquement.

Le format d'entrée est toujours supposé être du GLSL adapté à Vulkan pour le moment. Voir la spécification GL_KHR_vulkan_glsl pour une vue d'ensemble, 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 donc 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 pourront être introduites à l'avenir, par exemple en activant HLSL comme format source, une fois que la compilation HLSL vers SPIR-V sera jugée appropriée.

Les métadonnées de réflexion peuvent être récupérées à partir du site QShader en appelant QShader::description(). Ceci est essentiel lorsqu'il s'agit de découvrir quel ensemble d'entrées de vertex et de ressources de shader un shader attend, et quelles sont les dispositions de ceux-ci, étant donné que de nombreuses API graphiques modernes n'offrent pas de capacités de réflexion de shader intégrées.

Flux de travail typique

Supposons qu'une application dispose d'un nuanceur de sommets et de fragments tel que le suivant :

nuanceur 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 fragments :

#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 QShader qui peuvent être transmises telles quelles à QRhiGraphicsPipeline, il existe deux options : générer le pack de shaders hors ligne ou au moment de l'exécution.

Dans le premier cas, il faut 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 appropriées pour QRhi. Cela signifie GLSL/ES 100, GLSL 120, HLSL Shader Model 5.0 et Metal Shading Language 1.2.

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

Bien que cela ne soit pas montré ici, qsb peut faire plus : il est également capable d'invoquer fxc sur Windows ou les outils XCode appropriés sur macOS pour compiler le code de shader HLSL ou Metal généré en bytecode et inclure les versions compilées dans le fichier QShader. Après qu'un pack de shaders cuit est écrit 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.

L'autre approche consiste à effectuer la même opération au moment de l'exécution. Cela implique de créer une instance de QShaderBaker, d'appeler setSourceFileName(), puis de configurer les cibles de traduction via 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

QShaderBaker::GeneratedShader

Synonyme de QPair<QShader::Source, QShaderVersion>.

enum class QShaderBaker::GlslOption
flags QShaderBaker::GlslOptions

ConstanteValeurDescription de l'option
QShaderBaker::GlslOption::GlslEsFragDefaultFloatPrecisionMedium0x01Émettre precision mediump float; dans les nuanceurs de fragment pour GLSL ES.

Le type GlslOptions est un 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 de nom de variable 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()

Construit un nouveau QShaderBaker.

[noexcept] QShaderBaker::~QShaderBaker()

Destructeur.

QShader QShaderBaker::bake()

Exécute le processus de compilation et de traduction.

Renvoie une instance de QShader. Pour vérifier si le processus a réussi, appelez QShader::isValid(). Lorsque cela indique false, appelez errorMessage() pour récupérer le journal.

Il s'agit d'une opération coûteuse. Lorsque vous l'appelez à partir d'applications, il peut être conseillé de le faire sur un thread séparé.

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. Cependant, 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 de la dernière exécution de bake(), ou une chaîne vide s'il n'y a pas eu d'erreur.

Note : Les erreurs incluent les erreurs de lecture de fichiers, les échecs de compilation et de traduction. Le fait de ne pas demander de cibles ou de variantes n'est pas considéré comme une erreur, même si l'adresse QShader qui en résulte n'est pas valide.

void QShaderBaker::setBatchableVertexShaderExtraInputLocation(int location)

Lors de la génération d'une variante de QShader::BatchableVertexShader, location spécifie l'emplacement d'entrée pour l'entrée de vertex insérée. La valeur est par défaut 7 et ne doit être remplacée que si le nuanceur de sommets utilise déjà l'emplacement d'entrée 7.

void QShaderBaker::setBreakOnShaderTranslationError(bool enable)

Contrôle le comportement lorsque la traduction des shaders (de SPIR-V à GLSL/HLSL/MSL) échoue. Par défaut, ce paramètre est vrai, ce qui fait que bake() renvoie une erreur si le shader demandé ne peut pas être généré. Si cela n'est pas souhaité, et que l'intention est de générer ce qui peut l'être mais d'ignorer silencieusement le reste, mettez enable à false.

Cibler plusieurs versions de GLSL peut conduire à des erreurs lorsqu'une fonctionnalité n'est pas traduisible pour une version donnée. Par exemple, tenter de traduire un shader utilisant textureSize() en GLSL ES 100 ferait échouer l'appel à bake() avec le message d'erreur "textureSize is not supported in ESSL 100". S'il est acceptable de ne pas avoir de shader GLSL ES 100 dans le résultat, même s'il a été demandé, alors le fait de mettre ce drapeau à faux permet à bake() de réussir.

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

Spécifie quelles variantes de nuanceurs sont générées. Chaque version de nuanceur peut avoir plusieurs variantes dans le résultat QShader.

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

Remarque : si aucune variante n'est définie, le site QShader sera vide et donc invalide.

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

Spécifie le type de shaders à compiler ou à traduire. Rien n'est généré par défaut, 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 non valide.

Par exemple, la cible de cuisson minimale possible est SPIR-V, sans aucune traduction supplémentaire dans d'autres langues. Pour demander cela, faites :

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

Remarque : QShaderBaker ne gère que les cibles SPIR-V et les cibles source lisibles par l'homme. Une compilation supplémentaire dans des formats intermédiaires spécifiques à l'API, tels que QShader::DxbcShader ou QShader::MetalLibShader, est mise en œuvre par l'outil de 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 options pour les sources GLSL et GLSL ES générées. Par défaut, aucun drapeau n'est défini.

Cette fonction a été introduite dans Qt 6.9.

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

Lors de la transpilation de shaders utilisant le multiview (par exemple, un vertex shader utilisant gl_ViewIndex pour un moteur de rendu reposant sur GL_OVR_multiview2, VK_KHR_multiview, etc.), pour certaines cibles, il est nécessaire de déclarer le nombre de vues dans le shader. Ceci n'est pas fait dans le code GLSL de style Vulkan, et n'est pas pertinent pour des cibles telles que SPIR-V ou HLSL, mais est nécessaire pour OpenGL et GLSL, et donc la valeur doit être fournie comme métadonnée supplémentaire.

Par défaut, la valeur est 0, ce qui désactive l'injection de l'instruction num_views. La valeur 1 n'est pas utile puisqu'il s'agit de la valeur par défaut de num_views. Par conséquent, la valeur de count doit être >= 2 pour avoir un effet. Lorsque la valeur est fixée à 2, par exemple, le shader GLSL généré contiendra une déclaration layout(num_views = 2) in;.

La définition d'un count de 2 ou plus injecte également certaines instructions du préprocesseur : QSHADER_VIEW_COUNT est défini comme count, tandis que l'extension GL_EXT_multiview est activée automatiquement. Par conséquent, la définition d'un count approprié peut également s'avérer utile pour d'autres types de nuanceurs, par exemple lors du partage d'un tampon uniforme entre le nuanceur de sommets et le nuanceur de fragments, lorsque les deux nuanceurs doivent être en mesure d'é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 à enable. Par défaut, ceci est désactivé, ce qui signifie que la source Vulkan/GLSL est compilée en SPIR-V une fois par variante. (donc une fois par défaut, deux fois s'il s'agit d'un vertex shader et la variante Batchable comme demandé également). Le SPIR-V résultant est ensuite traduit dans les différents langages cibles (GLSL, HLSL, MSL).

En mode de compilation par cible, il y a une étape de compilation GLSL vers SPIR-V séparée 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 sont insérées. Cela prend beaucoup plus de temps, mais permet aux applications de fournir un seul shader et d'utiliser les blocs #ifdef pour les différencier. Lorsque ce mode est désactivé, la seule façon d'obtenir le même résultat est de fournir plusieurs versions du fichier shader, de traiter chacune séparément, d'envoyer des fichiers {.qsb} pour chacune d'entre elles et de choisir le bon fichier en fonction de la logique d'exécution.

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

  • QSHADER_SPIRV - défini lors du ciblage de SPIR-V (pour être consommé, typiquement, par Vulkan).
  • QSHADER_SPIRV_VERSION - le numéro de version de SPIR-V ciblé, tel que 100.
  • QSHADER_GLSL - défini lorsqu'il s'agit de GLSL ou GLSL ES (à consommer, typiquement, par OpenGL ou OpenGL ES).
  • QSHADER_GLSL_VERSION - le numéro de version de GLSL ou GLSL ES visé, tel que 100, 300, ou 330.
  • QSHADER_GLSL_ES - défini uniquement lorsqu'il s'agit de GLSL ES
  • QSHADER_HLSL - défini lorsqu'il s'agit de HLSL (à consommer, typiquement, par Direct 3D)
  • QSHADER_HLSL_VERSION - la version du modèle de shader HLSL ciblé, par exemple 50
  • QSHADER_MSL - défini lorsqu'il s'agit du Metal Shading Language (qui doit être consommé, typiquement, par Metal)
  • QSHADER_MSL_VERSION - la version MSL ciblée, telle que 12 ou 20.

Cela permet d'écrire un code de nuanceur comme le suivant.

#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éros de version suivent la syntaxe QShaderVersion inspirée de GLSL et sont donc toujours des nombres entiers uniques.

Remarque : il n'y a qu'une seule adresse QShaderDescription par QShader, quel que soit le nombre de cibles individuelles. Par conséquent, les membres des blocs uniformes, les entrées de vertex, etc. ne doivent pas être rendus conditionnels à l'aide des macros décrites ci-dessus.

Attention : Soyez conscient des différences entre les concepts des API graphiques et des langages d'ombrage. QShaderBaker et les outils associés travaillent strictement avec le concept des langages d'ombrage, sans tenir compte de la façon dont les résultats sont consommé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 tiendra plus.

void QShaderBaker::setPreamble(const QByteArray &preamble)

Spécifie un preamble personnalisé qui est traité avant le code normal du shader.

Il ne s'agit pas d'un simple ajout à la chaîne source : la validité de la directive GLSL version, qui doit être placée avant tout le reste, n'est pas affectée. Les numéros de ligne dans les messages d'erreur rapportés restent également inchangés, ignorant le contenu donné dans preamble.

L'un des cas d'utilisation des préambules est l'insertion transparente d'instructions #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 quel QIODevice au lieu de simples fichiers. stage spécifie l'étape du shader, tandis que l'option fileName contient un nom de fichier qui est utilisé dans les messages d'erreur.

Avertissement : device est censé contenir un contenu fiable. Il est conseillé aux développeurs d'applications d'examiner attentivement les implications potentielles avant de transmettre des données fournies par l'utilisateur à partir 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 à fileName. C'est le fichier qui sera lu lors de l'appel à bake(). L'étape du shader est déduite automatiquement de l'extension du fichier. Si cela n'est pas souhaité ou possible, utilisez la surcharge avec l'argument stage à la place.

Les extensions de fichier prises en charge sont les suivantes :

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

Avertissement : fileName est censé contenir un contenu fiable. Il est conseillé aux développeurs d'applications d'examiner attentivement 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 à fileName. C'est le fichier qui sera lu lors de l'appel à bake(). L'étape du shader est spécifiée par stage.

Avertissement : fileName est censé contenir un contenu fiable. Il est conseillé aux développeurs d'applications d'examiner attentivement 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 le shader d'entrée sourceString. stage spécifie l'étape du shader, tandis que l'option fileName contient un nom de fichier utilisé dans les messages d'erreur.

Avertissement : sourceString est censé contenir un contenu fiable. Il est conseillé aux développeurs d'applications d'examiner attentivement les implications potentielles avant de transmettre des données fournies par l'utilisateur à partir de sources qui ne sont pas sous le contrôle de l'application.

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

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

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

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

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

void QShaderBaker::setTessellationOutputVertexCount(int count)

Lors de la génération du code du shader MSL pour un shader d'évaluation de tessellation, le vertex de sortie count du shader de contrôle de tessellation doit être connu à l'avance. En GLSL, cela serait déclaré dans le shader de contrôle de tessellation typiquement, mais pour Metal, il doit être connu également lors de la génération du vertex shader à 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.