QSGRenderNode Class▲
-
Header: QSGRenderNode
-
CMake:
find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
-
qmake: QT += quick
-
Inherits: https://
-
Inherited By:
Detailed Description▲
https:// allows creating scene graph nodes that perform their own custom rendering via https:// (the common approach from Qt 6.6 on), directly via a 3D graphics API such as OpenGL, Vulkan, or Metal, or, when the software backend is in use, via https://.
https:// is the enabler for one of the three ways to integrate custom 2D/3D rendering into a Qt Quick scene. The other two options are to perform the rendering before or after the Qt Quick scene's own rendering, or to generate a whole separate render pass targeting a dedicated render target (a texture) and then have an item in the scene display the texture. The https://-based approach is similar to the former, in the sense that no additional render passes or render targets are involved, and allows injecting custom rendering commands "inline" with the Qt Quick scene's own rendering.
See Also▲
See also https://
Member Type Documentation▲
enum QSGRenderNode::RenderingFlag▲
flags QSGRenderNode::RenderingFlags
Possible values for the bitmask returned from https://().
|
Constant |
Value |
Description |
|---|---|---|
|
https://::BoundedRectRendering |
0x01 |
Indicates that the implementation of https://() does not render outside the area reported from https://() in item coordinates. Such node implementations can lead to more efficient rendering, depending on the scenegraph backend. For example, the software backend can continue to use the more optimal partial update path when all render nodes in the scene have this flag set. |
|
https://::DepthAwareRendering |
0x02 |
Indicates that the implementations of https://() conforms to scenegraph expectations by only generating a Z value of 0 in scene coordinates which is then transformed by the matrices retrieved from https://() and https://(), as described in the notes for https://(). Such node implementations can lead to more efficient rendering, depending on the scenegraph backend. For example, the batching OpenGL renderer can continue to use a more optimal path when all render nodes in the scene have this flag set. |
|
https://::OpaqueRendering |
0x04 |
Indicates that the implementation of https://() writes out opaque pixels for the entire area reported from https://(). By default the renderers must assume that https://() can also output semi or fully transparent pixels. Setting this flag can improve performance in some cases. |
|
https://::NoExternalRendering |
0x08 |
Indicates that the implementation of https://() and https://() use the https:// family of APIs, instead of directly calling a 3D API such as OpenGL, Vulkan, or Metal. |
The RenderingFlags type is a typedef for https://<RenderingFlag>. It stores an OR combination of RenderingFlag values.
See Also▲
See also https://(), https://(), https://(), https://
enum QSGRenderNode::StateFlag▲
flags QSGRenderNode::StateFlags
This enum is a bit mask identifying several states.
|
Constant |
Value |
Description |
|---|---|---|
|
https://::DepthState |
0x01 |
Depth |
|
https://::StencilState |
0x02 |
Stencil |
|
https://::ScissorState |
0x04 |
Scissor |
|
https://::ColorState |
0x08 |
Color |
|
https://::BlendState |
0x10 |
Blend |
|
https://::CullState |
0x20 |
Cull |
|
https://::ViewportState |
0x40 |
View poirt |
|
https://::RenderTargetState |
0x80 |
Render target |
The StateFlags type is a typedef for https://<StateFlag>. It stores an OR combination of StateFlag values.
Member Function Documentation▲
[override virtual] QSGRenderNode::~QSGRenderNode()▲
Destructs the render node. Derived classes are expected to perform cleanup similar to https://() in here.
When a low-level graphics API is in use, the scenegraph will make sure there is a CPU-side wait for the GPU to complete all work submitted to the scenegraph's graphics command queue before the scenegraph's nodes are deleted. Therefore there is no need to issue additional waits here, unless the https://() implementation is using additional command queues.
With https:// and resources such as https://, https://, https://, etc., it is often good practice to use smart pointers, such as std::unique_ptr, which can often avoid the need to implement a destructor, and lead to more compact source code. Keep in mind however that implementing https://(), most likely issuing a number of reset() calls on the unique_ptrs, is still important.
See Also▲
See also https://()
[virtual] QSGRenderNode::StateFlags QSGRenderNode::changedStates() const▲
When the underlying rendering API is OpenGL, this function should return a mask where each bit represents graphics states changed by the https://() function:
|
Constant |
Description |
|---|---|
|
DepthState |
depth write mask, depth test enabled, depth comparison function |
|
StencilState |
stencil write masks, stencil test enabled, stencil operations, stencil comparison functions |
|
ScissorState |
scissor enabled, scissor test enabled |
|
ColorState |
clear color, color write mask |
|
BlendState |
blend enabled, blend function |
|
CullState |
front face, cull face enabled |
|
ViewportState |
viewport |
|
RenderTargetState |
render target |
With APIs other than OpenGL, the only relevant values are the ones that correspond to dynamic state changes recorded on the command list/buffer. For example, RSSetViewports, RSSetScissorRects, OMSetBlendState, OMSetDepthStencilState in case of D3D11, or vkCmdSetViewport, vkCmdSetScissor, vkCmdSetBlendConstants, vkCmdSetStencilRef in case of Vulkan, and only when such commands were added to the scenegraph's command list queried via the QSGRendererInterface::CommandList resource enum. States set in pipeline state objects do not need to be reported here. Similarly, draw call related settings (pipeline states, descriptor sets, vertex or index buffer bindings, root signature, descriptor heaps, etc.) are always set again by the scenegraph so https://() can freely change them.
https:// is no longer supported with APIs like Vulkan. This is by nature. https://() is invoked while the Qt Quick scenegraph's main command buffer is recording a renderpass, so there is no possibility of changing the target and starting another renderpass (on that command buffer at least). Therefore returning a value with https:// set is not sensible.
The software backend exposes its https:// and saves and restores before and after invoking https://(). Therefore reporting any changed states from here is not necessary.
The function is called by the renderer so it can reset the states after rendering this node. This makes the implementation of https://() simpler since it does not have to query and restore these states.
The default implementation returns 0, meaning no relevant state was changed in https://().
This function may be called before https://().
With Qt 6 and https://-based rendering the only relevant values are https:// and https://. Other values can be returned but are ignored in practice.
const QSGClipNode *QSGRenderNode::clipList() const▲
Returns the current clip list.
[since 6.6] QRhiCommandBuffer *QSGRenderNode::commandBuffer() const▲
Returns the current command buffer.
This function was introduced in Qt 6.6.
See Also▲
See also https://()
[virtual] QSGRenderNode::RenderingFlags QSGRenderNode::flags() const▲
Returns flags describing the behavior of this render node.
The default implementation returns 0.
See Also▲
See also https://, https://()
qreal QSGRenderNode::inheritedOpacity() const▲
Returns the current effective opacity.
const QMatrix4x4 *QSGRenderNode::matrix() const▲
Returns pointer to the current model-view matrix.
[virtual, since 6.0] void QSGRenderNode::prepare()▲
Called from the frame preparation phase. There is a call to this function before each invocation of https://().
Unlike https://(), this function is called before the scenegraph starts recording the render pass for the current frame on the underlying command buffer. This is useful when doing rendering with graphics APIs, such as Vulkan, where copy type of operations will need to be recorded before the render pass.
The default implementation is empty.
When implementing a https:// that uses https:// to render, query the https:// object from the https:// via https://(). To get a https:// for submitting work to, call https://(). To query information about the active render target, call https://(). See the https:// example for details.
This function was introduced in Qt 6.0.
[since 6.5] const QMatrix4x4 *QSGRenderNode::projectionMatrix() const▲
Returns pointer to the current projection matrix.
In https://() this is the same matrix that is returned from https://(). This getter exists so that https://() also has a way to query the projection matrix.
When working with a modern graphics API, or Qt's own graphics abstraction layer, it is more than likely that one will want to load *projectionMatrix() * *matrix() into a uniform buffer. That is however something that needs to be done in https://(), so outside the recording of a render pass. That is why both matrices are queriable directly from the https://, both in https://() and https://().
This function was introduced in Qt 6.5.
[virtual] QRectF QSGRenderNode::rect() const▲
Returns the bounding rectangle in item coordinates for the area https://() touches. The value is only in use when https://() includes https://, ignored otherwise.
Reporting the rectangle in combination with https:// is particularly important with the software backend because otherwise having a rendernode in the scene would trigger fullscreen updates, skipping all partial update optimizations.
For rendernodes covering the entire area of a corresponding https:// the return value will be (0, 0, item->https://, item->https://).
Nodes are also free to render outside the boundaries specified by the item's width and height, since the scenegraph nodes are not bounded by the https:// geometry, as long as this is reported correctly from this function.
See Also▲
See also https://()
[virtual] void QSGRenderNode::releaseResources()▲
This function is called when all custom graphics resources allocated by this node have to be freed immediately. In case the node does not directly allocate graphics resources (buffers, textures, render targets, fences, etc.) through the graphics API that is in use, there is nothing to do here.
Failing to release all custom resources can lead to incorrect behavior in graphics device loss scenarios on some systems since subsequent reinitialization of the graphics system may fail.
Some scenegraph backends may choose not to call this function. Therefore it is expected that https:// implementations perform cleanup both in their destructor and in releaseResources().
Unlike with the destructor, it is expected that https://() can reinitialize all resources it needs when called after a call to releaseResources().
With OpenGL, the scenegraph's OpenGL context will be current both when calling the destructor and this function.
[pure virtual] void QSGRenderNode::render(const QSGRenderNode::RenderState *state)▲
This function is called by the renderer and should paint this node with directly invoking commands in the graphics API (OpenGL, Direct3D, etc.) currently in use.
The effective opacity can be retrieved with https://().
The projection matrix is available through state, while the model-view matrix can be fetched with https://(). The combined matrix is then the projection matrix times the model-view matrix. The correct stacking of the items in the scene is ensured by the projection matrix.
When using the provided matrices, the coordinate system for vertex data follows the usual https:// conventions: top-left is (0, 0), bottom-right is the corresponding https://'s https:// and https:// minus one. For example, assuming a two float (x-y) per vertex coordinate layout, a triangle covering half of the item can be specified as (width - 1, height - 1), (0, 0), (0, height - 1) using counter-clockwise direction.
https:// is provided as a means to implement custom 2D or 2.5D Qt Quick items. It is not intended for integrating true 3D content into the Qt Quick scene. That use case is better supported by https://, https://(), or the equivalents of those for APIs other than OpenGL.
https:// can perform significantly better than texture-based approaches (such as, https://), especially on systems where the fragment processing power is limited. This is because it avoids rendering to a texture and then drawing a textured quad. Rather, https:// allows recording draw calls in line with the scenegraph's other commands, avoiding an additional render target and the potentially expensive texturing and blending.
Clip information is calculated before the function is called. Implementations wishing to take clipping into account can set up scissoring or stencil based on the information in state. The stencil buffer is filled with the necessary clip shapes, but it is up to the implementation to enable stencil testing.
Some scenegraph backends, software in particular, use no scissor or stencil. There the clip region is provided as an ordinary https://.
When implementing a https:// that uses https:// to render, query the https:// object from the https:// via https://(). To get a https:// for submitting work to, call https://(). To query information about the active render target, call https://(). See the https:// example for details.
With Qt 6 and its https://-based scene graph renderer, no assumptions should be made about the active (OpenGL) state when this function is called, even when OpenGL is in use. Assume nothing about the pipelines and dynamic states bound on the command list/buffer when this function is called.
Depth writes are expected to be disabled. Enabling depth writes can lead to unexpected results, depending on the scenegraph backend in use and the content in the scene, so exercise caution with this.
In Qt 6, https://() has limited use. See the documentation for https://() for more information.
With some graphics APIs, including when using https:// directly, it can be necessary to reimplement https://() in addition, or alternatively connect to the https://() signal. These are called/emitted before recording the beginning of a renderpass on the command buffer (vkCmdBeginRenderPass with Vulkan, or starting to encode via MTLRenderCommandEncoder in case of Metal. Recording copy operations cannot be done inside render() with such APIs. Rather, do such operations either in https://() or the slot connected to beforeRendering (with DirectConnection).
See Also▲
See also https://, https://()
[since 6.6] QRhiRenderTarget *QSGRenderNode::renderTarget() const▲
Returns the current render target.
This is provided mainly to enable https://() and https://() implementations that use https:// accessing the https://'s https:// or pixel size.
To build a https://, which implies having to provide a https://, query the renderPassDescriptor from the render target. Be aware however that the render target may change over the lifetime of the custom https:// and the https://. For example, consider what happens when dynamically setting layer.enabled: true on the item or an ancestor of it: this triggers rendering into a texture, not directly to the window, which means the https:// is going to work with a different render target from then on. The new render target may then have a different pixel format, which can make already built graphics pipelines incompatible. This can be handled with logic such as the following:
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();
}This function was introduced in Qt 6.6.
See Also▲
See also https://()


