Almacenamiento en caché persistente de sombreadores con Qt Quick 3D
Shaders y Materiales 3D
Renderizar un objeto 3D con un material implica un sombreador de vértices y fragmentos.
Cuando se encuentra un material por primera vez durante la vida de una escena 3D, ocurre lo siguiente en tiempo de ejecución:
- Se generan los textos fuente del shader.
- Los sombreadores se envían a través del canal de sombreado estándar de Qt. El resultado es una versión bytecode intermedia del shader (SPIR-V), una serie de variantes del código fuente para otras API 3D (GLSL para OpenGL, HLSL para Direct3D, etc.) y metadatos adicionales.
- Cuando el motor 3D crea un graphics pipeline, se elige un bytecode o variante de código fuente adecuado para la API 3D utilizada y, a continuación, la API 3D subyacente probablemente realizará una compilación de segunda fase dirigida al conjunto de instrucciones de la GPU real.
Todo esto junto puede resultar una operación costosa. Para evitarlo en posteriores ejecuciones de la aplicación, se emplean dos cachés persistentes basadas en disco.
Caché de bajo nivel
Qt Quick 3D se basa en Qt Quick y en el scenegraph. Cuando se trata de caché persistente, basada en disco, de binarios de programas OpenGL, pipelines Vulkan, etc., se utiliza la misma infraestructura.
Ver QQuickGraphicsConfiguration#Pipeline Cache Save and Load para una discusión detallada de esto.
Por defecto, la caché de disco de los sombreadores está activada. Esto significa que incluso cuando la plataforma o la implementación de la API 3D no realiza su propia caché persistente de shaders compilados, Qt todavía puede almacenar los binarios del programa OpenGL o activos similares que se recogen durante la vida de un QQuickWindow. La escritura de los datos en el disco se produce cuando se cierra la ventana, y se vuelve a cargar en la siguiente ejecución de la aplicación. De esta forma, la creación de pipelines gráficos puede ser significativamente más rápida cuando los shaders se encontraron durante ejecuciones anteriores de la aplicación.
Los shaders para materiales 3D y efectos de post-procesado también participan en esto.
Caché de sombreadores de materiales
A diferencia de Qt Quick, Qt Quick 3D se basa actualmente en la generación en tiempo de ejecución de los textos fuente de los shaders para materiales 3D y efectos. La excepción es cuando se utiliza la herramienta Shadergen, sin embargo, esta función es experimental y no se recomienda su uso en producción por el momento.
Generar los textos fuente de los shaders y luego realizar la compilación y transpilación de la primera fase (ver Qt Shader Tools para más detalles) puede ser una operación costosa. Para materiales y efectos 2D esto suele ocurrir en tiempo de compilación, mientras que para 3D no es una opción actualmente.
Por lo tanto, Qt Quick 3D emplea otra caché basada en disco. En ella se almacenan los activos de los materiales y efectos 3D generados.
Esto significa que, en combinación con la caché de bajo nivel, una escena 3D con un material que se ha encontrado durante las ejecuciones anteriores de la aplicación no dará lugar a una costosa operación de bloqueo cuando se encuentre de nuevo en ejecuciones posteriores.
Nota: Al igual que con el shader de bajo nivel y la caché de canalización, esto requiere un sistema de archivos con capacidad de escritura y que la plataforma proporcione una ubicación de caché con capacidad de escritura a través de QStandardPaths.
El atributo de aplicación Qt::AA_DisableShaderDiskCache y la variable de entorno correspondiente se aplican también a la caché de sombreado de materiales. Cuando se establece, tanto la caché de materiales de bajo nivel de Qt como la de Qt Quick 3D se desactivan.
Nota: La herramienta qml establece este atributo por defecto. Pase el argumento de línea de comandos --enable-shader-cache para obtener un comportamiento idéntico al de las aplicaciones Qt independientes.
© 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.