En esta página

QSGRenderNode Class

La clase QSGRenderNode representa un conjunto de comandos de renderizado personalizados dirigidos a la API de gráficos que está en uso por el scenegraph. Más...

Cabecera: #include <QSGRenderNode>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
Hereda: QSGNode

Tipos Públicos

struct RenderState
enum RenderingFlag { BoundedRectRendering, DepthAwareRendering, OpaqueRendering, NoExternalRendering }
flags RenderingFlags
enum StateFlag { ViewportState, ScissorState, DepthState, StencilState, ColorState, …, RenderTargetState }
flags StateFlags

Funciones Públicas

virtual ~QSGRenderNode() override
virtual QSGRenderNode::StateFlags changedStates() const
const QSGClipNode *clipList() const
(since 6.6) QRhiCommandBuffer *commandBuffer() const
virtual QSGRenderNode::RenderingFlags flags() const
qreal inheritedOpacity() const
const QMatrix4x4 *matrix() const
(since 6.0) virtual void prepare()
(since 6.5) const QMatrix4x4 *projectionMatrix() const
virtual QRectF rect() const
virtual void releaseResources()
virtual void render(const QSGRenderNode::RenderState *state) = 0
(since 6.6) QRhiRenderTarget *renderTarget() const

Descripción Detallada

QSGRenderNode permite crear nodos de gráficos de escena que realizan su propio renderizado personalizado a través de QRhi (el enfoque común a partir de Qt 6.6), directamente a través de una API de gráficos 3D como OpenGL, Vulkan o Metal, o, cuando se utiliza el backend software, a través de QPainter.

QSGRenderNode es el habilitador para una de las tres formas de integrar renderizado 2D/3D personalizado en una escena Qt Quick. Las otras dos opciones son realizar el renderizado before o after el propio renderizado de la escena Qt Quick, o generar un pase de renderizado completamente separado apuntando a un objetivo de renderizado dedicado (una textura) y luego hacer que un elemento de la escena muestre la textura. El enfoque basado en QSGRenderNode es similar al anterior, en el sentido de que no hay pases adicionales de renderizado ni objetivos de renderizado, y permite inyectar comandos de renderizado personalizados "en línea" con el propio renderizado de la escena Qt Quick. Para más información sobre los tres enfoques, véase Qt Quick Scene Graph.

Ver también Gráfico de escena - QSGRenderNode personalizado.

Documentación de tipos de miembros

enum QSGRenderNode::RenderingFlag
flags QSGRenderNode::RenderingFlags

Posibles valores para la máscara de bits devuelta por flags().

ConstanteValorDescripción
QSGRenderNode::BoundedRectRendering0x01Indica que la implementación de render() no renderiza fuera del área reportada desde rect() en coordenadas de ítem. Tales implementaciones de nodos pueden llevar a un renderizado más eficiente, dependiendo del backend del scenegraph. Por ejemplo, el backend software puede seguir utilizando la ruta de actualización parcial más óptima cuando todos los nodos de renderizado de la escena tienen esta bandera activada.
QSGRenderNode::DepthAwareRendering0x02Indica que la implementación de render() se ajusta a las expectativas del scenegraph generando únicamente un valor Z de 0 en las coordenadas de la escena, que luego es transformado por las matrices recuperadas de RenderState::projectionMatrix() y matrix(), como se describe en las notas para render(). Estas implementaciones de nodos pueden conducir a un renderizado más eficiente, dependiendo del backend del scenegraph. Por ejemplo, el renderizador OpenGL por lotes puede seguir utilizando una ruta más óptima cuando todos los nodos de renderizado de la escena tienen esta bandera activada.
QSGRenderNode::OpaqueRendering0x04Indica que la implementación de render() escribe píxeles opacos para toda el área reportada desde rect(). Por defecto, los renderizadores deben asumir que render() también puede emitir píxeles semi o totalmente transparentes. Activar esta opción puede mejorar el rendimiento en algunos casos.
QSGRenderNode::NoExternalRendering0x08Indica que las implementaciones de prepare() y render() utilizan exclusivamente la familia de APIs QRhi, en lugar de llamar directamente a una API 3D como OpenGL, Vulkan o Metal.

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

Ver también render(), prepare(), rect(), y QRhi.

enum QSGRenderNode::StateFlag
flags QSGRenderNode::StateFlags

Este enum contiene los posibles valores a utilizar en la máscara de bits devuelta por changedStates().

