QCanvasRhiPaintDriver Class
QCanvasRhiPaintDriver クラスは、QRhi レンダーターゲットとオフスクリーンキャンバス用のQCanvasPainter ベースのレンダリングの低レベルの側面を管理します。詳細...
| ヘッダー | #include <QCanvasRhiPaintDriver> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| 以来: | Qt 6.11 |
| ステータス | テクニカルプレビュー |
パブリックな型
| enum class | BeginPaintFlag { DepthTest } |
| flags | BeginPaintFlags |
| enum class | EndPaintFlag { DoNotRecordRenderPass } |
| flags | EndPaintFlags |
パブリック関数
| 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() |
詳細説明
QRhiTexture やQRhiSwapChain のカラーバッファなど、QRhi ベースのレンダーターゲットにQCanvasPainter でレンダリングしたいアプリケーションは、QCanvasPainterFactory を使用して、QCanvasPainter とQRhi に関連付けられた QCanvasRhiPaintDriver を初期化および取得します。描画 API はQCanvasPainter によって提供され、レンダリングの低レベルな側面(レンダーターゲットは何か、コマンドバッファは何かなど)は QCanvasRhiPaintDriver によって制御されます。
注意: このクラスは、QCanvasPainterWidget やQCanvasPainterItem のような便利なクラスなしで QCanvasPainter を扱う場合にのみ関係します。なぜなら、これらのクラスはQCanvasPainter インスタンスをアプリケーションに提供し、そのレンダリングを暗黙的に管理するからです。
アプリケーションはQCanvasRhiPaintDriverのインスタンスを生成しません。むしろ、paintDriver() を呼び出すことで、正常にinitialized QCanvasPainterFactory から取得します。
以下は、QRhiTexture に円を描き、結果を読み込んで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; }
メンバ型ドキュメント
enum class QCanvasRhiPaintDriver::BeginPaintFlag
flags QCanvasRhiPaintDriver::BeginPaintFlags
beginPaint() のフラグを指定します。
| 定数 | 値 | 説明 |
|---|---|---|
QCanvasRhiPaintDriver::BeginPaintFlag::DepthTest | 0x01 | レンダリング時に深度テストを有効にすることを示します。通常、QCanvasPainter は深度バッファを書き込んだりテストしたりしません。他のレンダラーによって書き込まれた値に対してテストする必要がある場合は、このフラグを設定します。使用される深度比較関数はLess です。 |
BeginPaintFlags 型はQFlags<BeginPaintFlag> の typedef です。これは BeginPaintFlag の値の OR の組み合わせを格納します。
enum class QCanvasRhiPaintDriver::EndPaintFlag
flags QCanvasRhiPaintDriver::EndPaintFlags
endPaint() のフラグを指定します。
| 定数 | 値 | 説明 |
|---|---|---|
QCanvasRhiPaintDriver::EndPaintFlag::DoNotRecordRenderPass | 0x01 | QCanvasPainter'の生成されたコマンドをフラッシュし、QRhi レンダーパスを記録することを望まないことを示します。なぜなら、その後にrenderPaint() への明示的な呼び出しがあるからです。 |
EndPaintFlags 型はQFlags<EndPaintFlag> の typedef です。これはEndPaintFlag値のORの組み合わせを格納する。
メンバ関数ドキュメント
void QCanvasRhiPaintDriver::beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
指定されたオフスクリーンcanvas にペイントを開始し、コマンドバッファcb にレンダリングコマンドを記録する。
注意: beginPaint() の後には、必ずendPaint() を続けなければならない。ネスティングは現在サポートされていません。
クリアはfill color set on the canvas で行われます。ただし、QCanvasOffscreenCanvas::Flag::PreserveContents フラグが設定されている場合はクリアされず、canvas の内容が保持されます(GPU アーキテクチャによってはパフォーマンスが低下する可能性があります)。
注意: 関連するQRhi はフレームを記録している必要があります(QRhi::beginFrame() またはQRhi::beginOffscreenFrame() が呼び出されている必要があります)が、この関数が呼び出されたときにレンダーパスの記録状態であってはなりません。
flags は、レンダリングを制御するオプションのフラグを指定します。
これはオーバーロードされた関数です。
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QMatrix4x4 &matrix, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
レンダーターゲットrt にペイントを開始し、コマンドバッファcb にレンダリングコマンドを記録する。
このオーバーロードは、頂点の変換に使用されるカスタムmatrix 。この行列は、座標がピクセル単位で与えられる頂点を扱うのに適したものでなければなりません。一般的な使用例としては、QSGRenderNode サブクラス内でQCanvasPainter-pased レンダリングを実装する際に、Qt Quick の modelview-projection 行列を渡すことが挙げられます。
ビューポートのサイズとデバイスのピクセル比率は、レンダーターゲットから取得されます。
実際には、フラグEndPaintFlag::DoNotRecordRenderPass が設定されたendPaint() が続くことが期待されるため、このオーバーロードは塗りつぶし色を取りません。
注意: カスタム行列を使用する場合、クリッピングのサポートは制限されます。行列が,拡大縮小や回転を加えない正射投影を指定する場合,長方形で変形しないクリップがサポートされます。一般に、このモードではクリッピングに依存した描画を避けることを推奨します。
注意: beginPaint() の後には必ずendPaint() を続けなければなりません。ネスティングは現在サポートされていません。
注意 :rt は、カラーアタッチメントとデプスアタッチメントの両方を持つことが期待されます。複数のカラー・アタッチメントがある場合、アタッチメント 0 のカラー・バッファのみが書き込まれます。QCanvasPainter は、デプス・ステンシル・バッファの存在を必要とします。現在はステンシルだけが利用され、深度テストと書き込みは常に無効です。
注: 関連するQRhi はフレームを記録している必要があります (QRhi::beginFrame() またはQRhi::beginOffscreenFrame() が呼び出されている必要があります)が、この関数が呼び出されたときにレンダーパスの記録状態であってはなりません。
flags は、レンダリングを制御するオプションのフラグを指定します。
これはオーバーロードされた関数です。
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &fillColor = Qt::black, QSize logicalSize = QSize(), float dpr = 1.0f, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
レンダーターゲットrt にペイントを開始し、コマンドバッファcb にレンダリングコマンドを記録する。
fillColor は、カラーバッファのクリアに使用する色を指定します。endPaint() のフラグにEndPaintFlag::DoNotRecordRenderPass が含まれている場合、この値は無視される。
注意: beginPaint() の後には必ずendPaint() を続けなければならない。ネスティングは現在サポートされていません。
注意 :rt は、色と深度ステンシルの両方のアタッチメントを持つことが期待される。複数のカラー・アタッチメントがある場合、アタッチメント 0 のカラー・バッファのみが書き込まれます。QCanvasPainter は、デプス・ステンシル・バッファの存在を必要とします。現在はステンシルだけが利用され、深度テストと書き込みは常に無効です。
logicalSize はオプションです。空でない場合、ビューポートサイズを論理単位で指定します。dpr 、logicalSize を内部でピクセルに変換できるように、スケールファクター(デバイスのピクセル比)を指定する必要があります。実際には、レンダーターゲットのサイズがデフォルトで自動的に使用されるため、この指定が必要になることはほとんどありません。
注意: 関連するQRhi はフレームを記録している必要があります (QRhi::beginFrame() またはQRhi::beginOffscreenFrame() が呼び出されている必要があります)が、この関数が呼び出されたときにレンダーパスの記録状態であってはなりません。
flags は、レンダリングを制御するオプションのフラグを指定します。
これはオーバーロードされた関数です。
void QCanvasRhiPaintDriver::endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {})
QCanvasPainter 描画コマンドによって生成されたすべてのQRhi レンダリングをフラッシュし、記録します。
デフォルトでは、この関数は完全なレンダリングパスを記録します。つまり、内部的にQRhiCommandBuffer::beginPass() とQRhiCommandBuffer::endPass() を呼び出します。クリアカラーは、beginPaint() の fillColor 引数、またはオフスクリーンキャンバスの塗りつぶしカラーで指定します。
flags endPaint()がbeginPass()-endPass()シーケンス全体を発行するのは望ましくない場合があるためです。
次の2つのスニペットは、結果に関しては同じですが、アプリケーションが同じレンダーパスの中でより多くのことを行いたい場合に備えて、2番目のスニペットはより柔軟性を提供します:
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();
beginPaint() とrenderPaint()も参照してください 。
void QCanvasRhiPaintDriver::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
canvas に対してテクスチャのリードバック要求を発行します。
callback この関数は、QRhi と 3D API の実装に応じて、関数が戻る前に呼び出されるか、後に呼び出されます。テクスチャコンテンツのリードバックは、GPU アーキテクチャによっては GPU->CPU コピーを伴う場合があります。
この関数は、beginPaint ()-endPaint ()ブロック内でも、外でも呼び出すことができます。外部で呼び出された場合、内部的にQRhi::beginOffscreenFrame() などが呼び出され、いつでもグラブを実行できるようになります。
void QCanvasRhiPaintDriver::renderPaint()
QCanvasPainter 描画コマンドによって生成されたすべてのQRhi レンダリングを記録する。この関数は、DoNotRecordRenderPass とともにendPaint() が呼び出された場合にのみ呼び出される。それ以外の場合は呼び出してはならない。
この関数が呼び出されたとき、関連するQRhi はレンダーパスを記録していなければならない。
endPaint()も参照 。
void QCanvasRhiPaintDriver::resetForNewFrame()
ペインターエンジンの状態をリセットします。この関数は、通常QRhi::beginFrame() や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.