Sur cette page

QQuickRhiItem Class

La classe QQuickRhiItem est une alternative portable à QQuickFramebufferObject qui n'est pas liée à OpenGL, mais permet d'intégrer le rendu aux API d'QRhi s via Qt Quick. En savoir plus...

En-tête : #include <QQuickRhiItem>
CMake : find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake : QT += quick
Depuis : Qt 6.7
Hérite de : QQuickItem

Types publics

enum class TextureFormat { RGBA8, RGBA16F, RGBA32F, RGB10A2 }

Propriétés

Fonctions publiques

QQuickRhiItem(QQuickItem *parent = nullptr)
virtual ~QQuickRhiItem() override
bool alphaBlending() const
QQuickRhiItem::TextureFormat colorBufferFormat() const
QSize effectiveColorBufferSize() const
int fixedColorBufferHeight() const
int fixedColorBufferWidth() const
bool isMirrorVerticallyEnabled() const
int sampleCount() const
void setAlphaBlending(bool enable)
void setColorBufferFormat(QQuickRhiItem::TextureFormat format)
void setFixedColorBufferHeight(int height)
void setFixedColorBufferWidth(int width)
void setMirrorVertically(bool enable)
void setSampleCount(int samples)

Fonctions publiques réimplémentées

virtual bool isTextureProvider() const override
virtual QSGTextureProvider *textureProvider() const override

Signaux

Fonctions protégées

virtual QQuickRhiItemRenderer *createRenderer() = 0
bool isAutoRenderTargetEnabled() const
void setAutoRenderTarget(bool enabled)

Fonctions protégées réimplémentées

virtual bool event(QEvent *e) override
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
virtual void releaseResources() override

Description détaillée

QQuickRhiItem est en fait l’équivalent de QRhiWidget dans l’univers d’ Qt Quick. Ces deux classes sont destinées à être sous-classées et permettent toutes deux d’enregistrer un rendu basé sur l’ QRhi, ciblant un tampon de couleurs hors écran. L’image 2D obtenue est ensuite composée avec le reste de la scène d’ Qt Quick.

Remarque : bien que `QQuickRhiItem` soit une API Qt publique, la famille de classes ` QRhi ` du module Qt GUI, comprenant notamment ` QShader ` et ` QShaderDescription`, n’offre que des garanties de compatibilité limitées. Il n’y a aucune garantie de compatibilité au niveau du code source ou des binaires pour ces classes, ce qui signifie que le fonctionnement de l’API n’est garanti qu’avec la version de Qt sur laquelle l’application a été développée. Les modifications entraînant une incompatibilité au niveau du code source sont toutefois destinées à être réduites au minimum et ne seront apportées que dans les versions mineures (6.7, 6.8, etc.). qquickrhiitem.h n'inclut pas directement d'en-têtes liées à QRhi. Pour utiliser ces classes lors de l’implémentation d’une sous-classe de QQuickRhiItem, liez-vous à Qt::GuiPrivate (si vous utilisez CMake), et incluez les en-têtes appropriés avec le préfixe rhi, par exemple #include <rhi/qrhi.h>.

QQuickRhiItem remplace l’ancienne classe QQuickFramebufferObject. Cette dernière est intrinsèquement liée à OpenGL / OpenGL ES, tandis que QQuickRhiItem fonctionne avec les classes QRhi, ce qui permet d’exécuter le même code de rendu avec Vulkan, Metal, Direct 3D 11/12 et OpenGL / OpenGL ES. Sur le plan conceptuel et fonctionnel, elles sont très proches, et la migration d’ QQuickFramebufferObject vers QQuickRhiItem est simple. QQuickFramebufferObject reste disponible pour assurer la compatibilité avec le code des applications existantes qui fonctionnent directement avec l’API OpenGL.

Remarque : QQuickRhiItem ne fonctionnera pas si vous utilisez l’adaptation « software » du graphe de scène d’ Qt Quick.

