En esta página

QSGMaterial Class

La clase QSGMaterial encapsula el estado de renderizado para un programa de sombreado. Más...

Cabecera: #include <QSGMaterial>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
Heredado por:

QSGFlatColorMaterial, QSGOpaqueTextureMaterial, y QSGVertexColorMaterial

Tipos Públicos

enum Flag { Blending, RequiresDeterminant, RequiresFullMatrixExceptTranslate, RequiresFullMatrix, NoBatching, CustomCompileStep }
flags Flags

Funciones Públicas

virtual int compare(const QSGMaterial *other) const
virtual QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const = 0
QSGMaterial::Flags flags() const
void setFlag(QSGMaterial::Flags flags, bool on = true)
virtual QSGMaterialType *type() const = 0
(since 6.8) int viewCount() const

Descripción Detallada

QSGMaterial y las subclases de QSGMaterialShader forman una estrecha relación. Para un grafo de escena (incluyendo grafos anidados), hay una única instancia QSGMaterialShader que encapsula los shaders que el grafo de escena utiliza para renderizar ese material, como un shader para la coloración plana de la geometría. Cada QSGGeometryNode puede tener un único QSGMaterial que contiene la forma en que el shader debe ser configurado al dibujar ese nodo, como el color real a utilizar para renderizar la geometría.

QSGMaterial tiene dos funciones virtuales que deben ser implementadas. La función type() debe devolver una instancia única para todas las instancias de una subclase específica. La función createShader() debe devolver una nueva instancia de QSGMaterialShader, específica para esa subclase de QSGMaterial.

Una implementación mínima de QSGMaterial podría tener este aspecto:

class Material : public QSGMaterial
{
public:
    QSGMaterialType *type() const override { static QSGMaterialType type; return &type; }
    QSGMaterialShader *createShader(QSGRendererInterface::RenderMode) const override { return new Shader; }
};

Ver el ejemplo de Material personalizado para una introducción sobre la implementación de una subclase QQuickItem respaldada por un QSGGeometryNode y un material personalizado.

Nota: createShader() se llama sólo una vez por QSGMaterialType, para reducir el trabajo redundante con la preparación del shader. Si un QSGMaterial está respaldado por múltiples conjuntos de combinaciones de sombreadores de vértices y fragmentos, la implementación de type() debe devolver un puntero QSGMaterialType diferente y único para cada combinación de sombreadores.

Nota: Todas las clases con el prefijo QSG deben utilizarse únicamente en el subproceso de renderizado del gráfico de escena. Ver Gráfico de Escena y Renderizado para más información.

Ver también QSGMaterialShader, Gráfico de escena - Material personalizado, Gráfico de escena - Dos proveedores de texturas, y Gráfico de escena - Gráfico.

Documentación de tipos de miembros

enum QSGMaterial::Flag
flags QSGMaterial::Flags

ConstanteValorDescripción
QSGMaterial::Blending0x0001Establece esta bandera a true si el material requiere que la mezcla esté habilitada durante el renderizado.
QSGMaterial::RequiresDeterminant0x0002Establece este parámetro a true si el material se basa en el determinante de la matriz de los nodos de geometría para el renderizado.
QSGMaterial::RequiresFullMatrixExceptTranslate0x0004 | RequiresDeterminantEstablezca este parámetro en true si el material depende de la matriz completa de los nodos de geometría para el renderizado, excepto la parte de traslación.
QSGMaterial::RequiresFullMatrix0x0008 | RequiresFullMatrixExceptTranslateEstablezca este parámetro en true si el material se basa en la matriz completa de los nodos geométricos para el renderizado.
QSGMaterial::NoBatching0x0010Establece este parámetro a true si el material utiliza shaders que son incompatibles con el mecanismo de procesamiento por lotes del gráfico de escena. Esto es relevante en ciertos usos avanzados, como, manipular directamente gl_Position.z en el sombreador de vértices. Tales soluciones están a menudo ligadas a una estructura de escena específica, y probablemente no son seguras de usar con contenidos arbitrarios en una escena. Por lo tanto, este indicador sólo debe activarse después de una investigación adecuada, y nunca será necesario para la gran mayoría de los materiales. Activar esta opción puede reducir el rendimiento al tener que realizar más llamadas a dibujar. Este indicador se introdujo en Qt 6.3.
QSGMaterial::CustomCompileStepNoBatchingEn Qt 6 esta bandera es idéntica a NoBatching. Es preferible usar NoBatching en su lugar.

