QQuickRhiItemRenderer Class
QQuickRhiItemRendererは、QQuickRhiItem のレンダリングロジックを実装しています。
ヘッダー | #include <QQuickRhiItemRenderer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
以来: | Qt 6.7 |
ステータス | 暫定版 |
このクラスは開発中であり、変更される可能性があります。
パブリック関数
QQuickRhiItemRenderer() | |
virtual | ~QQuickRhiItemRenderer() |
保護された関数
QRhiTexture * | colorTexture() const |
QRhiRenderBuffer * | depthStencilBuffer() const |
virtual void | initialize(QRhiCommandBuffer *cb) = 0 |
QRhiRenderBuffer * | msaaColorBuffer() const |
virtual void | render(QRhiCommandBuffer *cb) = 0 |
QRhiRenderTarget * | renderTarget() const |
QRhiTexture * | resolveTexture() const |
QRhi * | rhi() const |
virtual void | synchronize(QQuickRhiItem *item) = 0 |
void | update() |
詳細な説明
注: QQuickRhiItem と QQuickRhiItemRenderer は Qt 6.7 の技術プレビューです。APIは開発中であり、変更される可能性があります。
QQuickRhiItem およびQRhiも参照してください 。
メンバ関数のドキュメント
QQuickRhiItemRenderer::QQuickRhiItemRenderer()
新しいレンダラーを構築します。
この関数は、GUIスレッドがブロックされているときに、シーングラフの同期フェーズでレンダリングスレッドで呼び出されます。
QQuickRhiItem::createRenderer()も参照してください 。
[virtual noexcept]
QQuickRhiItemRenderer::~QQuickRhiItemRenderer()
レンダラーは、QQuickRhiItem アイテムのシーン グラフ リソースがクリーンアップされると自動的に削除されます。
この関数は、レンダリング スレッドで呼び出されます。
特定の条件下では、レンダラー オブジェクトが破棄され、その後再作成されることは正常であり、期待されています。これは、レンダラーの寿命が実質的に基礎となるシーン グラフ ノードに従うためです。たとえば、QQuickRhiItem オブジェクトの親を変更して別のQQuickWindow に属するようにすると、ウィンドウの変更に伴ってシーン グラフ ノードがすべて削除され、再作成されます。これには、QQuickRhiItemRenderer の削除と新規作成も含まれます。
QRhiWidget とは異なり、QQuickRhiItemRenderer では、QRhi を介して作成されたグラフィック・リソースを解放(または早期解放)するための追加コード・パスを実装する必要はありません。デストラクタですべてを解放するか、スマート・ポインタに依存すれば十分です。
[protected]
QRhiTexture *QQuickRhiItemRenderer::colorTexture() const
アイテムのカラーバッファとして機能するテクスチャを返します。
initialize() とrender() からのみ呼び出す必要があります。
深度ステンシルバッファやQRhiRenderTarget とは異なり、このテクスチャは常に利用可能であり、isAutoRenderTargetEnabled の値とは無関係にQQuickRhiItem によって管理されます。
注: sampleCount が 1 より大きく、マルチサンプル・アンチエイリアスが有効になっている場合、返り値はnullptr
になります。代わりに、msaaColorBuffer() を呼び出してQRhiRenderBuffer を照会します。
注: バッキングテクスチャサイズとサンプルカウントは、renderTarget ()から返されるQRhiRenderTarget 。これは、マルチサンプリングが使用されているかどうかに関係なく動作するため、QRhiTexture またはQRhiRenderBuffer からクエリするよりも便利でコンパクトです。
msaaColorBuffer()、depthStencilBuffer()、renderTarget()、resolveTexture()も参照の こと。
[protected]
QRhiRenderBuffer *QQuickRhiItemRenderer::depthStencilBuffer() const
アイテムのレンダリングで使用される深度ステンシルバッファを返します。
initialize() およびrender() からのみ呼び出されなければならない。
isAutoRenderTargetEnabled がtrue
のときのみ利用可能。それ以外の場合、返される値はnullptr
であり、深度ステンシルバッファとQRhiTextureRenderTarget を作成し管理するのはinitialize() の再実装に任されています。
colorTexture() およびrenderTarget()も参照してください 。
[pure virtual protected]
void QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb)
アイテムが初めて初期化されたとき、関連するテクスチャのサイズ、フォーマット、サンプルカウントが変更されたとき、またはQRhi やテクスチャが何らかの理由で変更されたときに呼び出されます。この関数は、render() のレンダリングコードで使用されるグラフィックリソースを維持(まだ作成されていない場合は作成、サイズが変更された場合は調整と再構築)することが期待されます。
QRhi 、QRhiTexture 、その他の関連オブジェクトに問い合わせるには、rhi ()、colorTexture ()、depthStencilBuffer ()、renderTarget ()を呼び出す。
アイテム・サイズが変更されると、QRhi オブジェクト、カラー・バッファ・テクスチャ、および深度ステンシル・バッファ・オブジェクトは、すべて以前と同じインスタンスになります(したがって、ゲッターは同じポインタを返します)が、カラー・バッファと深度/ステンシル・バッファはおそらく再構築されているはずです。つまり、size と基盤となるネイティブ・テクスチャ・リソースは、前回の呼び出し時とは異なる可能性があります。
再実装はまた、QRhi オブジェクトとカラーバッファのテクスチャがこの関数の呼び出しの間に変更されるかもしれないことを準備する必要があります。たとえば、アイテムが新しいQQuickWindow に属するように再レンタリングされた場合、QRhi とQQuickRhiItem によって管理されるすべての関連リソースは、この関数の次の呼び出しで以前とは異なるインスタンスになります。このとき、サブクラスによって以前に作成された既存のQRhi リソースはすべて破棄されることが重要です。なぜなら、これらのリソースは以前のQRhi に属しており、もう使用されるべきでないからです。
isAutoRenderTargetEnabled がtrue
である場合(これがデフォルト)、colorTexture() (またはmsaaColorBuffer() )とデプスステンシル・バッファに関連付けられたデプスステンシルQRhiRenderBuffer とデプスステンシル・バッファQRhiTextureRenderTarget が自動的に作成され、管理されます。initialize()およびrender()の再実装は、depthStencilBuffer()およびrenderTarget()を介して、これらのオブジェクトに問い合わせることができます。isAutoRenderTargetEnabled がfalse
に設定されると、これらのオブジェクトは自動的に作成および管理されなくなります。むしろ、initialize() の実装が、適切と思われるようにバッファを作成し、レンダー・ターゲットを設定することになります。レンダー・ターゲットのために追加のカラー・アタッチメントやデプス・スタ ン・アタッチメントを手動で管理する場合、それらのサイズとサンプル・カウントは常にcolorTexture() (またはmsaaColorBuffer()) のサイズとサンプル・カウントに従う必要があります。
サブクラスで作成されたグラフィックリソースは、サブクラスのデストラクタ実装で解放されることが期待されます。
cb は現在のフレームの です。この関数は、フレームが記録されている状態で呼び出されますが、アクティブなレンダーパスはありません。コマンドバッファは主に、 () に延期することなく をエンキューできるようにするために提供されます。QRhiCommandBuffer render resource updates
この関数は、レンダリングスレッドがあれば、そのスレッド上で呼び出される。
render()も参照 。
[protected]
QRhiRenderBuffer *QQuickRhiItemRenderer::msaaColorBuffer() const
アイテムのマルチサンプルカラーバッファとして機能するレンダーバッファを返します。
initialize() とrender() からのみ呼び出されなければならない。
sampleCount が 1 より大きく、マルチサンプル アンチエイリアシングが有効な場合、返されるQRhiRenderBuffer は一致するサンプルカウントを持ち、カラーバッファとして機能します。このバッファへのレンダリングに使用されるグラフィックパイプラインは、同じサンプルカウントで作成されなければならず、デプスステンシルバッファのサンプルカウントも一致しなければなりません。マルチサンプルのコンテンツは、resolveTexture ()から返されるテクスチャに解決されることが期待されます。isAutoRenderTargetEnabled がtrue
の場合、renderTarget() は、カラーアタッチメント 0 のrenderbuffer として msaaColorBuffer() を設定し、そのresolveTexture としてresolveTexture() を設定することで、これを行うように自動的に設定されます。
MSAAが使用されていない場合、戻り値はnullptr
。その場合は、代わりにcolorTexture() を使用してください。
基礎となる 3D グラフィックス API によっては、サンプル数が 1 より大きいマルチサンプルテクスチャとカラーレンダーバッファの間に実用的な違いがない場合があります (QRhi は、両方を同じネイティブリソースタイプにマッピングするだけかもしれません )。しかし、古い API の中には、テクスチャとレンダーバッファを区別するものもあります。マルチサンプルレンダーバッファは利用できるが、マルチサンプルテクスチャは利用できないOpenGL ES 3.0をサポートするために、QQuickRhiItem 、常にマルチサンプルQRhiRenderBuffer をカラーアタッチメントとして使用してMSAAを実行します(決してマルチサンプルQRhiTexture )。
注意: バッキングテクスチャのサイズとサンプル数は、renderTarget() から返されるQRhiRenderTarget を介してクエリすることもできます。これは、マルチサンプリングが使用されているかどうかに関係なく動作するため、QRhiTexture またはQRhiRenderBuffer からクエリするよりも便利でコンパクトです。
colorTexture()、depthStencilBuffer()、renderTarget()、resolveTexture()も参照の こと。
[pure virtual protected]
void QQuickRhiItemRenderer::render(QRhiCommandBuffer *cb)
バッキングカラーバッファの内容を更新する必要があるときに呼び出される。
この関数が呼ばれる前に、initialize()が少なくとも1回呼び出されます。
更新を要求するには、メイン/GUI スレッド上の QML または C++ コードから呼び出す場合はQQuickItem::update() を、QQuickRhiItemRenderer コールバック内から呼び出す場合はupdate() を呼び出します。render() 内からQQuickRhiItemRenderer のupdate() を呼び出すと、連続的に更新がトリガーされます。
cb は現在のフレームの です。この関数は、フレームが記録されている状態で呼び出されますが、アクティブなレンダーパスはありません。QRhiCommandBuffer
この関数は、レンダリングスレッドがある場合は、そのスレッドで呼び出されます。
initialize() およびsynchronize()も参照してください 。
[protected]
QRhiRenderTarget *QQuickRhiItemRenderer::renderTarget() const
render() の再実装において、QRhiCommandBuffer::beginPass() と共に使用しなければならないレンダーターゲットオブジェクトを返す。
initialize() およびrender() からのみ呼び出す必要があります。
isAutoRenderTargetEnabled がtrue
の場合のみ使用可能。それ以外の場合、返される値はnullptr
であり、デプスステンシル・バッファとQRhiTextureRenderTarget を作成し管理するのはinitialize() の再実装に任されている。
graphics pipelines を作成する際には、QRhiRenderPassDescriptor が必要である。これは、renderPassDescriptor()を呼び出すことで、返されたQRhiTextureRenderTarget から問い合わせることができる。
注: 返されたQRhiTextureRenderTarget は、常に1
のdevicePixelRatio() を報告します。これは、テクスチャではなく、スワップチェインと関連するウィンドウだけがデバイスピクセル比の概念を持ち、ここでのレンダーターゲットは常にテクスチャを参照するためです。画面上のスケールファクターがレンダリングに関連する場合は、アイテムのwindow()->effectiveDevicePixelRatio()
を介して、synchronize() に照会して保存します。その際、基本クラスのdevicePixelRatio() よりもeffectiveDevicePixelRatio() を使用することを常に推奨します。
colorTexture(),depthStencilBuffer(),QQuickWindow::effectiveDevicePixelRatio()も参照してください 。
[protected]
QRhiTexture *QQuickRhiItemRenderer::resolveTexture() const
マルチサンプルコンテンツが解決される非マルチサンプルテクスチャを返します。
マルチサンプルアンチエイリアスが有効でない場合、結果はnullptr
になります。
initialize() およびrender() からのみ呼び出す必要があります。
MSAA が有効な場合、これは、Qt Quick のメイン レンダー パスでクワッドをテクスチャリングするときに、アイテムの基礎となるシーン グラフ ノードによって使用されるテクスチャです。ただし、QQuickRhiItemRenderer のレンダリングは、msaaColorBuffer ()から返される(マルチサンプル)QRhiRenderBuffer をターゲットにする必要があります。isAutoRenderTargetEnabled がtrue
の場合、これはrenderTarget() から返されるQRhiRenderTarget によって処理される。そうでない場合、カラーバッファと resolve テクスチャの両方を持つレンダーターゲットオブジェクトを正しく設定するのは、サブクラスのコード次第です。
colorTexture()も参照してください 。
[protected]
QRhi *QQuickRhiItemRenderer::rhi() const
現在のQRhi オブジェクトを返す。
initialize() およびrender() からのみ呼び出されなければならない。
[pure virtual protected]
void QQuickRhiItemRenderer::synchronize(QQuickRhiItem *item)
この関数は、レンダースレッドがある場合、メイン/GUIスレッドがブロックされている間にレンダースレッド上で呼び出される。この関数は the item's synchronize stepから呼び出され、メインスレッドとレンダースレッドに属するデータの読み書きができます。通常、QQuickRhiItem に格納されたプロパティ値は、QQuickRhiItemRenderer にコピーされます。これにより、レンダー スレッドとメイン スレッドが並行して作業を続けるときに、render() で安全に読み取ることができます。
initialize() およびrender()も参照してください 。
[protected]
void QQuickRhiItemRenderer::update()
オフスクリーンのカラーバッファの内容を更新する必要があるときに、この関数を呼び出します。(すなわち、render()が再度呼び出されるように要求する。この呼び出しは後の時点で発生し、更新は通常、プレゼンテーション・レートにスロットルされることに注意)
この関数は、render()から呼び出して、更新を予約することができる。
注: この関数はレンダラー内部から使用する必要があります。GUIスレッドでアイテムを更新するには、QQuickRhiItem::update ()を使用します。
© 2025 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.