ConstanteValorDescripción
QSGRenderNode::ViewportState0x40Ventana
QSGRenderNode::ScissorState0x04Estado de prueba de tijera habilitado, rectángulo de tijera
QSGRenderNode::DepthState0x01Este valor no tiene efecto en Qt 6.
QSGRenderNode::StencilState0x02Este valor no tiene efecto en Qt 6.
QSGRenderNode::ColorState0x08Este valor no tiene efecto en Qt 6.
QSGRenderNode::BlendState0x10Este valor no tiene efecto en Qt 6.
QSGRenderNode::CullState0x20Este valor no tiene efecto en Qt 6.
QSGRenderNode::RenderTargetState0x80Este valor no tiene efecto en Qt 6.

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

Documentación de las funciones miembro

[override virtual noexcept] QSGRenderNode::~QSGRenderNode()

Destruye el nodo de renderizado. Se espera que las clases derivadas realicen aquí una limpieza similar a releaseResources().

Con QRhi y recursos como QRhiBuffer, QRhiTexture, QRhiGraphicsPipeline, etc., a menudo es una buena práctica utilizar punteros inteligentes, como std::unique_ptr, que a menudo pueden evitar la necesidad de implementar un destructor, y conducir a un código fuente más compacto. Tenga en cuenta, sin embargo, que la implementación de releaseResources(), que probablemente contenga un número de llamadas a reset() en los unique_ptrs, sigue siendo importante.

Véase también releaseResources().

[virtual] QSGRenderNode::StateFlags QSGRenderNode::changedStates() const

Esta función debería devolver una máscara donde cada bit representa estados gráficos cambiados por la función render().

Nota: Con Qt 6 y el renderizado basado en QRhi los únicos valores relevantes son ViewportState y ScissorState. Otros valores pueden ser devueltos pero son ignorados en la práctica.

ConstanteDescripción
ViewportStateViewport
ScissorStateEstado de prueba de tijera activado, rectángulo de tijera
DepthStateEste valor no tiene efecto en Qt 6.
StencilStateEste valor no tiene efecto en Qt 6.
ColorStateEste valor no tiene efecto en Qt 6.
BlendStateEste valor no tiene efecto en Qt 6.
CullStateEste valor no tiene efecto en Qt 6.
RenderTargetStateEste valor no tiene efecto en Qt 6.

Nota: El backend software expone su QPainter y guarda y restaura antes y después de invocar render(). Por lo tanto, no es necesario informar de cualquier cambio de estado desde aquí.

La implementación por defecto devuelve 0, lo que significa que no se ha cambiado ningún estado relevante en render().

Nota: Esta función puede ser invocada antes de render().

const QSGClipNode *QSGRenderNode::clipList() const

Devuelve la lista de clips actual.

[since 6.6] QRhiCommandBuffer *QSGRenderNode::commandBuffer() const

Devuelve el buffer de comandos actual.

Esta función se introdujo en Qt 6.6.

Véase también renderTarget().

[virtual] QSGRenderNode::RenderingFlags QSGRenderNode::flags() const

Devuelve banderas que describen el comportamiento de este nodo de renderizado.

La implementación por defecto devuelve 0.

Véase también RenderingFlag y rect().

qreal QSGRenderNode::inheritedOpacity() const

Devuelve la opacidad efectiva actual.

const QMatrix4x4 *QSGRenderNode::matrix() const

Devuelve el puntero a la matriz modelo-vista actual.

[virtual, since 6.0] void QSGRenderNode::prepare()

Llamada desde la fase de preparación de la trama. Hay una llamada a esta función antes de cada invocación de render().

A diferencia de render(), esta función se llama antes de que el scenegraph comience a grabar el pase de renderizado para el fotograma actual en el buffer de comandos subyacente. Esto es útil cuando se hace renderizado con APIs gráficas, como Vulkan, donde el tipo de operaciones de copia necesitarán ser grabadas antes del pase de renderizado.

La implementación por defecto está vacía.

Cuando se implementa un QSGRenderNode que utiliza QRhi para renderizar, consulta el objeto QRhi desde el QQuickWindow a través de QQuickWindow::rhi(). Para obtener un QRhiCommandBuffer al que enviar el trabajo, llame a commandBuffer(). Para consultar información sobre el objetivo de renderizado activo, llame a renderTarget(). Ver el ejemplo {Scene Graph - Custom QSGRenderNode} para más detalles.

