QSGRenderNode Class

QSGRenderNodeクラスは、scenegraphで使用されているグラフィックスAPIをターゲットとしたカスタムレンダリングコマンドのセットを表します。詳細...

ヘッダー #include <QSGRenderNode>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
継承: QSGNode

パブリックな型

struct RenderState
enum RenderingFlag { BoundedRectRendering, DepthAwareRendering, OpaqueRendering, NoExternalRendering }
flags RenderingFlags
enum StateFlag { ViewportState, ScissorState, DepthState, StencilState, ColorState, …, RenderTargetState }
flags StateFlags

パブリック関数

virtual ~QSGRenderNode() override
virtual QSGRenderNode::StateFlags changedStates() const
const QSGClipNode *clipList() const
(since 6.6) QRhiCommandBuffer *commandBuffer() const
virtual QSGRenderNode::RenderingFlags flags() const
qreal inheritedOpacity() const
const QMatrix4x4 *matrix() const
(since 6.0) virtual void prepare()
(since 6.5) const QMatrix4x4 *projectionMatrix() const
virtual QRectF rect() const
virtual void releaseResources()
virtual void render(const QSGRenderNode::RenderState *state) = 0
(since 6.6) QRhiRenderTarget *renderTarget() const

詳細説明

QSGRenderNode は、QRhi (Qt 6.6 以降の一般的なアプローチ)、OpenGL、Vulkan、Metal などの 3D グラフィックス API を直接介して、またはsoftware バックエンドが使用されている場合はQPainter を介して、独自のカスタムレンダリングを実行するシーングラフノードを作成することができます。

QSGRenderNode は、カスタム 2D/3D レンダリングをQt Quick シーンに統合する 3 つの方法の 1 つです。他の2つのオプションは、before またはafter Qt Quick シーン自身のレンダリングを実行するか、専用のレンダーターゲット(テクスチャ)をターゲットとする全く別のレンダーパスを生成し、シーン内のアイテムにテクスチャを表示させることです。QSGRenderNode ベースのアプローチは、追加のレンダーパスやレンダーターゲットが関与しないという意味で、前者に似ており、Qt Quick シーン自身のレンダリングと「インライン」でカスタムレンダリングコマンドを注入することができます。3つのアプローチの詳細については、Qt Quick Scene Graphを参照してください。

Scene Graph - Custom QSGRenderNodeも参照

メンバ型ドキュメント

enum QSGRenderNode::RenderingFlag
flags QSGRenderNode::RenderingFlags

flags() から返されるビットマスクの可能な値。

定数説明
QSGRenderNode::BoundedRectRendering0x01render() の実装が、アイテム座標でrect() から報告された領域の外側をレンダリングしないことを示します。このようなノードの実装は、scenegraph バックエンドによっては、より効率的なレンダリングにつながります。たとえば、software バックエンドは、シーン内のすべてのレンダーノードにこのフラグが設定されている場合、より最適な部分更新パスを使用し続けることができます。
QSGRenderNode::DepthAwareRendering0x02render ()の実装が、render ()の注釈で説明されているように、RenderState::projectionMatrix ()とmatrix ()から取得されたマトリックスによって変換されるシーン座標で0のZ値のみを生成することによって、シーングラフの期待に準拠していることを示します。このようなノードの実装は、シーングラフバックエンドによっては、より効率的なレンダリングにつながります。たとえば、シーン内のすべてのレンダーノードにこのフラグが設定されている場合、バッチOpenGLレンダラーは、より最適なパスを使用し続けることができます。
QSGRenderNode::OpaqueRendering0x04render ()の実装が、rect ()から報告された領域全体の不透明ピクセルを書き出すことを示します。デフォルトでは、レンダラーは、render ()が半透明または完全な透明ピクセルも出力できることを想定する必要があります。このフラグを設定すると、パフォーマンスが向上する場合がある。
QSGRenderNode::NoExternalRendering0x08prepare() およびrender() の実装が、OpenGL、Vulkan、または Metal などの 3D API を直接呼び出すのではなく、QRhi ファミリーの API を排他的に使用することを示します。

RenderingFlags型はQFlags<RenderingFlag>のtypedefである。レンダリングフラグの値の OR の組み合わせを格納します。

render(),prepare(),rect(),QRhiも参照してください