Sur la plupart des plateformes, le rendu du graphe de scène, et donc le rendu effectué par QQuickRhiItem, s’effectuera sur un thread dédié. C’est pourquoi la classe QQuickRhiItem impose une séparation stricte entre l’implémentation de l’élément (la sous-classe QQuickItem ) et la logique de rendu proprement dite. Toute la logique de l’élément, telle que les propriétés et les fonctions d’aide liées à l’interface utilisateur exposées à QML, doit se trouver dans la sous-classe de QQuickRhiItem. Tout ce qui concerne le rendu doit se trouver dans la classe QQuickRhiItemRenderer. Pour éviter les conditions de concurrence et les problèmes de lecture/écriture entre deux threads, il est important que le moteur de rendu et l’élément ne lisent ni n’écrivent jamais de variables partagées. La communication entre l’élément et le moteur de rendu doit principalement s’effectuer via la fonction `QQuickRhiItem::synchronize()`. Cette fonction sera appelée sur le thread de rendu tandis que le thread de l’interface graphique est bloqué. Il est également possible d’utiliser des connexions en file d’attente ou des événements pour la communication entre l’élément et le moteur de rendu.

Les applications doivent créer des sous-classes à la fois de `QQuickRhiItem` et de ` QQuickRhiItemRenderer`. La fonction virtuelle pure ` createRenderer()` doit être réimplémentée pour renvoyer une nouvelle instance de la sous-classe ` QQuickRhiItemRenderer `.

Comme pour ` QRhiWidget`, `QQuickRhiItem` gère automatiquement le tampon de couleur, qui est généralement une texture 2D (`QRhiTexture`) ou un ` QRhiRenderBuffer ` lorsque le multisampling est utilisé. (Certaines API 3D font la distinction entre les textures et les tampons de rendu, tandis que pour d’autres, la ressource native sous-jacente est la même ; les tampons de rendu sont principalement utilisés pour permettre le multisampling avec OpenGL ES 3.0)

Par défaut, la taille de la texture s’adapte à celle de l’élément (en tenant compte de la valeur de ` device pixel ratio `). Si la taille de l’élément change, la texture est recréée avec la taille correcte. Si vous préférez une taille fixe, définissez ` fixedColorBufferWidth ` et ` fixedColorBufferHeight ` sur des valeurs non nulles.

QQuickRhiItem est un « texture provider » et peut être utilisé directement dans ShaderEffects et d’autres classes qui utilisent des fournisseurs de textures.

Bien que ce ne soit pas un cas d'utilisation principal, QQuickRhiItem permet également d'intégrer du code de rendu utilisant directement une API graphique 3D telle que Vulkan, Metal, Direct 3D ou OpenGL. Consultez QRhiCommandBuffer::beginExternal() pour plus de détails sur l’enregistrement de commandes natives au sein d’un passage de rendu QRhi, ainsi que QRhiTexture::createFrom() pour savoir comment encapsuler une texture native existante puis l’utiliser avec QRhi lors d’un passage de rendu ultérieur. Voir également QQuickGraphicsConfiguration concernant la configuration de l’environnement de l’API 3D native (par exemple, les extensions de périphérique) et notez que l’ QQuickWindow peut être associé à un QVulkanInstance personnalisé en appelant QWindow::setVulkanInstance() suffisamment tôt.

Remarque : QQuickRhiItem utilise toujours la même instance d’ QRhi que celle utilisée par QQuickWindow (et, par extension, le même contexte OpenGL, le même périphérique Vulkan, etc.). Pour choisir l’API graphique 3D sous-jacente à utiliser, appelez setGraphicsApi() sur l’ QQuickWindow suffisamment tôt. Il n’est plus possible de modifier ce paramètre une fois que le graphe de scène a été initialisé, et toutes les instances de `QQuickRhiItem` présentes dans la scène seront rendues à l’aide de la même API 3D.

Un exemple simple

Prenons la sous-classe suivante de `QQuickRhiItem`. Elle est présentée ici dans son intégralité. Elle affiche un seul triangle avec une projection en perspective, le triangle étant pivoté en fonction de la propriété ` angle ` de l’élément personnalisé. (Ce qui signifie qu’elle peut être pilotée, par exemple, à l’aide d’animations telles que ` NumberAnimation ` depuis QML)

