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, QColor fillColor = Qt::black, QSize logicalSize = QSize(), qreal dpr = 1.0, QCanvasRhiPaintDriver::BeginPaintFlags flags = {}) |
| void | endPaint(QCanvasRhiPaintDriver::EndPaintFlags flags = {}) |
| void | grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback) |
| void | renderPaint() |
| void | resetForNewFrame() |
詳細な説明
QCanvasPainter を使用して、QRhiTexture などのQRhi ベースのレンダリングターゲット、あるいはQRhiSwapChain のカラーバッファにレンダリングを行うアプリケーションは、QCanvasPainterFactory を使用して、QRhi に関連付けられたQCanvasPainter および 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 | その後、renderPaint() が明示的に呼び出されるため、QCanvasPainter によって生成されたコマンドのフラッシュや、QRhi によるレンダリングパスの記録は不要であることを示します。 |
EndPaintFlags 型は、QFlags<EndPaintFlag> の typedef です。EndPaintFlag 値の OR 組み合わせを格納します。
メンバ関数のドキュメント
void QCanvasRhiPaintDriver::beginPaint(QCanvasOffscreenCanvas &canvas, QRhiCommandBuffer *cb, QCanvasRhiPaintDriver::BeginPaintFlags flags = {})
指定されたオフスクリーンcanvas への描画を開始し、レンダリングコマンドをコマンドバッファcb に記録します。
注:beginPaint () の後には、必ずendPaint() が続く必要があります。現在、ネストはサポートされていません。
QCanvasOffscreenCanvas::Flag::PreserveContents フラグが設定されていない限り、fill color set on the 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 ベースのレンダリングを実装する際に、Qt Quick のモデルビュー投影行列を渡すことが挙げられます。
ビューポートのサイズとデバイスピクセル比は、レンダリングターゲットから取得されます。
このオーバーロードは、実際にはフラグ `EndPaintFlag::DoNotRecordRenderPass ` が設定された `endPaint()` が後に続くことが想定されているため、塗りつぶし色を受け取りません。
注: カスタム行列を使用する場合、クリッピングのサポートは 制限されます。行列が、スケーリングや回転を追加しない正射影を指定している場合、長方形の非変換クリップがサポートされます。このモードでは、クリッピングに依存した描画は避けることが一般的に推奨されます。
注:beginPaint () の後には、必ずendPaint() が続く必要があります。現在、ネストはサポートされていません。
注: rt には、 カラーアタッチメントと深度・ステンシルアタッチメントの両方が存在することが想定されています。複数のカラーアタッチメントが存在する場合、アタッチメント0のカラーバッファのみが書き込まれます。QCanvasPainter では、深度・ステンシルバッファの存在が必須です。現在はステンシルのみが利用され、深度テストおよび書き込みは常に無効化されています。
注:関連する QRhi は フレームを記録中である必要があります(QRhi::beginFrame() またはQRhi::beginOffscreenFrame() が呼び出されていること)、ただし、この関数が呼び出される時点では、レンダリングパスの記録状態になっていてはなりません。
flags レンダリングを制御するオプションのフラグを指定します。
これはオーバーロードされた関数です。
void QCanvasRhiPaintDriver::beginPaint(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, QColor fillColor = Qt::black, QSize logicalSize = QSize(), qreal dpr = 1.0, 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()も参照してください 。
template <typename Functor> void QCanvasRhiPaintDriver::grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)
canvas に対してテクスチャの読み出し要求を発行し、それをcontext と関連付けます。
callback この関数は、関数が戻る前、あるいはそれ以降に呼び出されます。これは、基盤となるQRhi および3D APIの実装によって異なります。テクスチャ内容の読み出しには、GPUアーキテクチャによってはGPU→CPU間のコピーが含まれる場合があります。この関数はconst QImage & 引数を1つ受け取り、move専用を含む任意のファンクタを指定できます。
読み込みが完了する前にcontext が破棄された場合、グラブはキャンセルされ、callback は呼び出されません。これにより、コールバック関数内で、保留中の読み込みが完了する前に存在しなくなる可能性のあるオブジェクトを参照しても安全です。
この関数は、beginPaint() -endPaint() ブロック内でも、その外でも呼び出すことができます。外から呼び出された場合、内部でQRhi::beginOffscreenFrame() などが呼び出されるため、いつでもグラブを実行することが可能です。
たとえば、以下のコードは、画面外にあるキャンバスの内容を PNG ファイルに保存します:
void QCanvasRhiPaintDriver::renderPaint()
QCanvasPainter 描画コマンドによって生成されたすべてのQRhi レンダリングを記録します。この関数は、endPaint()がDoNotRecordRenderPass で呼び出された場合にのみ呼び出してください。それ以外の場合は、決して呼び出してはなりません。
この関数が呼び出される際、関連する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.