Auf dieser Seite

Qt 3D Portierung des Renderers auf RHI

Zur Erinnerung: In Qt 6 verwendet „ Qt 3D “ standardmäßig das RHI-Rendering-Backend.

Die Verwendung des älteren OpenGL-Backends aus der Qt-5-Reihe ist weiterhin möglich. Dies kann durch Setzen der Umgebungsvariable `QT3D_RENDERER` auf `opengl` aktiviert werden. Dies ist erforderlich, falls Sie Ihre Anwendung nicht auf RHI portieren möchten oder falls Sie Funktionen benötigen, die im RHI-Backend derzeit eingeschränkt oder nicht verfügbar sind.

Derzeit sind folgende Einschränkungen bei RHI bekannt:

  • Es gibt keine Möglichkeit für explizites Blit (Sie müssen das Blit manuell durchführen, indem Sie ein Quad in einen Framebuffer rendern)
  • MemoryBarrier kann nicht explizit gesetzt werden
  • Nicht alle Texturformate sind verfügbar
  • „Draw Indirect“ wird derzeit nicht unterstützt
  • Geometrie-Shader werden derzeit nicht unterstützt.
  • Verschiedene RHI-Backends unterstützen möglicherweise unterschiedliche Funktionen.

Bitte achten Sie auch darauf, das OpenGL-Render-Backend von „ Qt 3D “ nicht mit dem RHI-Render-Backend von „ Qt 3D “ zu verwechseln, das auf OpenGL aufsetzt.

RHI ist eine Abstraktion über verschiedene Grafik-APIs. Das bedeutet, dass auf einer bestimmten Plattform mehrere RHI-Instanzen verschiedene Backends nutzen können.

Um RHI zu zwingen, ein bestimmtes Backend zu verwenden, sollte die Umgebungsvariable `QSG_RHI_BACKEND` auf einen der Werte `opengl`, `vulkan`, `metal` oder `directx` gesetzt werden.

RHI-kompatible Techniken hinzufügen

Um einem „ Qt 3D “-Material oder -Effekt RHI-Unterstützung hinzuzufügen, ist eine neue, auf RHI ausgerichtete Technik erforderlich. Zum Zeitpunkt der Erstellung dieses Artikels ist die einzige gültige RHI-Version 1.0.

Material {
    Effect {
        techniques: [
            Technique {
                id: gl3Technique
                graphicsApiFilter {
                    api: GraphicsApiFilter.OpenGL
                    profile: GraphicsApiFilter.CoreProfile
                    majorVersion: 3
                    minorVersion: 1
                }
                renderPasses: RenderPass {
                    id: gl3Pass
                    shaderProgram: ShaderProgram {
                        ...
                    }
                }
            },
            Technique {
                id: rhiTechnique
                graphicsApiFilter {
                    api: GraphicsApiFilter.RHI
                    profile: GraphicsApiFilter.NoProfile
                    majorVersion: 1
                    minorVersion: 0
                }
                renderPasses: RenderPass {
                    id: rhiPass
                    shaderProgram: ShaderProgram {
                        ...
                    }
                }
            }
        ]
    }
}
QMaterial *material = new QMaterial();
QEffect *effect = new QEffect();

// Set the effect on the material
material->setEffect(effect);

{
    QTechnique *gl3Technique = new QTechnique();
    QRenderPass *gl3Pass = new QRenderPass();
    QShaderProgram *glShader = new QShaderProgram();

    // Set the shader on the render pass
    gl3Pass->setShaderProgram(glShader);

    // Add the pass to the technique
    gl3Technique->addRenderPass(gl3Pass);

    // Set the targeted GL version for the technique
    gl3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
    gl3Technique->graphicsApiFilter()->setMajorVersion(3);
    gl3Technique->graphicsApiFilter()->setMinorVersion(1);
    gl3Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::CoreProfile);

    // Add the technique to the effect
    effect->addTechnique(gl3Technique);
}

{
    QTechnique *rhiTechnique = new QTechnique();
    QRenderPass *rhiPass = new QRenderPass();
    QShaderProgram *rhiShader = new QShaderProgram();

    // Set the shader on the render pass
    rhiPass->setShaderProgram(glShader);

    // Add the pass to the technique
    rhiTechnique->addRenderPass(rhiPass);

    // Set the targeted RHI version for the technique
    rhiTechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
    rhiTechnique->graphicsApiFilter()->setMajorVersion(1);
    rhiTechnique->graphicsApiFilter()->setMinorVersion(0);
    rhiTechnique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);

    // Add the technique to the effect
    effect->addTechnique(rhiTechnique);
}

Erstellen eines RHI-kompatiblen Shaders

Unabhängig davon, auf welchem Backend RHI ausgeführt wird, werden die Shader in GLSL 450 geschrieben.

Die Änderungen sind im Vergleich zu früheren GLSL-Versionen minimal; die wichtigsten erkennbaren Unterschiede bestehen in der Art und Weise, wie Uniforms deklariert werden. Bitte beachten Sie außerdem, dass für In- und Out-Variablen ihre Speicherorte definiert werden müssen und dass diese zwischen den Shader-Stufen konsistent sein sollten.

#version 450 core

layout(location = 0) in vec3 vertexPosition;
layout(location = 0) out vec3 worldPosition;

layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
  mat4 viewMatrix;
  mat4 projectionMatrix;
  mat4 uncorrectedProjectionMatrix;
  mat4 clipCorrectionMatrix;
  mat4 viewProjectionMatrix;
  mat4 inverseViewMatrix;
  mat4 inverseProjectionMatrix;
  mat4 inverseViewProjectionMatrix;
  mat4 viewportMatrix;
  mat4 inverseViewportMatrix;
  vec4 textureTransformMatrix;
  vec3 eyePosition;
  float aspectRatio;
  float gamma;
  float exposure;
  float time;
  float yUpInNDC;
  float yUpInFBO;
};

layout(std140, binding = 1) uniform qt3d_command_uniforms {
  mat4 modelMatrix;
  mat4 inverseModelMatrix;
  mat4 modelViewMatrix;
  mat3 modelNormalMatrix;
  mat4 inverseModelViewMatrix;
  mat4 modelViewProjection;
  mat4 inverseModelViewProjectionMatrix;
};

void main()
{
    ...
}

Weitere Details zu den Änderungen an den Shadern finden Sie unter Qt3DRender::QShaderProgram

Qt 3D Extras

Materialien in „ Qt 3D “ aus dem Bereich „Extras“ wurden auf RHI portiert.

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