QCanvasRhiPaintDriver Class
La classe QCanvasRhiPaintDriver gère les aspects de bas niveau du rendu basé sur QCanvasPainter pour les cibles de rendu QRhi et les toiles hors écran. Plus...
| En-tête : | #include <QCanvasRhiPaintDriver> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| Depuis : | Qt 6.11 |
| Statut : | Aperçu technique |
Types publics
| enum class | BeginPaintFlag { DepthTest } |
| flags | BeginPaintFlags |
| enum class | EndPaintFlag { DoNotRecordRenderPass } |
| flags | EndPaintFlags |
Fonctions publiques
| 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() |
Description détaillée
Les applications souhaitant effectuer un rendu avec QCanvasPainter sur une cible de rendu basée sur QRhi, comme dans un QRhiTexture, ou dans le tampon de couleur d'un QRhiSwapChain, utilisent QCanvasPainterFactory pour initialiser et récupérer un QCanvasPainter et QCanvasRhiPaintDriver associé à QRhi. L'API de dessin est fournie par QCanvasPainter, tandis que les aspects de bas niveau du rendu (quelle est la cible de rendu, quel est le tampon de commande, etc.) sont contrôlés par QCanvasRhiPaintDriver.
Note : Cette classe n'est pertinente que lorsque l'on travaille avec QCanvasPainter sans classe de commodité telle que QCanvasPainterWidget ou QCanvasPainterItem, car ces dernières fournissent une instance de QCanvasPainter à l'application et gèrent implicitement son rendu.
Les applications ne créent pas elles-mêmes d'instances de QCanvasRhiPaintDriver. Elles les récupèrent plutôt à partir d'une instance initialized QCanvasPainterFactory en appelant paintDriver().
Ce qui suit est une application console autonome presque complète qui dessine un cercle dans un QRhiTexture, lit le résultat et l'enregistre dans un fichier 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; }
Membre Type Documentation
enum class QCanvasRhiPaintDriver::BeginPaintFlag
flags QCanvasRhiPaintDriver::BeginPaintFlags
Spécifie les drapeaux pour beginPaint().
| Constante | Valeur | Description |
|---|---|---|
QCanvasRhiPaintDriver::BeginPaintFlag::DepthTest | 0x01 | Indique que le test de profondeur doit être activé lors du rendu. Normalement, QCanvasPainter n'écrit pas et ne teste pas le tampon de profondeur. S'il est nécessaire de tester les valeurs écrites par un autre moteur de rendu, activez ce drapeau. La fonction de comparaison de profondeur utilisée est Less. |
Le type BeginPaintFlags est un typedef pour QFlags<BeginPaintFlag>. Il stocke une combinaison OR de valeurs BeginPaintFlag.
enum class QCanvasRhiPaintDriver::EndPaintFlag
flags QCanvasRhiPaintDriver::EndPaintFlags
Spécifie les drapeaux pour endPaint().
| Constante | Valeur | Description |
|---|---|---|
QCanvasRhiPaintDriver::EndPaintFlag::DoNotRecordRenderPass | 0x01 | Indique que le rinçage des commandes générées par QCanvasPainter et l'enregistrement de la passe de rendu QRhi ne sont pas souhaités, car il y aura un appel explicite à renderPaint() par la suite. |
Le type EndPaintFlags est un typedef pour QFlags<EndPaintFlag>. Il stocke une combinaison OU de valeurs EndPaintFlag.
Documentation des fonctions membres
void QCanvasRhiPaintDriver::beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Commence à peindre sur le hors-écran spécifié canvas, en enregistrant les commandes de rendu dans le tampon de commande cb.
Remarque : un beginPaint() doit toujours être suivi d'un endPaint(). L'imbrication n'est pas prise en charge actuellement.
L'effacement se fait avec fill color set on the canvas, sauf si le drapeau QCanvasOffscreenCanvas::Flag::PreserveContents est activé, auquel cas il n'y a pas d'effacement et le contenu de la toile est préservé (avec des implications potentielles pour les performances, en fonction de l'architecture GPU sous-jacente).
Remarque : le site QRhi associé doit enregistrer une image (QRhi::beginFrame() ou QRhi::beginOffscreenFrame() doit avoir été appelé), mais il ne doit pas être dans l'état d'enregistrement de la passe de rendu lorsque cette fonction est appelée.
flags spécifie les drapeaux optionnels qui contrôlent le rendu.
Il s'agit d'une fonction surchargée.
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QMatrix4x4 &matrix, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Commence à peindre sur la cible de rendu rt, en enregistrant les commandes de rendu dans le tampon de commande cb.
Cette surcharge prend une matrice personnalisée matrix, qui est utilisée pour transformer les sommets. La matrice doit être adaptée au traitement des sommets dont les coordonnées sont exprimées en pixels. Un cas d'utilisation courant consiste à transmettre la matrice de projection de la vue modèle de Qt Quick lors de la mise en œuvre du rendu basé sur QCanvasPainter dans une sous-classe de QSGRenderNode.
La taille de la fenêtre de visualisation et le ratio de pixels de l'appareil proviennent de la cible de rendu.
Cette surcharge ne prend pas de couleur de remplissage car, dans la pratique, elle est censée être suivie d'un endPaint() avec l'indicateur EndPaintFlag::DoNotRecordRenderPass activé.
Remarque : la prise en charge de l'écrêtage est limitée lorsqu'une matrice personnalisée est utilisée. Les clips rectangulaires non transformés sont pris en charge lorsque la matrice spécifie une projection orthographique sans aucune mise à l'échelle ou rotation supplémentaire. Il est généralement recommandé d'éviter les dessins reposant sur l'écrêtage dans ce mode.
Remarque : un beginPaint() doit toujours être suivi d'un endPaint(). L'imbrication n'est pas prise en charge actuellement.
Note : rt est censé avoir un attachement de couleur et de profondeur. S'il y a plusieurs attachements de couleur, seul le tampon de couleur de l'attachement 0 est écrit. QCanvasPainter nécessite la présence d'un tampon de profondeur et de pochoir. Actuellement, seul le stencil est utilisé, le test de profondeur et l'écriture sont toujours désactivés.
Remarque : le site QRhi associé doit enregistrer une image (QRhi::beginFrame() ou QRhi::beginOffscreenFrame() doit avoir été appelé), mais il ne doit pas être dans l'état d'enregistrement de la passe de rendu lorsque cette fonction est appelée.
flags spécifie les drapeaux optionnels qui contrôlent le rendu.
Il s'agit d'une fonction surchargée.
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &fillColor = Qt::black, QSize logicalSize = QSize(), float dpr = 1.0f, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Commence à peindre sur la cible de rendu rt, en enregistrant les commandes de rendu dans le tampon de commande cb.
fillColor spécifie la couleur utilisée pour vider le tampon de couleurs. Cette valeur est ignorée lorsque les indicateurs de endPaint() contiennent EndPaintFlag::DoNotRecordRenderPass.
Remarque : un beginPaint() doit toujours être suivi d'un endPaint(). L'imbrication n'est pas prise en charge actuellement.
Remarque : rt est censé avoir un attachement de couleur et de profondeur. S'il y a plusieurs attachements de couleur, seul le tampon de couleur de l'attachement 0 est écrit. QCanvasPainter nécessite la présence d'un tampon de profondeur et de pochoir. Actuellement, seul le stencil est utilisé, le test de profondeur et l'écriture sont toujours désactivés.
logicalSize est facultatif. Lorsqu'il n'est pas vide, il spécifie la taille de la fenêtre de visualisation en unités logiques. dpr doit ensuite spécifier le facteur d'échelle (rapport de pixels de l'appareil) afin que logicalSize puisse être converti en pixels en interne. En pratique, cela sera rarement nécessaire, car la taille de la cible de rendu est utilisée automatiquement par défaut.
Note : Le site QRhi associé doit enregistrer une image (QRhi::beginFrame() ou QRhi::beginOffscreenFrame() doit avoir été appelé), mais il ne doit pas être dans l'état d'enregistrement de la passe de rendu lorsque cette fonction est appelée.
flags spécifie les drapeaux optionnels qui contrôlent le rendu.
Il s'agit d'une fonction surchargée.
void QCanvasRhiPaintDriver::endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {})
Rince et enregistre tous les rendus de QRhi générés par les commandes de dessin de QCanvasPainter.
Par défaut, cette fonction enregistre une passe de rendu complète, ce qui signifie qu'elle appellera en interne QRhiCommandBuffer::beginPass() et QRhiCommandBuffer::endPass(). La couleur claire est spécifiée par l'argument fillColor de beginPaint(), ou par la couleur de remplissage du canevas hors écran.
flags peut être utilisé pour contrôler l'enregistrement d'une passe de rendu, car dans certains cas, il n'est pas souhaitable de laisser endPaint() émettre une séquence complète beginPass() - endPass().
Les deux extraits suivants sont identiques en ce qui concerne les résultats, mais le second offre plus de flexibilité, au cas où l'application voudrait faire plus dans la même passe de rendu :
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();
Voir aussi beginPaint() et renderPaint().
void QCanvasRhiPaintDriver::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
Emet une demande de relecture de texture pour canvas.
callback est invoquée soit avant le retour de la fonction, soit plus tard, en fonction de l'implémentation sous-jacente de QRhi et de l'API 3D. La relecture du contenu des textures peut impliquer une copie GPU->CPU, en fonction de l'architecture du GPU.
Cette fonction peut être appelée à l'intérieur d'un bloc beginPaint() - endPaint() ou à l'extérieur. Lorsqu'elle est appelée à l'extérieur, elle invoque en interne QRhi::beginOffscreenFrame(), etc., ce qui permet d'effectuer des saisies à tout moment.
void QCanvasRhiPaintDriver::renderPaint()
Enregistre tous les rendus QRhi générés par les commandes de dessin QCanvasPainter. Cette fonction ne doit être appelée que si endPaint() a été invoqué avec DoNotRecordRenderPass. Elle ne doit pas être appelée autrement.
Le site QRhi associé doit être en train d'enregistrer une passe de rendu lorsque cette fonction est invoquée.
Voir également endPaint().
void QCanvasRhiPaintDriver::resetForNewFrame()
Réinitialise l'état du moteur de peinture. Cette fonction est censée être appelée une fois lors du démarrage d'une nouvelle image, généralement après QRhi::beginFrame() ou 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.