QShaderBaker Class
Compila un sombreador GLSL/Vulkan en SPIR-V, lo traduce a otros lenguajes de sombreado y recopila metadatos de reflexión. Más...
| Header: | #include <QShaderBaker> |
| Since: | Qt 6.6 |
Tipos Públicos
| GeneratedShader | |
| enum class | GlslOption { GlslEsFragDefaultFloatPrecisionMedium } |
| flags | GlslOptions |
| enum class | SpirvOption { GenerateFullDebugInfo, StripDebugAndVarInfo } |
| flags | SpirvOptions |
Funciones Públicas
| 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) |
Descripción Detallada
Advertencia: QShaderBaker, al igual que la familia de clases QRhi en el módulo Qt GUI, incluyendo QShader y QShaderDescription, ofrece garantías de compatibilidad limitadas. No hay garantías de compatibilidad binaria o de código fuente para estas clases, lo que significa que la API sólo está garantizada para funcionar con la versión de Qt con la que se desarrolló la aplicación. Sin embargo, los cambios incompatibles con el código fuente se mantendrán al mínimo y sólo se realizarán en versiones menores (6.7, 6.8, etc.). Para usar esta clase en una aplicación, enlaza con Qt::ShaderToolsPrivate (si usas CMake), e incluye las cabeceras con el prefijo rhi, por ejemplo #include <rhi/qshaderbaker.h>.
QShaderBaker toma un sombreador gráfico (vértice, fragmento, etc.) o de cómputo, y produce múltiples variantes del mismo, ya sea en código fuente o bytecode, junto con información de reflexión. Los resultados se representan mediante una instancia de QShader, que también proporciona una serialización y deserialización sencillas y rápidas.
Nota: Se recomienda a las aplicaciones y bibliotecas evitar el uso directo de esta clase. En su lugar, se anima a todos los usuarios de Qt a confiar en la compilación fuera de línea invocando la herramienta de línea de comandos qsb en tiempo de compilación a través de CMake. La herramienta qsb utiliza QShaderBaker y escribe la versión serializada del QShader generado en un archivo. El uso de esta clase debería restringirse a casos en los que no pueda evitarse la compilación en tiempo de ejecución, como cuando se trabaja con cadenas fuente de shaders proporcionadas por el usuario o generadas dinámicamente.
Por el momento, se asume que el formato de entrada es siempre GLSL con sabor a Vulkan. Véase la especificación GL_KHR_vulkan_glsl para una visión general, teniendo en cuenta que el módulo Qt Shader Tools está destinado a ser utilizado en combinación con las clases QRhi del módulo Qt Rendering Hardware Interface, y por lo tanto una serie de conceptos y construcciones (constantes push, buffers de almacenamiento, subpases, etc.) no son aplicables por el momento. Es posible que en el futuro se introduzcan opciones adicionales, por ejemplo, habilitando HLSL como formato fuente, una vez que la compilación de HLSL a SPIR-V se considere adecuada.
Los metadatos de reflexión se pueden recuperar de la QShader resultante llamando a QShader::description(). Esto es esencial cuando se tiene que descubrir qué conjunto de entradas de vértices y recursos de sombreado espera un sombreador, y cuáles son los diseños de los mismos, ya que muchas APIs gráficas modernas no ofrecen capacidades de reflexión de sombreado incorporadas.
Flujo de trabajo típico
Supongamos que una aplicación tiene un sombreador de vértices y fragmentos como el siguiente:
Sombreador de vértices:
#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;
}Sombreador de fragmentos:
#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);
}Para obtener instancias de QShader que puedan pasarse tal cual a QRhiGraphicsPipeline, hay dos opciones: generar el paquete de sombreadores fuera de línea o en tiempo de ejecución.
La primera opción implica ejecutar la herramienta 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
El ejemplo utiliza los objetivos de traducción apropiados para QRhi. Esto significa GLSL/ES 100, GLSL 120, HLSL Shader Model 5.0, y Metal Shading Language 1.2.
Observe cómo las opciones de la línea de comandos se corresponden con lo que puede especificarse a través de setGeneratedShaders(). Una vez que los archivos resultantes están disponibles, pueden ser enviados con la aplicación (normalmente incrustados en el ejecutable del Sistema de Recursos Qt), y pueden ser cargados y pasados a QShader::fromSerialized() en tiempo de ejecución.
Aunque no se muestra aquí, qsb puede hacer más: también es capaz de invocar fxc en Windows o las herramientas XCode apropiadas en macOS para compilar el código shader HLSL o Metal generado en bytecode e incluir las versiones compiladas en QShader. Después de que un paquete de shaders baked se escriba en un archivo, su contenido puede examinarse ejecutando qsb -d en él. Ejecute qsb con --help para obtener más información.
El enfoque alternativo es realizar lo mismo en tiempo de ejecución. Esto implica crear una instancia de QShaderBaker, llamar a setSourceFileName(), y luego configurar los objetivos de traducción a través de 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();Ver también QShader.
Documentación de tipos de miembros
QShaderBaker::GeneratedShader
Sinónimo de QPair<QShader::Source, QShaderVersion>.
enum class QShaderBaker::GlslOption
flags QShaderBaker::GlslOptions
| Constante | Valor | Descripción |
|---|---|---|
QShaderBaker::GlslOption::GlslEsFragDefaultFloatPrecisionMedium | 0x01 | Emite precision mediump float; en fragment shaders para GLSL ES. |
El tipo GlslOptions es un typedef para QFlags<GlslOption>. Almacena una combinación OR de valores GlslOption.
enum class QShaderBaker::SpirvOption
flags QShaderBaker::SpirvOptions
| Constante | Valor | Descripción |
|---|---|---|
QShaderBaker::SpirvOption::GenerateFullDebugInfo | 0x01 | Genera y almacena información adicional de depuración en el binario SPIR-V. |
QShaderBaker::SpirvOption::StripDebugAndVarInfo | 0x02 | Elimina toda la información de depuración y nombres de variables del binario SPIR-V. |
El tipo SpirvOptions es un typedef para QFlags<SpirvOption>. Almacena una combinación OR de valores SpirvOption.
Documentación de Funciones Miembro
QShaderBaker::QShaderBaker()
Construye un nuevo QShaderBaker.
[noexcept] QShaderBaker::~QShaderBaker()
Destructor.
QShader QShaderBaker::bake()
Ejecuta el proceso de compilación y traducción.
Devuelve una instancia de QShader. Para comprobar si el proceso se ha realizado correctamente, llame a QShader::isValid(). Cuando indique false, llama a errorMessage() para recuperar el registro.
Se trata de una operación costosa. Cuando se llama a esto desde aplicaciones, puede ser aconsejable hacerlo en un hilo separado.
Nota: Las instancias deQShaderBaker son reutilizables: después de llamar a bake(), la misma instancia se puede volver a utilizar con entradas diferentes. Sin embargo, una instancia de QShaderBaker sólo debe utilizarse en un único subproceso durante su vida útil.
QString QShaderBaker::errorMessage() const
Devuelve el mensaje de error de la última ejecución de bake(), o una cadena vacía si no hubo ningún error.
Nota: Los errores incluyen errores de lectura de archivos, de compilación y de traducción. No solicitar ningún objetivo o variante no cuenta como error aunque el QShader resultante no sea válido.
void QShaderBaker::setBatchableVertexShaderExtraInputLocation(int location)
Al generar una variante de QShader::BatchableVertexShader, location especifica la ubicación de entrada para la entrada de vértices insertada. El valor predeterminado es 7 y sólo debe modificarse si el sombreador de vértices ya utiliza la ubicación de entrada 7.
void QShaderBaker::setBreakOnShaderTranslationError(bool enable)
Controla el comportamiento cuando falla la traducción del sombreador (de SPIR-V a GLSL/HLSL/MSL). Por defecto este ajuste es true, lo que hará que bake() devuelva un error si no se puede generar el shader solicitado. Si no se desea esto, y la intención es generar lo que podamos pero omitir silenciosamente el resto, entonces establezca enable a false.
Tener como objetivo múltiples versiones de GLSL puede llevar a errores cuando una característica no es traducible a una versión dada. Por ejemplo, intentar traducir un shader usando textureSize() a GLSL ES 100 fallaría toda la llamada a bake() con el mensaje de error "textureSize no está soportado en ESSL 100". Si es aceptable no tener un shader GLSL ES 100 en el resultado, a pesar de que fue solicitado, entonces establecer esta bandera a false hace que bake() tenga éxito.
void QShaderBaker::setGeneratedShaderVariants(const QList<QShader::Variant> &v)
Especifica qué variantes de sombreado se generan. Cada versión de shader puede tener múltiples variantes en el resultado QShader.
En la mayoría de los casos, v contiene una única entrada, QShader::StandardShader.
Nota: cuando no se establecen variantes, el QShader resultante estará vacío y, por tanto, no será válido.
void QShaderBaker::setGeneratedShaders(const QList<QShaderBaker::GeneratedShader> &v)
Especifica qué tipo de shaders compilar o traducir. Por defecto no se genera nada, por lo que es obligatorio llamar a esta función antes de bake().
Nota: cuando no se llama a esta función o v está vacío o contiene sólo entradas no válidas, el QShader resultante estará vacío y por lo tanto no será válido.
Por ejemplo, el mínimo objetivo de cocción posible es SPIR-V, sin traducciones adicionales a otros idiomas. Para solicitarlo, haga lo siguiente:
baker.setGeneratedShaders({ QShader::SpirvShader, QShaderVersion(100) });Nota: QShaderBaker sólo maneja los objetivos SPIR-V y fuente legible por humanos. La compilación posterior en formatos intermedios específicos de la API, como QShader::DxbcShader o QShader::MetalLibShader, se realiza mediante la herramienta de línea de comandos qsb y no forma parte de la API de ejecución QShaderBaker.
[since 6.9] void QShaderBaker::setGlslOptions(QShaderBaker::GlslOptions options)
Establece options adicional para las fuentes GLSL y GLSL ES generadas. Por defecto no se establece ninguna bandera.
Esta función se introdujo en Qt 6.9.
[since 6.7] void QShaderBaker::setMultiViewCount(int count)
Cuando se transpilan shaders que utilizan multiview (por ejemplo, un vertex shader que utiliza gl_ViewIndex para un renderizador que confía en GL_OVR_multiview2, VK_KHR_multiview, etc.), para algunos de los objetivos es necesario declarar el número de vistas en el shader. Esto no se hace en el código GLSL estilo Vulkan, y no es relevante para objetivos como SPIR-V o HLSL, pero es necesario para OpenGL y GLSL, por lo que el valor tiene que ser proporcionado como metadatos adicionales.
Por defecto, el valor es 0, que desactiva la inyección de la sentencia num_views. Establecer 1 no es útil ya que ese es el valor por defecto de num_views independientemente. Por lo tanto, count debe ser >= 2 para que tenga efecto. Cuando se establece a, por ejemplo, 2, el shader GLSL generado contendrá una declaración layout(num_views = 2) in;.
Establecer un count de 2 o mayor también inyecta algunas sentencias del preprocesador: QSHADER_VIEW_COUNT se establece en count, mientras que la extensión GL_EXT_multiview se habilita automáticamente. Por lo tanto, establecer el count apropiado puede ser relevante con otros tipos de shaders también, por ejemplo, cuando se comparte un buffer uniforme entre el vertex y fragment shader y ambos shaders tienen que ser capaces de escribir algo como #if QSHADER_VIEW_COUNT >= 2.
Esta función se introdujo en Qt 6.7.
void QShaderBaker::setPerTargetCompilation(bool enable)
Establece la compilación por objetivo en enable. Por defecto está desactivada, lo que significa que el código fuente Vulkan/GLSL se compila en SPIR-V una vez por variante. (así que una vez por defecto, dos veces si es un vertex shader y la variante Batchable si se solicita también). El SPIR-V resultante se traduce a los distintos lenguajes de destino (GLSL, HLSL, MSL).
En el modo de compilación por objetivo, hay un paso de compilación GLSL a SPIR-V separado para cada objetivo, es decir, para cada versión GLSL/HLSL/MSL solicitada a través de setGeneratedShaders(). La fuente de entrada es la misma, pero con las definiciones de preprocesador específicas del objetivo insertadas. Esto consume bastante más tiempo, pero permite a las aplicaciones proporcionar un único shader y utilizar bloques #ifdef para diferenciarlos. Cuando este modo está desactivado, la única forma de conseguir lo mismo es proporcionar varias versiones del archivo de sombreado, procesar cada una por separado, enviar archivos {.qsb} para cada una y elegir el archivo correcto basándose en la lógica de tiempo de ejecución.
Las siguientes macros se definirán automáticamente en este modo. Tenga en cuenta que las macros están siempre vinculadas a lenguajes de sombreado, no a APIs gráficas.
QSHADER_SPIRV- definidas cuando se apunta a SPIR-V (para ser consumidas, típicamente, por Vulkan).QSHADER_SPIRV_VERSION- el número de versión de SPIR-V de destino, como100.QSHADER_GLSL- definido cuando se utiliza GLSL o GLSL ES (para ser utilizado, normalmente, por OpenGL u OpenGL ES)QSHADER_GLSL_VERSION- el número de versión de GLSL o GLSL ES de destino, como100,300, o330.QSHADER_GLSL_ES- definido sólo para GLSL ESQSHADER_HLSL- definido cuando se utiliza HLSL (para ser consumido, normalmente, por Direct 3D)QSHADER_HLSL_VERSION- la versión del modelo de sombreado HLSL de destino, por ejemplo50QSHADER_MSL- definido cuando se utiliza Metal Shading Language (para ser utilizado, normalmente, por Metal)QSHADER_MSL_VERSION- la versión MSL de destino, como12o20.
Esto permite escribir código de sombreado como el siguiente.
#if QSHADER_HLSL || QSHADER_MSL vec2 uv = vec2(uv_coord.x, 1.0 - uv_coord.y); #else vec2 uv = uv_coord; #endif
Nota: Los números de versión siguen la sintaxis QShaderVersion inspirada en GLSL y, por lo tanto, son siempre un único número entero.
Nota: Sólo hay un QShaderDescription por QShader, sin importar cuántos objetivos individuales haya. Por lo tanto, los miembros de bloques uniformes, entradas de vértices, etc. no deben hacerse condicionales utilizando las macros descritas anteriormente.
Atención: Tenga en cuenta las diferencias entre los conceptos de APIs gráficas y lenguajes de sombreado. QShaderBaker y las herramientas relacionadas trabajan estrictamente con el concepto de lenguajes de sombreado, ignorando cómo se consumen después los resultados. Por lo tanto, si las capas superiores de la pila gráfica de Qt un día empiezan a usar SPIR-V también para una API que no sea Vulkan, la suposición de que QSHADER_SPIRV implica Vulkan dejará de ser válida.
void QShaderBaker::setPreamble(const QByteArray &preamble)
Especifica un preamble personalizado que se procesa antes que el código normal del shader.
Esto es más que simplemente añadirlo a la cadena fuente: la validez de la directiva de versión GLSL, que debe colocarse antes que todo lo demás, no se ve afectada. Los números de línea en los mensajes de error también permanecen sin cambios, ignorando el contenido dado en preamble.
Un caso de uso de los preámbulos es la inserción transparente de sentencias #define generadas dinámicamente.
void QShaderBaker::setSourceDevice(QIODevice *device, QShader::Stage stage, const QString &fileName = QString())
Establece la fuente device. Esto permite utilizar cualquier QIODevice en lugar de sólo archivos. stage especifica la etapa del shader, mientras que el opcional fileName contiene un nombre de archivo que se utiliza en los mensajes de error.
Advertencia: se espera quedevice contenga contenido de confianza. Se aconseja a los desarrolladores de aplicaciones que consideren cuidadosamente las implicaciones potenciales antes de pasar datos proporcionados por el usuario desde fuentes que no están bajo el control de la aplicación.
void QShaderBaker::setSourceFileName(const QString &fileName)
Establece el nombre del archivo fuente del shader en fileName. Este es el archivo que se leerá al llamar a bake(). La etapa del sombreador se deduce automáticamente de la extensión del archivo. Si no se desea o no es posible, utilice la sobrecarga con el argumento stage.
Las extensiones de archivo soportadas son:
.vert- vertex shader.frag- sombreador de fragmentos (píxeles).tesc- tessellation control (hull) shader.tese- sombreador de evaluación de teselación (dominio).geom- sombreador de geometría.comp- sombreador de cálculo
Advertencia: se espera quefileName contenga contenido de confianza. Se aconseja a los desarrolladores de aplicaciones que consideren cuidadosamente las posibles implicaciones antes de pasar archivos fuente proporcionados por el usuario que no formen parte de la aplicación.
void QShaderBaker::setSourceFileName(const QString &fileName, QShader::Stage stage)
Establece el nombre del archivo fuente del shader en fileName. Este es el archivo que se leerá al llamar a bake(). La etapa del sombreador se especifica en stage.
Advertencia: se espera quefileName contenga contenido de confianza. Se recomienda a los desarrolladores de aplicaciones que consideren cuidadosamente las posibles implicaciones antes de pasar archivos fuente proporcionados por el usuario que no formen parte de la aplicación.
void QShaderBaker::setSourceString(const QByteArray &sourceString, QShader::Stage stage, const QString &fileName = QString())
Establece el shader de entrada sourceString. stage especifica la etapa del shader, mientras que el opcional fileName contiene un nombre de archivo que se utiliza en los mensajes de error.
Advertencia: se espera quesourceString contenga contenido de confianza. Se aconseja a los desarrolladores de aplicaciones que consideren cuidadosamente las implicaciones potenciales antes de pasar datos proporcionados por el usuario desde fuentes que no están bajo el control de la aplicación.
void QShaderBaker::setSpirvOptions(QShaderBaker::SpirvOptions options)
Establece options adicional para el binario SPIR-V generado. Por defecto no se establece ninguna bandera.
void QShaderBaker::setTessellationMode(QShaderDescription::TessellationMode mode)
Al generar el código del sombreador MSL para un sombreador de control de teselado, debe conocerse de antemano el teselado mode (triángulos o cuadrángulos). En GLSL esto se declara normalmente en el shader de evaluación de teselación, pero para Metal debe conocerse también al generar el shader de cálculo a partir del shader de control de teselación.
Si no se establece, el valor predeterminado es triángulos.
void QShaderBaker::setTessellationOutputVertexCount(int count)
Cuando se genera código de sombreado MSL para un sombreador de evaluación de teselación, el vértice de salida count del sombreador de control de teselación debe conocerse por adelantado. en GLSL esto se declararía en el sombreador de control de teselación típicamente, pero para Metal debe conocerse también al generar el sombreador de vértices desde el sombreador de evaluación de teselación.
Cuando no se establece, el valor por defecto es 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.