El tipo Flags es un typedef para QFlags<Flag>. Almacena una combinación OR de valores Flag.

Documentación de las funciones miembro

[virtual] int QSGMaterial::compare(const QSGMaterial *other) const

Compara este material con other y devuelve 0 si son iguales; -1 si este material debe ordenarse antes que other y 1 si other debe ordenarse antes.

El grafo de escena puede reordenar los nodos de geometría para minimizar los cambios de estado. La función compare es llamada durante el proceso de ordenación para que los materiales puedan ser ordenados para minimizar los cambios de estado en cada llamada a QSGMaterialShader::updateState().

Se garantiza que el puntero this y other tienen el mismo type().

[pure virtual] QSGMaterialShader *QSGMaterial::createShader(QSGRendererInterface::RenderMode renderMode) const

Esta función devuelve una nueva instancia de una implementación de QSGMaterialShader utilizada para renderizar geometría para una implementación específica de QSGMaterial.

La función se llamará una sola vez para cada combinación de tipo de material y renderMode y se almacenará en caché internamente.

Para la mayoría de los materiales, renderMode puede ignorarse. Algunos materiales pueden necesitar un manejo personalizado para modos de renderizado específicos. Por ejemplo, si el material implementa el antialiasing de una manera que necesita tener en cuenta las transformaciones de perspectiva cuando se utiliza RenderMode3D.

QSGMaterial::Flags QSGMaterial::flags() const

Devuelve las banderas del material.

void QSGMaterial::setFlag(QSGMaterial::Flags flags, bool on = true)

Establece las banderas flags en este material si on es verdadero; de lo contrario borra el atributo.

[pure virtual] QSGMaterialType *QSGMaterial::type() const

Esta función es llamada por el gráfico de escena para consultar un identificador que es único para el QSGMaterialShader instanciado por createShader().

Para muchos materiales, el enfoque típico será devolver un puntero a una instancia QSGMaterialType estática y, por tanto, disponible globalmente. QSGMaterialType es un objeto opaco. Su único propósito es servir como una forma sencilla y segura de generar identificadores de material únicos.

QSGMaterialType *type() const override
{
    static QSGMaterialType type;
    return &type;
}

[since 6.8] int QSGMaterial::viewCount() const

Devuelve El número de vistas en caso de que el material se utilice en renderizado multivista.

Nota: El valor devuelto es válido sólo cuando se llama desde createShader(), y después. El valor no está necesariamente actualizado antes de que createShader() sea invocado por el gráfico de escena.

Normalmente el valor de retorno es 1. Un recuento de vistas superior a 2 implica un pase de render multivista. Se espera que los materiales que soportan multivista consulten viewCount() en createShader(), o en su constructor QSGMaterialShader, y se aseguren de que se eligen los shaders apropiados. Se espera que el sombreador de vértices utilice gl_ViewIndex para indexar la matriz modelview-projection ya que hay múltiples matrices en modo multiview. (una para cada vista)

Como ejemplo, tomemos el siguiente sombreador de vértices simple:

#version 440

layout(location = 0) in vec4 vertexCoord;
layout(location = 1) in vec4 vertexColor;

layout(location = 0) out vec4 color;

layout(std140, binding = 0) uniform buf {
    mat4 matrix[2];
    float opacity;
};

void main()
{
    gl_Position = matrix[gl_ViewIndex] * vertexCoord;
    color = vertexColor * opacity;
}

Este shader está preparado para manejar 2 vistas, y sólo 2 vistas. No es compatible con otros recuentos de vistas. Al acondicionar el sombreador, la herramienta qsb debe invocarse con --view-count 2 o, si se utiliza la integración CMake, VIEW_COUNT 2 debe especificarse en el comando qt_add_shaders().

Nota: qsb inyecta automáticamente una línea con #extension GL_EXT_multiview : require cada vez que se establece un recuento de vistas de 2 o superior.

Se recomienda a los desarrolladores que utilicen la variable de preprocesador inyectada automáticamente QSHADER_VIEW_COUNT para simplificar el manejo de los distintos números de vistas. Por ejemplo, si existe la necesidad de soportar tanto no-multiview y multiview con un recuento de vistas de 2 en el mismo archivo de origen, se podría hacer lo siguiente:

#version 440

layout(location = 0) in vec4 vertexCoord;
layout(location = 1) in vec4 vertexColor;