Esta función se introdujo en Qt 6.0.

[since 6.5] const QMatrix4x4 *QSGRenderNode::projectionMatrix() const

Devuelve el puntero a la matriz de proyección actual.

En render() esta es la misma matriz que se devuelve desde RenderState::projectionMatrix(). Este getter existe para que prepare() también tenga una forma de consultar la matriz de proyección.

Cuando se trabaja con una API gráfica moderna, o con la propia capa de abstracción gráfica de Qt, es más que probable que uno quiera cargar *projectionMatrix() * *matrix() en un buffer uniforme. Sin embargo, eso es algo que hay que hacer en prepare(), así que fuera de la grabación de un pase de render. Por eso ambas matrices son consultables directamente desde QSGRenderNode, tanto en prepare() como en render().

Esta función se introdujo en Qt 6.5.

[virtual] QRectF QSGRenderNode::rect() const

Devuelve el rectángulo delimitador en coordenadas de elemento para el área que toca render(). El valor sólo se utiliza cuando flags() incluye BoundedRectRendering, ignorándose en caso contrario.

Informar del rectángulo en combinación con BoundedRectRendering es especialmente importante con el backend software porque, de lo contrario, tener un rendernode en la escena desencadenaría actualizaciones a pantalla completa, saltándose todas las optimizaciones de actualización parcial.

Para los rendernodes que cubran toda el área de un QQuickItem correspondiente, el valor de retorno será (0, 0, item->width(), item->height()).

Nota: Los nodos también son libres de renderizar fuera de los límites especificados por la anchura y altura del elemento, ya que los nodos del scenegraph no están limitados por la geometría de QQuickItem, siempre y cuando esto se informe correctamente desde esta función.

Véase también flags().

[virtual] void QSGRenderNode::releaseResources()

Esta función es llamada cuando todos los recursos gráficos personalizados asignados por este nodo tienen que ser liberados inmediatamente. En caso de que el nodo no asigne directamente recursos gráficos (buffers, texturas, objetivos de renderizado, vallas, etc.) a través de la API gráfica que esté en uso, no hay nada que hacer aquí.

No liberar todos los recursos personalizados puede conducir a un comportamiento incorrecto en escenarios de pérdida de dispositivos gráficos en algunos sistemas, ya que la reinicialización posterior del sistema gráfico puede fallar.

Nota: Algunos backends de scenegraph pueden optar por no llamar a esta función. Por lo tanto, se espera que las implementaciones de QSGRenderNode realicen la limpieza tanto en su destructor como en releaseResources().

Al contrario que con el destructor, se espera que render() pueda reinicializar todos los recursos que necesite cuando se llame después de una llamada a releaseResources().

Con OpenGL, el contexto OpenGL del scenegraph será actual tanto cuando se llame al destructor como a esta función.

[pure virtual] void QSGRenderNode::render(const QSGRenderNode::RenderState *state)

Esta función es llamada por el renderizador y debe pintar este nodo invocando directamente comandos a través de QRhi o directamente a través de la API gráfica subyacente (OpenGL, Direct3D, etc.).

La opacidad efectiva puede recuperarse con inheritedOpacity().

La matriz de proyección está disponible a través de state, mientras que la matriz modelo-vista puede obtenerse con matrix(). La matriz combinada es la matriz de proyección multiplicada por la matriz modelo-vista. La matriz de proyección garantiza el apilamiento correcto de los elementos de la escena.

Cuando se utilizan las matrices proporcionadas, el sistema de coordenadas para los datos de vértices sigue las convenciones habituales de QQuickItem: arriba-izquierda es (0, 0), abajo-derecha es la correspondiente anchura() y altura() de QQuickItem menos uno. Por ejemplo, suponiendo una disposición de coordenadas de dos flotadores (x-y) por vértice, un triángulo que cubra la mitad del elemento puede especificarse como (anchura - 1, altura - 1), (0, 0), (0, altura - 1) utilizando la dirección contraria a las agujas del reloj.

Nota: QSGRenderNode se proporciona como un medio para implementar elementos personalizados en 2D o 2,5D Qt Quick. No está pensado para integrar contenido 3D real en la escena Qt Quick. Ese caso de uso está mejor soportado por los otros métodos para integrar renderizados personalizados.

