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.

Il reste toutefois possible d'utiliser l'ancien moteur OpenGL de la série Qt 5. Pour l'activer, il suffit de définir la variable d'environnement QT3D_RENDERER sur « opengl ». Cela est nécessaire si vous ne souhaitez pas porter votre application pour qu'elle prenne en charge RHI ou si vous avez besoin de fonctionnalités qui sont actuellement limitées ou indisponibles sur le backend RHI.

Actuellement, les limitations connues de RHI sont les suivantes :

  • Impossibilité d’effectuer un blit de manière explicite (vous devez effectuer le blit manuellement en rendant un quad dans un framebuffer)
  • Impossible de définir explicitement une barrière mémoire (MemoryBarrier)
  • Tous les formats de texture ne sont pas disponibles
  • Le « Draw Indirect » n’est actuellement pas pris en charge
  • Les shaders de géométrie ne sont actuellement pas pris en charge.
  • Les différents backends RHI peuvent prendre en charge des ensembles de fonctionnalités différents.

Veillez également à ne pas confondre le backend de rendu OpenGL de l'Qt 3D avec le backend de rendu RHI de Qt 3D fonctionnant par-dessus OpenGL.

RHI est une abstraction au-dessus de différentes API graphiques. Cela signifie que, sur une plateforme donnée, plusieurs instances de RHI peuvent utiliser plusieurs backends.

Pour forcer RHI à utiliser un backend donné, la variable d’environnement QSG_RHI_BACKEND doit être définie sur l’une des valeurs suivantes : opengl, vulkan, metal ou directx.

Ajouter des techniques compatibles RHI

Pour ajouter la prise en charge de RHI à un matériau ou un effet d’ 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 s’exécutera, les shaders seront écrits en GLSL 450.

Les changements sont minimes par rapport aux versions antérieures de GLSL ; les principales différences notables concernent la manière dont les uniformes sont déclarés. Veuillez également noter que les variables d’entrée et de sortie doivent avoir un emplacement défini et qu’elles doivent rester cohérentes d’une étape de shader à l’autre.

#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 modifications apportées aux shaders, veuillez consulter Qt3DRender::QShaderProgram

Qt 3D Extras

Les matériaux d'Qt 3D, section « Extras », ont été portés vers 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.