QCanvasRhiPaintDriver Class
Die Klasse QCanvasRhiPaintDriver verwaltet die untergeordneten Aspekte des QCanvasPainter-basierten Renderings für QRhi Renderziele und Offscreen-Leinwände. Mehr...
| Kopfzeile: | #include <QCanvasRhiPaintDriver> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| Seit: | Qt 6.11 |
| Status: | Technische Vorschau |
Öffentliche Typen
| enum class | BeginPaintFlag { DepthTest } |
| flags | BeginPaintFlags |
| enum class | EndPaintFlag { DoNotRecordRenderPass } |
| flags | EndPaintFlags |
Öffentliche Funktionen
| 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() |
Detaillierte Beschreibung
Anwendungen, die mit QCanvasPainter auf ein QRhi-basiertes Rendering-Ziel rendern möchten, z. B. in ein QRhiTexture oder in den Farbpuffer eines QRhiSwapChain, verwenden QCanvasPainterFactory, um ein QCanvasPainter und den mit dem QRhi verbundenen QCanvasRhiPaintDriver zu initialisieren und abzurufen. Die Zeichen-API wird von QCanvasPainter bereitgestellt, während die Low-Level-Aspekte des Renderings (was ist das Rendering-Ziel, was ist der Befehlspuffer usw.) von QCanvasRhiPaintDriver gesteuert werden.
Hinweis: Diese Klasse ist nur relevant, wenn Sie mit QCanvasPainter ohne eine Convenience-Klasse wie QCanvasPainterWidget oder QCanvasPainterItem arbeiten, da diese der Anwendung eine QCanvasPainter -Instanz zur Verfügung stellen und deren Rendering implizit verwalten.
Anwendungen erstellen selbst keine Instanzen von QCanvasRhiPaintDriver. Vielmehr rufen sie diese von einem erfolgreichen initialized QCanvasPainterFactory ab, indem sie paintDriver() aufrufen.
Im Folgenden sehen Sie eine fast vollständige, eigenständige Konsolenanwendung, die einen Kreis in eine QRhiTexture zeichnet, das Ergebnis zurückliest und es in einer PNG-Datei speichert:
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; }
Member Type Dokumentation
enum class QCanvasRhiPaintDriver::BeginPaintFlag
flags QCanvasRhiPaintDriver::BeginPaintFlags
Gibt die Flags für beginPaint() an.
| Konstante | Wert | Beschreibung |
|---|---|---|
QCanvasRhiPaintDriver::BeginPaintFlag::DepthTest | 0x01 | Gibt an, dass die Tiefenprüfung beim Rendern aktiviert werden soll. Normalerweise schreibt oder testet QCanvasPainter den Tiefenpuffer nicht. Wenn es notwendig ist, gegen Werte zu testen, die von einem anderen Renderer geschrieben wurden, setzen Sie dieses Flag. Die verwendete Tiefenvergleichsfunktion ist Less. |
Der Typ BeginPaintFlags ist ein Typedef für QFlags<BeginPaintFlag>. Er speichert eine ODER-Kombination von BeginPaintFlag-Werten.
enum class QCanvasRhiPaintDriver::EndPaintFlag
flags QCanvasRhiPaintDriver::EndPaintFlags
Gibt die Flags für endPaint() an.
| Konstante | Wert | Beschreibung |
|---|---|---|
QCanvasRhiPaintDriver::EndPaintFlag::DoNotRecordRenderPass | 0x01 | Zeigt an, dass das Flushen der von QCanvasPainter generierten Befehle und das Aufzeichnen des QRhi Renderpasses nicht erwünscht ist, da danach ein expliziter Aufruf von renderPaint() erfolgt. |
Der Typ EndPaintFlags ist ein Typedef für QFlags<EndPaintFlag>. Er speichert eine ODER-Kombination von EndPaintFlag-Werten.
Dokumentation der Mitgliedsfunktionen
void QCanvasRhiPaintDriver::beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Beginnt mit dem Malen auf dem angegebenen Offscreen canvas und zeichnet Rendering-Befehle in den Befehlspuffer cb auf.
Hinweis: Einem beginPaint() muss immer ein endPaint() folgen. Verschachtelung wird derzeit nicht unterstützt.
Das Löschen erfolgt mit dem fill color set on the canvas, es sei denn, das QCanvasOffscreenCanvas::Flag::PreserveContents Flag ist gesetzt. In diesem Fall erfolgt kein Löschen und der Inhalt der Leinwand bleibt erhalten (mit möglichen Auswirkungen auf die Leistung, abhängig von der zugrunde liegenden GPU-Architektur).
Hinweis: Die zugehörige QRhi muss einen Frame aufzeichnen (QRhi::beginFrame() oder QRhi::beginOffscreenFrame() muss aufgerufen worden sein), aber sie sollte sich nicht im Renderpass-Aufzeichnungsstatus befinden, wenn diese Funktion aufgerufen wird.
flags gibt die optionalen Flags an, die das Rendering steuern.
Dies ist eine überladene Funktion.
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QMatrix4x4 &matrix, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Beginnt mit dem Malen auf das Rendering-Ziel rt und zeichnet Rendering-Befehle im Befehlspuffer cb auf.
Diese Überladung nimmt eine benutzerdefinierte matrix, die verwendet wird, um die Scheitelpunkte zu transformieren. Die Matrix muss geeignet sein, um mit Scheitelpunkten umzugehen, deren Koordinaten in Pixeln angegeben sind. Ein üblicher Anwendungsfall ist die Übergabe der Modellansichtsprojektionsmatrix von Qt Quick bei der Implementierung des QCanvasPainter-basierten Renderings innerhalb einer QSGRenderNode Unterklasse.
Die Größe des Ansichtsfensters und das Pixelverhältnis des Geräts werden aus dem Rendering-Ziel übernommen.
Diese Überladung nimmt keine Füllfarbe an, da in der Praxis erwartet wird, dass sie von einem endPaint() mit gesetztem Flag EndPaintFlag::DoNotRecordRenderPass gefolgt wird.
Hinweis: Die Unterstützung für Clipping ist eingeschränkt, wenn eine benutzerdefinierte Matrix verwendet wird. Rechteckige, nicht transformierte Clips werden unterstützt, wenn die Matrix eine orthographische Projektion ohne zusätzliche Skalierung oder Rotation angibt. Es wird im Allgemeinen empfohlen, Zeichnungen zu vermeiden, die sich auf Clipping in diesem Modus verlassen.
Hinweis: Einem beginPaint() muss immer ein endPaint() folgen. Verschachtelung wird derzeit nicht unterstützt.
Hinweis: Es wird erwartet, dassrt sowohl eine Farb- als auch eine Tiefenschablonenanbindung hat. Falls mehrere Farbanhänge vorhanden sind, wird nur der Farbpuffer für Anhang 0 geschrieben. QCanvasPainter erfordert das Vorhandensein eines Tiefenschablonenpuffers. Derzeit wird nur die Tiefenschablone verwendet, Tiefenprüfung und Schreiben sind immer deaktiviert.
Hinweis: Das zugehörige QRhi muss einen Frame aufzeichnen (QRhi::beginFrame() oder QRhi::beginOffscreenFrame() muss aufgerufen worden sein), sollte sich aber nicht im Renderpass-Aufzeichnungsstatus befinden, wenn diese Funktion aufgerufen wird.
flags gibt die optionalen Flags an, die das Rendering steuern.
Dies ist eine überladene Funktion.
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &fillColor = Qt::black, QSize logicalSize = QSize(), float dpr = 1.0f, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
Beginnt mit dem Malen auf dem Rendering-Ziel rt und zeichnet Rendering-Befehle in den Befehlspuffer cb auf.
fillColor gibt die Farbe an, die zum Löschen des Farbpuffers verwendet wird. Dieser Wert wird ignoriert, wenn die Flags für endPaint() EndPaintFlag::DoNotRecordRenderPass enthalten.
Hinweis: Auf ein beginPaint() muss immer ein endPaint() folgen. Verschachtelung wird derzeit nicht unterstützt.
Hinweis: Es wird erwartet, dassrt sowohl einen Farb- als auch einen Tiefenschablonen-Anhang hat. Falls mehrere Farbanhänge vorhanden sind, wird nur der Farbpuffer für Anhang 0 geschrieben. QCanvasPainter erfordert das Vorhandensein eines Tiefenschablonenpuffers. Derzeit wird nur die Tiefenschablone verwendet, Tiefenprüfung und Schreiben sind immer deaktiviert.
logicalSize ist optional. Wenn er nicht leer ist, gibt er die Größe des Ansichtsfensters in logischen Einheiten an. dpr muss dann den Skalierungsfaktor (Gerätepixelverhältnis) angeben, damit logicalSize intern in Pixel umgerechnet werden kann. In der Praxis wird dies selten nötig sein, da die Größe des Rendering-Ziels standardmäßig automatisch verwendet wird.
Hinweis: Das zugehörige QRhi muss einen Frame aufzeichnen (QRhi::beginFrame() oder QRhi::beginOffscreenFrame() muss aufgerufen worden sein), aber es sollte sich nicht im Renderpass-Aufzeichnungsstatus befinden, wenn diese Funktion aufgerufen wird.
flags gibt die optionalen Flags an, die das Rendering steuern.
Dies ist eine überladene Funktion.
void QCanvasRhiPaintDriver::endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {})
Spült und zeichnet das gesamte QRhi Rendering auf, das von den QCanvasPainter Zeichenbefehlen erzeugt wird.
Standardmäßig zeichnet diese Funktion einen vollständigen Rendering-Durchgang auf, d.h. sie ruft intern QRhiCommandBuffer::beginPass() und QRhiCommandBuffer::endPass() auf. Die klare Farbe wird durch das fillColor-Argument von beginPaint() oder durch die Füllfarbe der Offscreen-Leinwand festgelegt.
flags kann verwendet werden, um die Aufzeichnung eines Rendering-Durchgangs zu steuern, da es in manchen Fällen nicht wünschenswert ist, dass endPaint() eine komplette beginPass() - endPass() Sequenz ausgibt.
Die folgenden beiden Schnipsel sind hinsichtlich der Ergebnisse identisch, aber der zweite bietet mehr Flexibilität, falls die Anwendung innerhalb desselben Rendering-Durchgangs mehr tun möchte:
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();
Siehe auch beginPaint() und renderPaint().
void QCanvasRhiPaintDriver::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
Stellt eine Texturrückleseanforderung für canvas.
callback wird entweder vor der Rückkehr der Funktion oder später aufgerufen, abhängig von der zugrunde liegenden QRhi und der 3D-API-Implementierung. Das Zurücklesen von Texturinhalten kann je nach GPU-Architektur eine GPU->CPU-Kopie beinhalten.
Diese Funktion kann sowohl innerhalb eines beginPaint() - endPaint() Blocks als auch außerhalb aufgerufen werden. Wenn sie außerhalb aufgerufen wird, ruft sie intern QRhi::beginOffscreenFrame() usw. auf, so dass Grabs zu jeder Zeit durchgeführt werden können.
void QCanvasRhiPaintDriver::renderPaint()
Zeichnet alle QRhi Renderings auf, die durch die QCanvasPainter Zeichenbefehle erzeugt wurden. Rufen Sie diese Funktion nur auf, wenn endPaint() mit DoNotRecordRenderPass aufgerufen wurde. Sie darf sonst nicht aufgerufen werden.
Die zugehörige QRhi muss einen Rendering-Durchgang aufzeichnen, wenn diese Funktion aufgerufen wird.
Siehe auch endPaint().
void QCanvasRhiPaintDriver::resetForNewFrame()
Setzt den Zustand der Malmaschine zurück. Es wird erwartet, dass diese Funktion einmal beim Start eines neuen Frames aufgerufen wird, normalerweise nach QRhi::beginFrame() oder 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.