class ExampleRhiItemRenderer : public QQuickRhiItemRenderer
{
public:
    void initialize(QRhiCommandBuffer *cb) override;
    void synchronize(QQuickRhiItem *item) override;
    void render(QRhiCommandBuffer *cb) override;

private:
    QRhi *m_rhi = nullptr;
    std::unique_ptr<QRhiBuffer> m_vbuf;
    std::unique_ptr<QRhiBuffer> m_ubuf;
    std::unique_ptr<QRhiShaderResourceBindings> m_srb;
    std::unique_ptr<QRhiGraphicsPipeline> m_pipeline;
    QMatrix4x4 m_viewProjection;
    float m_angle = 0.0f;
};

class ExampleRhiItem : public QQuickRhiItem
{
    Q_OBJECT
    QML_NAMED_ELEMENT(ExampleRhiItem)
    Q_PROPERTY(float angle READ angle WRITE setAngle NOTIFY angleChanged)

public:
    QQuickRhiItemRenderer *createRenderer() override;

    float angle() const { return m_angle; }
    void setAngle(float a);

signals:
    void angleChanged();

private:
    float m_angle = 0.0f;
};

QQuickRhiItemRenderer *ExampleRhiItem::createRenderer()
{
    return new ExampleRhiItemRenderer;
}

void ExampleRhiItem::setAngle(float a)
{
    if (m_angle == a)
        return;

    m_angle = a;
    emit angleChanged();
    update();
}

void ExampleRhiItemRenderer::synchronize(QQuickRhiItem *rhiItem)
{
    ExampleRhiItem *item = static_cast<ExampleRhiItem *>(rhiItem);
    if (item->angle() != m_angle)
        m_angle = item->angle();
}

static QShader getShader(const QString &name)
{
    QFile f(name);
    return f.open(QIODevice::ReadOnly) ? QShader::fromSerialized(f.readAll()) : QShader();
}

static float vertexData[] = {
    0.0f,   0.5f,   1.0f, 0.0f, 0.0f,
    -0.5f,  -0.5f,   0.0f, 1.0f, 0.0f,
    0.5f,  -0.5f,   0.0f, 0.0f, 1.0f,
};

void ExampleRhiItemRenderer::initialize(QRhiCommandBuffer *cb)
{
    if (m_rhi != rhi()) {
        m_pipeline.reset();
        m_rhi = rhi();
    }

    if (!m_pipeline) {
        m_vbuf.reset(m_rhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(vertexData)));
        m_vbuf->create();

        m_ubuf.reset(m_rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, 64));
        m_ubuf->create();

        m_srb.reset(m_rhi->newShaderResourceBindings());
        m_srb->setBindings({
            QRhiShaderResourceBinding::uniformBuffer(0, QRhiShaderResourceBinding::VertexStage, m_ubuf.get()),
        });
        m_srb->create();

        m_pipeline.reset(m_rhi->newGraphicsPipeline());
        m_pipeline->setShaderStages({
            { QRhiShaderStage::Vertex, getShader(QLatin1String(":/shaders/color.vert.qsb")) },
            { QRhiShaderStage::Fragment, getShader(QLatin1String(":/shaders/color.frag.qsb")) }
        });
        QRhiVertexInputLayout inputLayout;
        inputLayout.setBindings({
            { 5 * sizeof(float) }
        });
        inputLayout.setAttributes({
            { 0, 0, QRhiVertexInputAttribute::Float2, 0 },
            { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
        });
        m_pipeline->setVertexInputLayout(inputLayout);
        m_pipeline->setShaderResourceBindings(m_srb.get());
        m_pipeline->setRenderPassDescriptor(renderTarget()->renderPassDescriptor());
        m_pipeline->create();

        QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
        resourceUpdates->uploadStaticBuffer(m_vbuf.get(), vertexData);
        cb->resourceUpdate(resourceUpdates);
    }

    const QSize outputSize = renderTarget()->pixelSize();
    m_viewProjection = m_rhi->clipSpaceCorrMatrix();
    m_viewProjection.perspective(45.0f, outputSize.width() / (float) outputSize.height(), 0.01f, 1000.0f);
    m_viewProjection.translate(0, 0, -4);
}

