QCanvasRhiPaintDriver Class
La clase QCanvasRhiPaintDriver gestiona los aspectos de bajo nivel del renderizado basado en QCanvasPainter para los objetivos de renderizado QRhi y los lienzos fuera de pantalla. Más...
| Cabecera: | #include <QCanvasRhiPaintDriver> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| Desde: | Qt 6.11 |
| Estado: | Avance técnico |
Tipos Públicos
| enum class | BeginPaintFlag { DepthTest } |
| flags | BeginPaintFlags |
| enum class | EndPaintFlag { DoNotRecordRenderPass } |
| flags | EndPaintFlags |
Funciones públicas
| void | beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {}) |
| void | beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QMatrix4x4 &matrix, QCanvasRhiPaintDriver::BeginPaintFlags flags = {}) |
| void | beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &fillColor = Qt::black, QSize logicalSize = QSize(), float dpr = 1.0f, QCanvasRhiPaintDriver::BeginPaintFlags flags = {}) |
| void | endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {}) |
| void | grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback) |
| void | renderPaint() |
| void | resetForNewFrame() |
Descripción detallada
Las aplicaciones que deseen renderizar con QCanvasPainter en un objetivo de renderizado basado en QRhi, como en QRhiTexture, o en el buffer de color de QRhiSwapChain, utilizan QCanvasPainterFactory para inicializar y recuperar QCanvasPainter y QCanvasRhiPaintDriver asociado con QRhi. La API de dibujo es proporcionada por QCanvasPainter, mientras que los aspectos de bajo nivel del renderizado (cuál es el objetivo de renderizado, cuál es el buffer de comandos, etc.) son controlados por QCanvasRhiPaintDriver.
Nota: Esta clase sólo es relevante cuando se trabaja con QCanvasPainter sin una clase de conveniencia como QCanvasPainterWidget o QCanvasPainterItem, porque éstas proporcionan una instancia de QCanvasPainter a la aplicación y gestionan su renderizado implícitamente.
Las aplicaciones no crean instancias de QCanvasRhiPaintDriver por si mismas. Más bien, lo recuperan de un initialized QCanvasPainterFactory exitoso llamando a paintDriver().
La siguiente es una aplicación de consola casi completa e independiente que dibuja un círculo en QRhiTexture, lee el resultado y lo guarda en un archivo PNG:
int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // std::unique_ptr<QRhi> rhi(QRhi::create(...)); std::unique_ptr<QRhiTexture> tex(rhi->newTexture(QRhiTexture::RGBA8, QSize(1280, 720), 1, QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource)); tex->create(); std::unique_ptr<QRhiRenderBuffer> ds(rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, QSize(1280, 720))); ds->create(); QRhiTextureRenderTargetDescription rtDesc; rtDesc.setColorAttachments({ tex.get() }); rtDesc.setDepthStencilBuffer(ds.get()); std::unique_ptr<QRhiTextureRenderTarget> rt(rhi->newTextureRenderTarget(rtDesc)); std::unique_ptr<QRhiRenderPassDescriptor> rp(rt->newCompatibleRenderPassDescriptor()); rt->setRenderPassDescriptor(rp.get()); rt->create(); std::unique_ptr<QCanvasPainterFactory> factory(new QCanvasPainterFactory); QCanvasPainter *painter = factory->create(rhi.get()); QCanvasRhiPaintDriver *pd = factory->paintDriver(); QRhiCommandBuffer *cb; QRhiReadbackResult readbackResult; rhi->beginOffscreenFrame(&cb); pd->resetForNewFrame(); { pd->beginPaint(cb, rt.get()); painter->beginPath(); painter->circle(640, 360, 180); painter->setFillStyle(Qt::red); painter->fill(); pd->endPaint(); QRhiResourceUpdateBatch *u = rhi->nextResourceUpdateBatch(); u->readBackTexture({ tex.get() }, &readbackResult); cb->resourceUpdate(u); } rhi->endOffscreenFrame(); QImage image(reinterpret_cast<const uchar *>(readbackResult.data.constData()), readbackResult.pixelSize.width(), readbackResult.pixelSize.height(), QImage::Format_RGBA8888); if (rhi->isYUpInFramebuffer()) image.flip(); image.save("result.png"); return 0; }
Documentación del tipo de miembro
clase enum QCanvasRhiPaintDriver::BeginPaintFlag
flags QCanvasRhiPaintDriver::BeginPaintFlags
Especifica las banderas para beginPaint().
| Constante | Valor | Descripción |
|---|---|---|
QCanvasRhiPaintDriver::BeginPaintFlag::DepthTest | 0x01 | Indica que la prueba de profundidad debe ser habilitada cuando se renderiza. Normalmente QCanvasPainter no escribe o comprueba el buffer de profundidad. Si existe la necesidad de probar contra valores escritos por otro renderizador, active esta bandera. La función de comparación de profundidad utilizada es Less. |
El tipo BeginPaintFlags es un typedef para QFlags<BeginPaintFlag>. Almacena una combinación OR de valores BeginPaintFlag.
clase enum QCanvasRhiPaintDriver::EndPaintFlag
flags QCanvasRhiPaintDriver::EndPaintFlags
Especifica las banderas para endPaint().
| Constante | Valor | Descripción |
|---|---|---|
QCanvasRhiPaintDriver::EndPaintFlag::DoNotRecordRenderPass | 0x01 | Indica que no se desea vaciar los comandos generados por QCanvasPainter y grabar el pase de renderizado de QRhi, porque habrá una llamada explícita a renderPaint() después. |
El tipo EndPaintFlags es un typedef para QFlags<EndPaintFlag>. Almacena una combinación OR de valores EndPaintFlag.
Documentación de las funciones miembro
void QCanvasRhiPaintDriver::beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Comienza a pintar sobre la pantalla apagada especificada canvas, grabando los comandos de renderizado en el búfer de comandos cb.
Nota: Un beginPaint() siempre debe ir seguido de un endPaint(). Actualmente no se admite el anidamiento.
El borrado se realiza con fill color set on the canvas, a menos que se active la bandera QCanvasOffscreenCanvas::Flag::PreserveContents, en cuyo caso no hay borrado y se preserva el contenido del lienzo (con implicaciones potenciales para el rendimiento, dependiendo de la arquitectura GPU subyacente).
Nota: El QRhi asociado debe estar grabando un fotograma (QRhi::beginFrame() o QRhi::beginOffscreenFrame() deben haber sido llamados), pero no debe estar en estado de grabación de pases de render cuando esta función es llamada.
flags especifica las banderas opcionales que controlan el renderizado.
Se trata de una función sobrecargada.
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QMatrix4x4 &matrix, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Comienza a pintar sobre el objetivo de renderizado rt, registrando los comandos de renderizado en el buffer de comandos cb.
Esta sobrecarga toma una matriz personalizada matrix, que se utiliza para transformar los vértices. La matriz debe ser adecuada para tratar con vértices en los que las coordenadas se dan en píxeles. Un caso de uso común es pasar Qt Quick's modelview-projection matrix cuando se implementa QCanvasPainter-pased rendering dentro de una subclase QSGRenderNode.
El tamaño de la ventana gráfica y la proporción de píxeles del dispositivo se toman del objetivo de renderizado.
Esta sobrecarga no toma un color de relleno ya que en la práctica se espera que vaya seguida de un endPaint() con la bandera EndPaintFlag::DoNotRecordRenderPass activada.
Nota: La compatibilidad con el recorte es limitada cuando se utiliza una matriz personalizada. Los recortes rectangulares no transformados se admiten cuando la matriz especifica una proyección ortográfica sin escalado ni rotación añadidos. En general, se recomienda evitar el dibujo basado en recortes en este modo.
Nota: Un beginPaint() siempre debe ir seguido de un endPaint(). Actualmente no se admite el anidamiento.
Nota: Se espera quert tenga un adjunto de color y otro de profundidad. En caso de que existan varios anexos de color, sólo se escribirá el búfer de color del anexo 0. QCanvasPainter requiere la presencia de un búfer de profundidad-esténcil. En la actualidad sólo se utiliza el stencil, la prueba de profundidad y la escritura están siempre desactivadas.
Nota: El QRhi asociado debe estar grabando un fotograma (debe haberse llamado aQRhi::beginFrame() o QRhi::beginOffscreenFrame()), pero no debe estar en estado de grabación del pase de renderizado cuando se llame a esta función.
flags especifica las banderas opcionales que controlan el renderizado.
Se trata de una función sobrecargada.
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &fillColor = Qt::black, QSize logicalSize = QSize(), float dpr = 1.0f, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Comienza a pintar sobre el objetivo de renderizado rt, registrando los comandos de renderizado en el buffer de comandos cb.
fillColor especifica el color usado para limpiar el buffer de color. Este valor se ignora cuando las banderas de endPaint() contienen EndPaintFlag::DoNotRecordRenderPass.
Nota: Un beginPaint() siempre debe ir seguido de un endPaint(). Actualmente no se admite el anidamiento.
Nota: Se espera quert tenga tanto un adjunto de color como uno de profundidad. En caso de que existan varios anexos de color, sólo se escribirá el búfer de color del anexo 0. QCanvasPainter requiere la presencia de un búfer de profundidad-esténcil. Actualmente sólo se utiliza el stencil, la prueba de profundidad y la escritura están siempre desactivadas.
logicalSize es opcional. Cuando no está vacío, especifica el tamaño de la ventana gráfica en unidades lógicas. dpr debe especificar entonces el factor de escala (proporción de píxeles del dispositivo) para que logicalSize pueda convertirse a píxeles internamente. En la práctica, esto rara vez será necesario, ya que el tamaño del objetivo de renderizado se utiliza automáticamente por defecto.
Nota: El QRhi asociado debe estar grabando un frame (QRhi::beginFrame() o QRhi::beginOffscreenFrame() deben haber sido llamados), pero no debe estar en estado de grabación de pase de render cuando esta función es llamada.
flags especifica las banderas opcionales que controlan el renderizado.
Se trata de una función sobrecargada.
void QCanvasRhiPaintDriver::endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {})
Descarga y registra todo el renderizado de QRhi generado por los comandos de dibujo de QCanvasPainter.
Por defecto, esta función registra un pase de renderizado completo, lo que significa que llamará internamente a QRhiCommandBuffer::beginPass() y QRhiCommandBuffer::endPass(). El color claro se especifica mediante el argumento fillColor de beginPaint(), o el color de relleno del lienzo fuera de pantalla.
flags puede usarse para controlar la grabación de un pase de render, ya que en algunos casos no será deseable dejar que endPaint() emita una secuencia entera beginPass() - endPass().
Los dos siguientes snippets son idénticos en cuanto a los resultados, pero el segundo ofrece más flexibilidad, en caso de que la aplicación quiera hacer más cosas dentro del mismo pase de render:
pd->beginPaint(cb, rt, Qt::black); // painter->... pd->endPaint();
pd->beginPaint(cb, rt); // painter->... pd->endPaint(QCanvasRhiPaintDriver::EndPaintFlag::DoNotRecordRenderPass); cb->beginPass(rt, Qt::black, { 1.0f, 0 }); pd->renderPaint(); cb->endPass();
Véase también beginPaint() y renderPaint().
void QCanvasRhiPaintDriver::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
Emite una solicitud de lectura de textura para canvas.
callback es invocada antes de que la función retorne, o más tarde, dependiendo de QRhi y de la implementación de la API 3D. La lectura del contenido de la textura puede implicar una copia GPU->CPU, dependiendo de la arquitectura de la GPU.
Esta función puede ser llamada tanto dentro de un bloque beginPaint() - endPaint(), como fuera de él. Cuando se llama fuera, invocará internamente QRhi::beginOffscreenFrame() etc., permitiendo que se realicen grabs en cualquier momento.
void QCanvasRhiPaintDriver::renderPaint()
Registra todos los renderizados de QRhi generados por los comandos de dibujo de QCanvasPainter. Llame a esta función sólo cuando endPaint() fue invocado con DoNotRecordRenderPass. No debe ser llamado de otra manera.
El QRhi asociado debe estar grabando un pase de renderizado cuando se invoque a esta función.
Véase también endPaint().
void QCanvasRhiPaintDriver::resetForNewFrame()
Restablece el estado del motor del pintor. Se espera que esta función se invoque una vez al iniciar un nuevo fotograma, normalmente después de QRhi::beginFrame() o QRhi::beginOffscreenFrame().
© 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.