QQuickRhiItemRenderer Class
QQuickRhiItemRenderer はQQuickRhiItem のレンダリングロジックを実装します。
Header: | #include <QQuickRhiItemRenderer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
Since: | Qt 6.7 |
Status: | Preliminary |
このクラスは開発中であり、変更される可能性があります。
パブリック関数
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回呼び出される。
更新を要求するには、QMLから呼び出す場合、またはメイン/GUIスレッド上の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 ()を使用してください。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。