void ExampleRhiItemRenderer::render(QRhiCommandBuffer *cb)
{
    QRhiResourceUpdateBatch *resourceUpdates = m_rhi->nextResourceUpdateBatch();
    QMatrix4x4 modelViewProjection = m_viewProjection;
    modelViewProjection.rotate(m_angle, 0, 1, 0);
    resourceUpdates->updateDynamicBuffer(m_ubuf.get(), 0, 64, modelViewProjection.constData());

    const QColor clearColor = QColor::fromRgbF(0.4f, 0.7f, 0.0f, 1.0f);
    cb->beginPass(renderTarget(), clearColor, { 1.0f, 0 }, resourceUpdates);

    cb->setGraphicsPipeline(m_pipeline.get());
    const QSize outputSize = renderTarget()->pixelSize();
    cb->setViewport(QRhiViewport(0, 0, outputSize.width(), outputSize.height()));
    cb->setShaderResources();
    const QRhiCommandBuffer::VertexInput vbufBinding(m_vbuf.get(), 0);
    cb->setVertexInput(0, 1, &vbufBinding);
    cb->draw(3);

    cb->endPass();
}

Il est à noter que cette classe simple est presque exactement identique au code présenté dans l’introduction à l’ QRhiWidget. Les shaders de sommets et de fragments sont également les mêmes. Ceux-ci sont fournis sous forme de code source GLSL de type Vulkan et doivent d’abord être traités par l’infrastructure de shaders Qt. Pour ce faire, on peut soit exécuter manuellement l’outil en ligne de commande qsb, soit utiliser la fonction qt_add_shaders() dans CMake. Le QQuickRhiItem charge ces fichiers .qsb pré-traités qui sont fournis avec l’application. Consultez Qt Shader Tools pour plus d’informations sur l’infrastructure de traduction des shaders de Qt.

color.vert

#version 440
layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;
layout(location = 0) out vec3 v_color;
layout(std140, binding = 0) uniform buf {
    mat4 mvp;
};

void main()
{
    v_color = color;
    gl_Position = mvp * position;
}

color.frag

#version 440
layout(location = 0) in vec3 v_color;
layout(location = 0) out vec4 fragColor;

void main()
{
    fragColor = vec4(v_color, 1.0);
}

Une fois intégré à QML (voir QML_NAMED_ELEMENT), notre élément personnalisé peut être instancié dans n’importe quelle scène. (après avoir importé le fichier ` URI ` approprié spécifié pour ` qt_add_qml_module() ` dans le projet CMake)

ExampleRhiItem {
    anchors.fill: parent
    anchors.margins: 10
    NumberAnimation on angle { from: 0; to: 360; duration: 5000; loops: Animation.Infinite }
}

Consultez la section « Graphique de scène - Élément de texture RHI » pour un exemple plus complexe.

Voir également QQuickRhiItemRenderer, Graphique de scène - Élément de texture RHI, QRhi, et Graphique de scène et rendu.

Documentation sur les types de membres

enum class QQuickRhiItem::TextureFormat

Spécifie le format de la texture d'arrière-plan sur laquelle l'QQuickRhiItem e effectue le rendu.

ConstanteValeurDescription
QQuickRhiItem::TextureFormat::RGBA80Voir QRhiTexture::RGBA8. Il s'agit de la valeur par défaut.
QQuickRhiItem::TextureFormat::RGBA16F1Voir « QRhiTexture::RGBA16F ».
QQuickRhiItem::TextureFormat::RGBA32F2Voir QRhiTexture::RGBA32F.
QQuickRhiItem::TextureFormat::RGB10A23Voir QRhiTexture::RGB10A2.

Voir également QRhiTexture.

Documentation sur les propriétés

alphaBlending : bool

Détermine si la fusion est toujours activée lors du tracé du quadrilatère texturé avec le contenu généré par l'QQuickRhiItem et son moteur de rendu.