layout(location = 0) out vec4 color;

layout(std140, binding = 0) uniform buf {
#if QSHADER_VIEW_COUNT >= 2
    mat4 matrix[QSHADER_VIEW_COUNT];
#else
    mat4 matrix;
#endif
    float opacity;
};

void main()
{
#if QSHADER_VIEW_COUNT >= 2
    gl_Position = matrix[gl_ViewIndex] * vertexCoord;
#else
    gl_Position = matrix * vertexCoord;
#endif
    color = vertexColor * opacity;
}

El mismo archivo fuente puede ahora ser ejecutado a través de qsb o qt_add_shaders() dos veces, una vez sin especificar el recuento de vistas, y una vez con el recuento de vistas establecido en 2. El material puede entonces elegir el archivo .qsb apropiado basado en viewCount() en tiempo de ejecución.

Con CMake, esto podría ser similar a lo siguiente. Con este ejemplo se espera que el correspondiente QSGMaterialShader elija entre :/shaders/example.vert.qsb y :/shaders/multiview/example.vert.qsb basándose en el valor de viewCount(). (lo mismo ocurre con el fragment shader)

qt_add_shaders(application "application_shaders"
    PREFIX
        /
    FILES
        shaders/example.vert
        shaders/example.frag
)

qt_add_shaders(application "application_multiview_shaders"
    GLSL
        330,300es
    HLSL
        61
    MSL
        12
    VIEW_COUNT
        2
    PREFIX
        /
    FILES
        shaders/example.vert
        shaders/example.frag
    OUTPUTS
        shaders/multiview/example.vert
        shaders/multiview/example.frag
)

Nota: El fragment shader debería ser tratado de la misma forma que el vertex shader, aunque el código del fragment shader no puede tener ninguna dependencia del view count (gl_ViewIndex), para una máxima portabilidad. Hay dos razones para incluir fragment shaders también en el conjunto multivista. Una es que mezclar diferentes versiones de shaders dentro del mismo pipeline gráfico puede ser problemático, dependiendo de la API gráfica subyacente: con D3D12 por ejemplo, mezclar shaders HLSL para shader model 5.0 y 6.1 generaría un error. La otra es que tener QSHADER_VIEW_COUNT definido en fragment shaders puede ser muy útil, por ejemplo cuando se comparte un diseño de búfer uniforme entre las etapas de vértices y fragmentos.

Nota: Para OpenGL, la versión mínima de GLSL para los sombreadores de vértices que dependen de gl_ViewIndex es 330. Versiones inferiores pueden ser aceptadas en tiempo de compilación, pero pueden provocar un error en tiempo de ejecución, dependiendo de la implementación de OpenGL.

Para mayor comodidad, también existe una opción MULTIVIEW para qt_add_shaders(). Esto ejecuta primero la herramienta qsb normalmente, luego anula VIEW_COUNT a 2, establece GLSL, HLSL, MSL a algunos valores predeterminados adecuados, y ejecuta qsb de nuevo, esta vez la salida de archivos .qsb con un sufijo añadido. La implementación del material puede entonces usar la sobrecarga QSGMaterialShader::setShaderFileName() tomando un argumento viewCount, que automáticamente escoge el archivo .qsb correcto.

Por lo tanto, lo siguiente es en gran medida equivalente a la llamada de ejemplo mostrada anteriormente, excepto que no es necesario especificar archivos de salida gestionados manualmente. Tenga en cuenta que puede haber casos en los que las versiones del lenguaje de sombreado elegidas automáticamente no sean suficientes, en cuyo caso las aplicaciones deberán seguir especificándolo todo explícitamente.

qt_add_shaders(application "application_multiview_shaders"
    MULTIVIEW
    PREFIX
        /
    FILES
        shaders/example.vert
        shaders/example.frag
)

Ver QRhi::MultiView, QRhiColorAttachment::setMultiViewCount(), y QRhiGraphicsPipeline::setMultiViewCount() para más detalles de bajo nivel sobre el soporte multivista en Qt. El renderizador de gráficos de escena Qt Quick está preparado para reconocer objetivos de renderizado multivista, cuando se especifican mediante QQuickRenderTarget::fromRhiRenderTarget() o las funciones específicas de la API 3D, como fromVulkanImage() con un argumento arraySize mayor que 1. El renderizador propagará entonces el recuento de vistas a los conductos gráficos y a los materiales.

Esta función se introdujo en Qt 6.8.

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