enum QSGRenderNode::StateFlag
flags QSGRenderNode::StateFlags.

この enum は、changedStates() から返されるビットマスクで使用可能な値を含みます。

定数説明
QSGRenderNode::ViewportState0x40ビューポート
QSGRenderNode::ScissorState0x04シザーテスト有効状態、シザー矩形
QSGRenderNode::DepthState0x01この値は Qt 6 では効果がありません。
QSGRenderNode::StencilState0x02この値は Qt 6 では効果がありません。
QSGRenderNode::ColorState0x08この値は Qt 6 では効果がありません。
QSGRenderNode::BlendState0x10この値は Qt 6 では効果がありません。
QSGRenderNode::CullState0x20この値は Qt 6 では効果がありません。
QSGRenderNode::RenderTargetState0x80この値は Qt 6 では効果がありません。

StateFlags 型はQFlags<StateFlag> の typedef です。StateFlag値のORの組み合わせを格納する。

メンバ関数のドキュメント

[override virtual noexcept] QSGRenderNode::~QSGRenderNode()

レンダー・ノードを破棄します。派生クラスは、ここでreleaseResources() と同様のクリーンアップを実行することが期待される。

QRhiQRhiBufferQRhiTextureQRhiGraphicsPipeline などのリソースでは、std::unique_ptr などのスマートポインタを使用すると、デストラクタを実装する必要がなくなり、よりコンパクトなソースコードになることがよくあります。しかし、releaseResources() を実装することは重要であり、unique_ptrに対する多くのreset()コールを含む可能性があることに留意してください。

releaseResources()も参照のこと

[virtual] QSGRenderNode::StateFlags QSGRenderNode::changedStates() const

この関数は、各ビットがrender() 関数によって変更されたグラフィックスの状態を表すマスクを返す必要があります。

注意: Qt 6 とQRhi ベースのレンダリングでは、関連する値はViewportStateScissorState だけです。他の値を返すこともできますが、実際には無視されます。

定数説明
ViewportStateビューポート
ScissorStateシザーテスト有効状態、シザー矩形
DepthStateこの値は Qt 6 では効果がありません。
StencilStateこの値は Qt 6 では効果がありません。
ColorStateこの値は Qt 6 では効果がありません。
BlendStateこの値は Qt 6 では効果がありません。
CullStateこの値は Qt 6 では効果がありません。
RenderTargetStateこの値は Qt 6 では効果がありません。

注: software バックエンドはQPainter を公開し、render() を呼び出す前後に保存と復元を行います。したがって、ここから変更された状態を報告する必要はありません。

デフォルトの実装は、render() で関連する状態が変更されなかったことを意味する 0 を返します。

注意: この関数は、render() の前に呼び出すことができる。

const QSGClipNode *QSGRenderNode::clipList() const

現在のクリップリストを返します。

[since 6.6] QRhiCommandBuffer *QSGRenderNode::commandBuffer() const

現在のコマンドバッファを返します。

この関数は Qt 6.6 で導入されました。

renderTarget()も参照してください

[virtual] QSGRenderNode::RenderingFlags QSGRenderNode::flags() const

このレンダーノードの動作を表すフラグを返します。

デフォルトの実装は 0 を返します。

RenderingFlag およびrect()も参照してください

qreal QSGRenderNode::inheritedOpacity() const

現在の有効不透明度を返します。

const QMatrix4x4 *QSGRenderNode::matrix() const

現在のモデルビュー行列へのポインタを返します。

[virtual, since 6.0] void QSGRenderNode::prepare()

フレーム準備段階から呼び出される。この関数は、render ()の各呼び出しの前に呼び出されます。

render() とは異なり、この関数は、scenegraph が現在のフレームのレンダーパスを基礎となるコマンドバッファに記録し始める前に呼び出されます。これは、コピータイプの操作がレンダーパスの前に記録される必要がある、VulkanなどのグラフィックスAPIでレンダリングを行う場合に便利です。

デフォルトの実装は空です。

レンダリングにQRhi を使用するQSGRenderNode を実装する場合は、QQuickWindow::rhi() を介してQQuickWindow からQRhi オブジェクトを照会します。作業を提出するためのQRhiCommandBuffer を取得するには、commandBuffer() を呼び出す。アクティブなレンダーターゲットに関する情報を照会するには、renderTarget ()を呼び出します。詳細は{Scene Graph - Custom QSGRenderNode} の例を参照してください。

