QSGRenderNode Class
QSGRenderNode クラスは、シーングラフで使用されているグラフィックス 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は、Qt Quick シーンにカスタム2D/3Dレンダリングを統合する3つの方法のうちの1つを実現するための要素です。 他の2つの選択肢は、before やafter を使用してQt Quick シーン独自のレンダリングを実行する方法、あるいは専用のレンダリングターゲット(テクスチャ)を対象とした完全に独立したレンダリングパスを生成し、シーン内のアイテムにそのテクスチャを表示させる方法です。 QSGRenderNode ベースのアプローチは、追加のレンダリングパスやレンダリングターゲットを必要としないという点で前者に似ており、Qt Quick シーン自身のレンダリングに「インライン」でカスタムレンダリングコマンドを挿入することができます。これら3つのアプローチに関する詳細な説明については、「Qt Quick シーングラフ」を参照してください。
「シーングラフ - カスタム QSGRenderNode」も参照してください 。
メンバ型のドキュメント
enum QSGRenderNode::RenderingFlag
flags QSGRenderNode::RenderingFlags
flags() から返されるビットマスクの取り得る値。
| 定数 | 値 | 説明 |
|---|---|---|
QSGRenderNode::BoundedRectRendering | 0x01 | render() の実装が、rect() から報告された領域の外側を、アイテム座標でレンダリングしないことを示します。このようなノードの実装は、シーングラフバックエンドによっては、より効率的なレンダリングにつながる可能性があります。例えば、software バックエンドでは、シーン内のすべてのレンダリングノードでこのフラグが設定されている場合、より最適な部分更新パスを引き続き使用することができます。 |
QSGRenderNode::DepthAwareRendering | 0x02 | render() の実装が、render() の注記に記載されているように、シーン座標で Z 値を 0 としてのみ生成し、それをRenderState::projectionMatrix() およびmatrix() から取得した行列によって変換することで、シーングラフの期待に準拠していることを示します。このようなノードの実装は、シーングラフのバックエンドによっては、より効率的なレンダリングにつながる可能性があります。 たとえば、シーン内のすべてのレンダリングノードでこのフラグが設定されている場合、バッチ処理を行う OpenGL レンダラーは、より最適なパスを引き続き使用することができます。 |
QSGRenderNode::OpaqueRendering | 0x04 | render() の実装が、rect() から報告された領域全体に対して不透明なピクセルを出力することを示します。デフォルトでは、レンダラーはrender() が半透明または完全に透明なピクセルも出力できると想定する必要があります。このフラグを設定することで、場合によってはパフォーマンスが向上することがあります。 |
QSGRenderNode::NoExternalRendering | 0x08 | prepare() およびrender() の実装が、OpenGL、Vulkan、Metal などの 3D API を直接呼び出すのではなく、QRhi ファミリーの API を排他的に使用することを示します。 |
RenderingFlags 型は、QFlags<RenderingFlag> の typedef です。これは、RenderingFlag 値の論理和(OR)を格納します。
render()、prepare()、rect()、およびQRhiも参照してください 。
enum QSGRenderNode::StateFlag
flags QSGRenderNode::StateFlags
この列挙型には、changedStates() から返されるビットマスクで使用可能な値が含まれています。
| 定数 | 定数名 値 | 説明 |
|---|---|---|
QSGRenderNode::ViewportState | 0x40 | ビューポート |
QSGRenderNode::ScissorState | 0x04 | はさみテスト有効状態、はさみ矩形 |
QSGRenderNode::DepthState | 0x01 | この値は Qt 6 では効果を持ちません。 |
QSGRenderNode::StencilState | 0x02 | この値は Qt 6 では効果を持ちません。 |
QSGRenderNode::ColorState | 0x08 | この値は Qt 6 では効果を持ちません。 |
QSGRenderNode::BlendState | 0x10 | この値は Qt 6 では効果を持ちません。 |
QSGRenderNode::CullState | 0x20 | この値は Qt 6 では効果を持ちません。 |
QSGRenderNode::RenderTargetState | 0x80 | この値は Qt 6 では効果を持ちません。 |
StateFlags 型は、QFlags<StateFlag> の typedef です。StateFlag 値の OR 組み合わせを格納します。
メンバ関数のドキュメント
[override virtual noexcept] QSGRenderNode::~QSGRenderNode()
レンダリングノードを破棄します。派生クラスでは、ここでreleaseResources() と同様のクリーンアップ処理を行うことが想定されています。
QRhi や、QRhiBuffer 、QRhiTexture 、QRhiGraphicsPipeline などのリソースを使用する場合、std::unique_ptr などのスマートポインタを使用することが推奨されることがよくあります。これにより、デストラクタを実装する必要がなくなることが多く、ソースコードをコンパクトにまとめることができます。 ただし、releaseResources() を実装することは、unique_ptr に対する reset() の呼び出しが多数含まれる可能性が高いものの、依然として重要であることを念頭に置いてください。
releaseResources()も参照してください 。
[virtual] QSGRenderNode::StateFlags QSGRenderNode::changedStates() const
この関数は、render() 関数によって変更されたグラフィック状態を各ビットが表すマスクを返す必要があります。
注: Qt 6 および `QRhi` ベースのレンダリングでは 、関連する値は `ViewportState ` および `ScissorState` のみです。他の値を返すこともできますが、実際には無視されます。
| 定数 | 説明 |
|---|---|
ViewportState | ビューポート |
ScissorState | シザーテスト有効状態、シザー矩形 |
DepthState | この値は Qt 6 では何の影響も与えません。 |
StencilState | この値は Qt 6 では効果を持ちません。 |
ColorState | この値は Qt 6 では効果を持ちません。 |
BlendState | この値は Qt 6 では効果を持ちません。 |
CullState | この値は Qt 6 では効果を持ちません。 |
RenderTargetState | この値は Qt 6 では効果を持ちません。 |
デフォルトの実装は 0 を返します。これは、render() において関連する状態が変更されなかったことを意味します。
注:この関数は 、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() とは異なり、この関数は、シーングラフが基になるコマンドバッファ上で現在のフレームのレンダリングパスの記録を開始する前に呼び出されます。これは、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() の両方でクリーンアップを行うことが期待されます。
デストラクタとは異なり、render() は、releaseResources() の呼び出し後に呼び出された場合、必要なすべてのリソースを再初期化できることが期待されます。
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を引いた値となります。 例えば、頂点ごとに2つのfloat型(x-y)座標で構成されるレイアウトを想定した場合、アイテムの半分を覆う三角形は、反時計回りの方向で(width - 1, height - 1)、(0, 0)、(0, height - 1)と指定できます。
注: QSGRenderNode は 、カスタム2Dまたは2.5DのQt 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
現在のレンダリングターゲットを返します。
これは主に、QRhi を使用してQRhiRenderTarget のrenderPassDescriptor またはpixel size にアクセスする、prepare() およびrender() の実装を可能にするために提供されています。
QRhiGraphicsPipeline を構築するには(これにはQRhiRenderPassDescriptor の指定が必要となります)、レンダリングターゲットからrenderPassDescriptorを取得してください。 ただし、カスタムQQuickItem やQSGRenderNode の存続期間中に、レンダリングターゲットが変更される可能性があることに注意してください。例えば、アイテムまたはその祖先に対してlayer.enabled: true を動的に設定した場合を考えてみてください。これにより、ウィンドウへの直接レンダリングではなく、テクスチャへのレンダリングがトリガーされます。つまり、それ以降、QSGRenderNode は異なるレンダリングターゲットで動作することになります。 新しいレンダリングターゲットではピクセルフォーマットが異なる場合があり、その結果、すでに構築済みのグラフィックスパイプラインとの互換性が失われる可能性があります。この問題には、次のようなロジックで対処できます。
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()も参照してください 。
© 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.