La valeur par défaut est « false ». Ce paramètre est défini pour des raisons de performances : si aucune semi-transparence n’est impliquée, l’ QQuickRhiItemRenderer effaçant la surface en lui attribuant une couleur opaque et ne rendant jamais de fragments dont la valeur alpha est inférieure à 1, il est alors inutile d’activer la fusion.

Si la sous-classe d’ QQuickRhiItemRenderer effectue un rendu impliquant de la semi-transparence, définissez cette propriété sur « true ».

Remarque : dans certaines conditions, le mélange aura tout de même lieu, quelle que soit la valeur de cette propriété. Par exemple, si l’ opacity de l’élément (plus précisément, l’opacité combinée héritée de la chaîne parent) est inférieure à 1, le mélange sera automatiquement activé même lorsque cette propriété est définie sur « false ».

Remarque : le graphe de scène d’ Qt Quick s repose sur l’alpha pré-multiplié et s’attend à ce qu’il le soit. Par exemple, si l’intention est d’effacer l’arrière-plan dans le moteur de rendu avec une valeur alpha de 0,5, veillez à multiplier également par 0,5 les valeurs de couleur d’effacement rouge, verte et bleue. Sinon, les résultats de l’ seront incorrects.

Fonctions d’accès :

bool alphaBlending() const
void setAlphaBlending(bool enable)

Signal de notification :

void alphaBlendingChanged()

colorBufferFormat : TextureFormat

Cette propriété contrôle le format de la texture utilisée comme tampon de couleur. La valeur par défaut est ` TextureFormat::RGBA8`. ` QQuickRhiItem ` prend en charge le rendu vers un sous-ensemble des formats pris en charge par ` QRhiTexture`. Seuls les formats signalés comme pris en charge par la fonction ` QRhi::isTextureFormatSupported()` doivent être spécifiés ; dans le cas contraire, le rendu ne fonctionnera pas.

Remarque : définir un nouveau format alors que l’élément et son moteur de rendu sont déjà initialisés et ont effectué le rendu implique que tous les objets ` QRhiGraphicsPipeline ` créés par le moteur de rendu risquent de devenir inutilisables, si le ` QRhiRenderPassDescriptor ` associé est désormais incompatible en raison du format de texture différent. Tout comme lors de la modification dynamique d’ sampleCount, cela signifie que les implémentations de initialize() ou render() doivent alors veiller à libérer les pipelines existants et à en créer de nouveaux.

Fonctions d'accès :

QQuickRhiItem::TextureFormat colorBufferFormat() const
void setColorBufferFormat(QQuickRhiItem::TextureFormat format)

Signal du notificateur :

void colorBufferFormatChanged()

[read-only] effectiveColorBufferSize : QSize

Cette propriété indique la taille, en pixels, du tampon de couleur sous-jacent ( QRhiTexture ou QRhiRenderBuffer). Elle est destinée à être utilisée sur le thread GUI (principal), dans les liaisons QML ou en JavaScript.

Remarque : les implémentationsde QQuickRhiItemRenderer, fonctionnant sur le thread de rendu du graphe de scène, ne doivent pas utiliser cette propriété. Elles doivent plutôt interroger la taille via render target.

Remarque : la valeur devient disponible de manière asynchrone du point de vue du thread principal, dans la mesure où elle change lorsque le rendu s'effectue sur le thread de rendu. Cela signifie que cette propriété est principalement utile dans les liaisons QML. Le code de l’application ne doit pas supposer que la valeur est déjà à jour lors de la construction de l’objet ` QQuickRhiItem `.

Il s’agit d’une propriété en lecture seule.

Fonctions d’accès :

QSize effectiveColorBufferSize() const

Signal de notification :

void effectiveColorBufferSizeChanged()

fixedColorBufferHeight : int

La hauteur fixe, en pixels, de la texture associée à l'élément. Ce paramètre est pertinent lorsqu'on souhaite définir une taille de texture fixe qui ne dépende pas de la taille de l'élément. Cette taille n'a aucun effet sur la géométrie de l'élément (sa taille et son emplacement dans la scène), ce qui signifie que le contenu de la texture apparaîtra étiré (agrandi) ou réduit sur la surface de l'élément.