この関数は Qt 6.0 で導入されました。

[since 6.5] const QMatrix4x4 *QSGRenderNode::projectionMatrix() const

現在の射影行列へのポインタを返します.

render() では,これはRenderState::projectionMatrix() から返される行列と同じものである.このゲッターが存在するのは、prepare() にも投影行列を問い合わせる方法があるためです。

最新のグラフィックスAPIやQt独自のグラフィックス抽象化レイヤで作業する場合、*projectionMatrix() * *matrix() を均一なバッファにロードしたいと思うことが多いでしょう。しかし、これはprepare() で行う必要があるため、レンダリングパスの記録外です。そのため、prepare() とrender() の両方で、QSGRenderNode から直接行列を問い合わせることができます。

この関数は Qt 6.5 で導入されました。

[virtual] QRectF QSGRenderNode::rect() const

render() が触れている領域の外接矩形を項目座標で返す。この値は、flags() がBoundedRectRendering を含む場合にのみ使用され、それ以外の場合は無視されます。

BoundedRectRendering と組み合わせて矩形を報告することは、software バックエンドで特に重要です。なぜなら、シーン内にレンダーノードがあると、フルスクリーン更新がトリガされ、すべての部分更新の最適化がスキップされるからです。

対応するQQuickItem の全領域をカバーするレンダーノードの場合、戻り値は (0, 0, item->width(), item->height()) になります。

注意: シーングラフのノードはQQuickItem ジオメトリに囲まれていないため、アイテムの幅と高さで指定された境界の外側でも、この関数から正しく報告される限り、ノードは自由にレンダリングできます。

flags()も参照してください

[virtual] void QSGRenderNode::releaseResources()

この関数は、このノードによって割り当てられたすべてのカスタムグラフィックリソースを直ちに解放する必要があるときに呼び出されます。ノードが使用中のグラフィックスAPIを通じて直接グラフィックスリソース(バッファ、テクスチャ、レンダーターゲット、フェンスなど)を割り当てていない場合、ここで行うことはありません。

すべてのカスタムリソースの解放に失敗すると、システムによっては、グラフィックスデバイスの損失シナリオで、その後のグラフィックスシステムの再初期化に失敗する可能性があるため、正しくない動作につながる可能性があります。

注意: いくつかのシーングラフバックエンドは、この関数を呼び出さないことを選択するかもしれません。したがって、QSGRenderNode の実装では、デストラクタとreleaseResources()の両方でクリーンアップを実行することが期待されます。

デストラクタとは異なり、releaseResources()を呼び出した後にrender() を呼び出すと、必要なすべてのリソースを再初期化できることが期待されます。

OpenGLでは、シーングラフのOpenGLコンテキストは、デストラクタとこの関数を呼び出すときの両方が最新になります。

[pure virtual] void QSGRenderNode::render(const QSGRenderNode::RenderState *state)

この関数はレンダラーによって呼び出され、QRhi を介して直接コマンドを呼び出すか、基礎となるグラフィックスAPI(OpenGL、Direct3Dなど)を介して直接コマンドを呼び出して、このノードをペイントする必要があります。

有効不透明度はinheritedOpacity() で取得できます。

投影行列はstate で取得でき,モデルビュー行列はmatrix() で取得できます.結合行列は,射影行列にモデルビュー行列を掛けたものになります.シーン内のアイテムの正しいスタッキングは、投影行列によって保証されます。

提供された行列を使用する場合、頂点データの座標系は通常のQQuickItem の規約に従います:左上は (0, 0)、右下は対応するQQuickItem の width() と height() から 1 を引いた値です。例えば、1頂点あたり2浮動小数点(x-y)の座標レイアウトを仮定すると、アイテムの半分をカバーする三角形は、反時計回りで(幅 - 1、高さ - 1)、(0、0)、(0、高さ - 1)と指定できます。

注: QSGRenderNode は、カスタム 2D または 2.5DQt Quick アイテムを実装する手段として提供されます。真の3DコンテンツをQt Quick シーンに統合するためのものではありません。このユースケースは、カスタムレンダリングを統合するための他の方法によってよりよくサポートされています。

