Sur cette page

Qt 3D Portage du rendu vers RHI

Pour rappel, dans Qt 6, Qt 3D utilisera par défaut son moteur de rendu RHI.

L'utilisation de l'ancien moteur de rendu OpenGL de la série Qt 5 reste possible. Ceci peut être activé en définissant la variable d'environnement QT3D_RENDERER à opengl. Ceci est nécessaire si vous ne voulez pas porter votre application pour supporter RHI ou si vous avez besoin de fonctionnalités qui sont actuellement limitées ou non disponibles sur le backend RHI.

Actuellement, les limitations connues de RHI sont les suivantes

  • Pas de possibilité de blit explicite (vous devez bliter manuellement en rendant un quad dans un framebuffer)
  • MemoryBarrier ne peut pas être défini explicitement
  • Tous les formats de texture ne sont pas disponibles
  • Draw Indirect n'est actuellement pas pris en charge
  • Les shaders géométriques ne sont pas pris en charge actuellement.
  • Les différents backends RHI peuvent prendre en charge des fonctionnalités différentes.

Veillez également à ne pas confondre le backend de rendu OpenGL de Qt 3D avec le backend de rendu RHI de Qt 3D qui s'exécute au-dessus d'OpenGL.

RHI est une abstraction sur les différentes API graphiques. Cela signifie que sur une plateforme donnée, plusieurs RHI peuvent utiliser plusieurs backends.

Pour forcer RHI à utiliser un backend donné, la variable d'environnement QSG_RHI_BACKEND doit être positionnée à opengl, vulkan, metal, directx.

Ajouter des techniques compatibles avec RHI

Pour ajouter le support RHI à un matériau/effet Qt 3D, une nouvelle technique ciblant RHI sera nécessaire. À l'heure où nous écrivons ces lignes, la seule version valide de RHI est la 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);
}

Création d'un shader compatible RHI

Quel que soit le backend sur lequel RHI fonctionnera, les shaders seront écrits en GLSL 450.

Les changements sont minimes par rapport aux versions antérieures de GLSL, les principales différences notables se situant dans la façon dont les uniformes sont déclarés. Veuillez également noter que les emplacements des variables in et out doivent être définis et qu'ils doivent être cohérents entre les différentes étapes du shader.

#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()
{
    ...
}

Pour plus de détails sur les changements apportés aux shaders, veuillez consulter la rubrique Qt3DRender::QShaderProgram

Qt 3D Extras

Les matériaux de Qt 3D Extras ont été portés sur RHI.

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