Par défaut, la valeur est 0. Une valeur de 0 signifie que la taille de la texture suit celle de l’élément. (texture size = item size * device pixel ratio).

Consultez fixedColorBufferWidth pour plus d’informations sur les cas d’utilisation du réglage d’une largeur et d’une hauteur fixes.

Fonctions d'accès :

int fixedColorBufferHeight() const
void setFixedColorBufferHeight(int height)

Signal de notification :

void fixedColorBufferHeightChanged()

fixedColorBufferWidth : int

La largeur fixe, en pixels, de la texture ou du tampon de rendu associé à l'élément. Ce paramètre est pertinent lorsqu'on souhaite définir une taille fixe pour le tampon de couleur, indépendamment de la taille de l'élément. Cette taille n'a aucun effet sur la géométrie de l'élément (sa taille et son emplacement dans la scène), ce qui signifie que le contenu de la texture apparaîtra étiré (agrandi) ou réduit sur la surface de l'élément.

Par exemple, définir une taille exactement deux fois supérieure à la taille (en pixels) de l’élément revient à effectuer un suréchantillonnage 2x (rendu à une résolution double, puis redimensionnement implicite à la baisse lors de l’application de la texture au quadrilatère correspondant à l’élément dans la scène). À l’inverse, définir une taille correspondant à la moitié de la taille en pixels de l’élément revient à effectuer un rendu à la moitié de la résolution, puis à agrandir les résultats.

Par défaut, la valeur est « 0 ». Une valeur de 0 signifie que la taille de la texture suit celle de l’élément. (texture size = item size * device pixel ratio).

Remarque : le rapport de pixels de l’appareil (le facteur d’échelle du compositeur système) peut avoir un impact important sur les performances, car un facteur d’échelle de 2 (200 %) implique un rendu à une résolution deux fois supérieure, soit le double de ce que le développeur et le concepteur d’interface perçoivent comme la taille de l’élément, puis une réduction effective de l’échelle du contenu, de manière similaire à ce qui se produit lorsque cette propriété est définie sur le double de la taille en pixels de l’élément sur un système où le rapport de pixels de l’appareil est égal à 1. Par conséquent, cette propriété ne devrait être que rarement utilisée avec des tailles supérieures à la taille en pixels de l’élément, car de nombreux systèmes de bureau modernes n’en ont ni le besoin ni les ressources de performance nécessaires, lorsque le système utilise de toute façon un rapport de pixels de l’appareil supérieur à 1. Au contraire, le principal cas d’utilisation de cette propriété consiste à définir une taille plus petite, afin d’effectuer le rendu à une résolution raisonnablement inférieure plutôt que de suivre aveuglément la géométrie de l’élément (et peut-être de la fenêtre), quelle que soit son ampleur.

Fonctions d'accès :

int fixedColorBufferWidth() const
void setFixedColorBufferWidth(int width)

Signal de notification :

void fixedColorBufferWidthChanged()

mirrorVertically : bool

Cette propriété détermine si les coordonnées UV de la texture sont inversées lors du tracé du quadrilatère texturé. Elle n'a aucun effet sur le contenu du tampon de couleur hors écran ni sur le rendu mis en œuvre par la classe ` QQuickRhiItemRenderer`.

La valeur par défaut est « false ».

Fonctions d’accès :

bool isMirrorVerticallyEnabled() const
void setMirrorVertically(bool enable)

Signal de notification :

void mirrorVerticallyChanged()

sampleCount : int

Cette propriété contrôle le nombre d'échantillons pour l'anticrénelage multi-échantillon (MSAA). Par défaut, la valeur est « 1 », ce qui signifie que le MSAA est désactivé.

Les valeurs valides sont 1, 4, 8, et parfois 16 et 32. La fonction ` QRhi::supportedSampleCounts()` permet de connaître les nombres d’échantillons pris en charge lors de l’exécution, mais en règle générale, les applications doivent demander 1 (pas de MSAA), 4x (MSAA normal) ou 8x (MSAA élevé).