注: QSGRenderNode は、特にフラグメントの処理能力が制限されているシステムでは、テクスチャベースのアプローチ(QQuickRhiItem など)よりも大幅に優れたパフォーマンスを発揮します。これは、テクスチャにレンダリングしてからテクスチャ付きの四角形を描画することを避けるためです。むしろ、QSGRenderNode 、シーングラフの他のコマンドと一緒に描画コールを記録することができ、追加のレンダーターゲットや潜在的に高価なテクスチャリングとブレンドを避けることができます。

クリップ情報は、関数が呼び出される前に計算されます。クリッピングを考慮したい実装では、state の情報に基づいて、シザリングまたはステンシルを設定できます。ステンシルバッファは必要なクリップ形状で満たされますが、ステンシルテストを有効にするかどうかは実装次第です。

いくつかのシーングラフバックエンド(特にソフトウェア)は、シザーやステンシルを使用しません。そこでは、クリップ領域は通常のQRegion として提供されます。

レンダリングにQRhi を使用するQSGRenderNode を実装する場合、QQuickWindow::rhi() を介してQQuickWindow からQRhi オブジェクトをクエリします。作業提出用のQRhiCommandBuffer を取得するには、commandBuffer() を呼び出します。アクティブなレンダーターゲットに関する情報を照会するには、renderTarget ()を呼び出します。詳しくは{Scene Graph - Custom QSGRenderNode}の例を参照してください。

Qt 6 とそのQRhi ベースのシーングラフ・レンダラでは、OpenGL が使用中であっても、この関数を呼び出すときに、アクティブな(OpenGL の)状態について仮定すべきではありません。この関数が呼び出されたときに、コマンドリスト/バッファにバインドされているパイプラインと動的な状態については、何も仮定しないでください。

注意: 深度書き込みは無効にすることが期待される。深度書き込みを有効にすると、使用中のシーングラフバックエンドとシーン内のコンテンツによって、予期しない結果になることがあるので、注意してください。

注意: Qt 6 では、changedStates() の使用は制限されています。詳しくはchangedStates() のドキュメントを参照してください。

いくつかのグラフィックスAPIでは、QRhi を直接使用する場合も含めて、prepare() を再実装するか、QQuickWindow::beforeRendering() シグナルに接続する必要があります。これらは、コマンドバッファにレンダーパスの開始を記録する(Vulkanの場合はvkCmdBeginRenderPass、Metalの場合はMTLRenderCommandEncoderを介してエンコードを開始する)前に呼び出され、発信されます。このようなAPIでは、render()内でコピー操作を記録することはできません。そのような操作は、prepare ()か、(DirectConnectionで)beforeRenderingに接続されたスロットで行ってください。

QSGRendererInterface およびQQuickWindow::rendererInterface()も参照のこと

[since 6.6] QRhiRenderTarget *QSGRenderNode::renderTarget() const

現在のレンダーターゲットを返す。

これは主に、QRhiRenderTargetrenderPassDescriptor またはpixel size にアクセスするQRhi を使用するprepare() およびrender() の実装を有効にするために提供される。

QRhiGraphicsPipeline を構築するには、QRhiRenderPassDescriptor を提供する必要があり、レンダーターゲットから renderPassDescriptor を問い合わせる必要がある。QSGRenderNode しかし、レンダーターゲットは、カスタムQQuickItemQSGRenderNode のライフタイムの間に変更される可能性があることに注意してください。たとえば、アイテムまたはその祖先にlayer.enabled: true を動的に設定するときに何が起こるかを考えてみましょう。これは、ウィンドウに直接レンダリングするのではなく、テクスチャにレンダリングすることをトリガーします。新しいレンダーターゲットは異なるピクセルフォーマットを持つ可能性があり、すでに構築されたグラフィックスパイプラインに互換性がなくなる可能性があります。これは次のようなロジックで処理できます:

if (m_pipeline && renderTarget()->renderPassDescriptor()->serializedFormat() != m_renderPassFormat) {
    delete m_pipeline;
    m_pipeline = nullptr;
}
if (!m_pipeline) {
    // Build a new QRhiGraphicsPipeline.
    // ...
    // Store the serialized format for fast and simple comparisons later on.
    m_renderPassFormat = renderTarget()->renderPassDescriptor()->serializedFormat();
}

この関数は Qt 6.6 で導入されました。

commandBuffer()も参照してください

© 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.