Nota: QSGRenderNode puede funcionar significativamente mejor que los enfoques basados en texturas (como QQuickRhiItem), especialmente en sistemas en los que la capacidad de procesamiento de fragmentos es limitada. Esto se debe a que evita renderizar a una textura y luego dibujar un quad texturizado. En su lugar, QSGRenderNode permite grabar llamadas de dibujo en línea con otros comandos del scenegraph, evitando un objetivo de renderizado adicional y el potencialmente costoso texturizado y mezcla.

La información de recorte se calcula antes de llamar a la función. Las implementaciones que deseen tener en cuenta el recorte pueden configurar la tijera o el stencil basándose en la información de state. El búfer del stencil se rellena con las formas de recorte necesarias, pero depende de la implementación habilitar la comprobación del stencil.

Algunos backends de scenegraph, software en particular, no utilizan ni tijera ni stencil. En estos casos, la región de clip se proporciona como un QRegion normal.

Al implementar un QSGRenderNode que utilice QRhi para renderizar, consulte el objeto QRhi desde el QQuickWindow a través de QQuickWindow::rhi(). Para obtener un QRhiCommandBuffer al que enviar el trabajo, llame a commandBuffer(). Para consultar información sobre el objetivo de renderizado activo, llame a renderTarget(). Ver el ejemplo {Scene Graph - Custom QSGRenderNode} para más detalles.

Con Qt 6 y su renderizador de gráficos de escena basado en QRhi, no se deben hacer suposiciones sobre el estado activo (OpenGL) cuando se llama a esta función, incluso cuando OpenGL está en uso. No se debe asumir nada sobre los pipelines y estados dinámicos vinculados en la lista de comandos/buffer cuando se llama a esta función.

Nota: Se espera que las escrituras en profundidad estén deshabilitadas. Habilitar las escrituras en profundidad puede llevar a resultados inesperados, dependiendo del backend del scenegraph en uso y del contenido de la escena, así que ten cuidado con esto.

Nota: En Qt 6, changedStates() tiene un uso limitado. Consulte la documentación de changedStates() para obtener más información.

Con algunas APIs gráficas, incluyendo cuando se usa QRhi directamente, puede ser necesario reimplementar prepare() además, o alternativamente conectarse a la señal QQuickWindow::beforeRendering(). Estos son llamados/emitidos antes de grabar el comienzo de un renderpass en el buffer de comandos (vkCmdBeginRenderPass con Vulkan, o comenzando a codificar vía MTLRenderCommandEncoder en el caso de Metal. Las operaciones de copia de grabación no se pueden hacer dentro de render() con tales APIs. Más bien, haga tales operaciones en prepare() o en la ranura conectada a beforeRendering (con DirectConnection).

Véase también QSGRendererInterface y QQuickWindow::rendererInterface().

[since 6.6] QRhiRenderTarget *QSGRenderNode::renderTarget() const

Devuelve el objetivo de renderizado actual.

Se proporciona principalmente para permitir las implementaciones de prepare() y render() que utilizan QRhi accediendo a QRhiRenderTarget's renderPassDescriptor o pixel size.

Para construir un QRhiGraphicsPipeline, lo que implica tener que proporcionar un QRhiRenderPassDescriptor, consulta el renderPassDescriptor del objetivo de renderizado. Tenga en cuenta, sin embargo, que el objetivo de renderizado puede cambiar a lo largo de la vida del QQuickItem personalizado y del QSGRenderNode. Por ejemplo, considere lo que sucede cuando se establece dinámicamente layer.enabled: true en el elemento o en un ancestro del mismo: esto desencadena el renderizado en una textura, no directamente en la ventana, lo que significa que el QSGRenderNode va a trabajar con un objetivo de renderizado diferente a partir de entonces. El nuevo objetivo de renderizado puede entonces tener un formato de píxel diferente, lo que puede hacer incompatibles los pipelines gráficos ya construidos. Esto puede ser manejado con la lógica como la siguiente:

if (m_pipeline && renderTarget()->renderPassDescriptor()->serializedFormat() != m_renderPassFormat) {
    delete m_pipeline;
    m_pipeline = nullptr;
}
if (!m_pipeline) {
    // Build a new QRhiGraphicsPipeline.
    // ...
    // Store the serialized format for fast and simple comparisons later on.
    m_renderPassFormat = renderTarget()->renderPassDescriptor()->serializedFormat();
}

Esta función se introdujo en Qt 6.6.

Véase también commandBuffer().

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