Remarque : la définition d’une nouvelle valeur implique que tous les objets ` QRhiGraphicsPipeline ` créés par le moteur de rendu doivent désormais utiliser le même nombre d’échantillons. Les objets ` QRhiGraphicsPipeline ` existants, créés avec un nombre d’échantillons différent, ne doivent plus être utilisés. Lorsque la valeur change, tous les tampons de couleur et de profondeur-stencil sont détruits puis recréés automatiquement, et la fonction ` initialize()` est à nouveau appelée. Cependant, lorsque la fonction ` isAutoRenderTargetEnabled()` est définie sur ` false`, il appartient à l’application de gérer cette situation en ce qui concerne le tampon de profondeur-stencil ou les tampons de couleur supplémentaires.

Modifier le nombre d’échantillons de la valeur par défaut 1 à une valeur supérieure implique que ` colorTexture()` devienne ` nullptr ` et que ` msaaColorBuffer()` commence à renvoyer un objet valide. Revenir à 1 (ou 0) implique l’inverse : lors du prochain appel à `initialize()`, `msaaColorBuffer()` renverra ` nullptr`, tandis que `colorTexture()` redeviendra valide. De plus, la fonction resolveTexture() renvoie une texture de couleur valide (non multi-échantillonnée) QRhiTexture dès lors que le nombre d’échantillons est supérieur à 1 (c’est-à-dire lorsque le MSAA est activé).

Fonctions d’accès :

int sampleCount() const
void setSampleCount(int samples)

Signal de notification :

void sampleCountChanged()

Voir également QQuickRhiItemRenderer::msaaColorBuffer() et QQuickRhiItemRenderer::resolveTexture().

Documentation des fonctions membres

[explicit] QQuickRhiItem::QQuickRhiItem(QQuickItem *parent = nullptr)

Crée un nouvel objet `QQuickRhiItem` à partir de l'parent` fourni.

[override virtual noexcept] QQuickRhiItem::~QQuickRhiItem()

Destructeur.

[pure virtual protected] QQuickRhiItemRenderer *QQuickRhiItem::createRenderer()

Réimplémentez cette fonction pour créer et renvoyer une nouvelle instance d'une sous-classe de ` QQuickRhiItemRenderer `.

Cette fonction sera appelée sur le thread de rendu pendant que le thread de l'interface graphique est bloqué.

[override virtual protected] bool QQuickRhiItem::event(QEvent *e)

Réimplémente : QQuickItem::event(QEvent *ev).

[override virtual protected] void QQuickRhiItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)

Réimplémente : QQuickItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry).

[protected] bool QQuickRhiItem::isAutoRenderTargetEnabled() const

Renvoie le paramètre actuel de gestion automatique des tampons de profondeur et de stencil et des cibles de rendu.

Par défaut, cette valeur est true.

Voir également setAutoRenderTarget().

[override virtual] bool QQuickRhiItem::isTextureProvider() const

Réimplémente : QQuickItem::isTextureProvider() const.

[override virtual protected] void QQuickRhiItem::releaseResources()

Réimplémente : QQuickItem::releaseResources().

[protected] void QQuickRhiItem::setAutoRenderTarget(bool enabled)

Détermine si un tampon de profondeur-stencil ( QRhiRenderBuffer ) et un tampon de rendu ( QRhiTextureRenderTarget ) sont créés et gérés automatiquement par l’élément. La valeur par défaut est « true ». Appelez cette fonction dès le début, par exemple depuis le constructeur de la classe dérivée, en définissant « enabled » sur « false » pour désactiver cette fonctionnalité.

En mode automatique, la taille et le nombre d’échantillons du tampon de profondeur-stencil suivent les paramètres de la texture du tampon de couleur. En mode non automatique, renderTarget() et depthStencilBuffer() renvoient toujours nullptr; il appartient alors à l’implémentation de la fonction initialize() par l’application de se charger de la configuration et de la gestion de ces objets.

[override virtual] QSGTextureProvider *QQuickRhiItem::textureProvider() const

Réimplémente : QQuickItem::textureProvider() const.

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