Sur cette page

Rendu instancié

Introduction

Qt Quick La 3D prend en charge l'instanciation d'objets Model. L'instanciation désigne une technique consistant à rendre un objet plusieurs fois à l'aide d'un seul appel de dessin. (Par exemple, la fonction OpenGL ` glDrawElementsInstanced`.)

L’instanciation permet de dupliquer un modèle avec des variations. Contrairement à l’utilisation d’une instance d’ Repeater3D, le modèle et ses ressources graphiques ne sont alloués qu’une seule fois. Le rendu des instances dupliquées est effectué en bas niveau par le GPU. Selon la complexité du modèle, cela peut se traduire par un gain de performances de plusieurs ordres de grandeur.

En pratique, l’instanciation s’effectue en définissant un tableau qui précise comment chaque instance est modifiée par rapport au modèle de base.

API d’instanciation

Le principe fondamental de l’API d’instanciation est qu’elle est explicite : elle ne tente pas de détecter automatiquement les possibilités d’instanciation au sein de l’API existante. Au lieu de cela, chaque modèle est marqué individuellement en définissant sa propriété ` instancing ` pour qu’elle fasse référence à un objet ` Instancing `. Un même objet `Instancing` peut être utilisé sur plusieurs modèles simultanément.

L’objet Instancing spécifie un tableau qui définit la manière dont chaque copie est rendue. Les modifications disponibles sont les suivantes :

  • transformation: position, rotation et échelle
  • couleur: une couleur qui est mélangée au matériau du modèle
  • données personnalisées: données pouvant être utilisées par des matériaux personnalisés

Qt fournit trois types Qml qui héritent de `Instancing` :

  • InstanceList énumère toutes les instances et permet de se lier aux propriétés de chaque instance.
  • RandomInstancing permet de tester et de créer rapidement des prototypes en générant des instances aléatoires dans des limites définies.
  • FileInstancing lit un tableau d’instances à partir d’un fichier externe.

L'exemple d'instanciation montre comment créer une scène à l'aide de l'API QML.

D'autres types de tables d'instances peuvent être définis en C++ en créant des sous-classes de ` QQuick3DInstancing`. Par exemple, le moteur de rendu « particle system » utilise en interne sa propre table d'instances. Celle-ci est disponible sous le nom ` ModelParticle3D.instanceTable`.

En écrivant du code de shader personnalisé, il est possible d’utiliser l’instanciation pour contrôler des propriétés supplémentaires, telles que des variables pour le rendu basé sur la physique, les poids d’animation squelettique, la distorsion ou tout autre élément pouvant être exprimé à l’aide de matériaux personnalisés. Les données personnalisées de la table d’instanciation se composent de quatre nombres à virgule flottante.

L’exemple d’instanciation personnalisée montre comment combiner des matériaux personnalisés et une table d’instance implémentée en C++.

Mélange alpha et instanciation

Pour que le mélange alpha soit correct, les objets semi-transparents doivent être rendus de l’arrière vers l’avant. C’est pourquoi l’ QtQuick3D e trie séparément les objets opaques et semi-transparents, puis les rend dans le bon ordre. Avec l’instanciation, cependant, le GPU rendra les instances dans l’ordre spécifié par la table d’instanciation, si l’option « depth-sorting » n’est pas activée. Pour des raisons de performances, l’option « QtQuick3D » ne trie pas la table par défaut, car cela peut prendre beaucoup de temps lorsqu’il y a un grand nombre d’instances. Cela signifie que si des instances semi-transparentes se chevauchent entre elles, ou avec d’autres objets semi-transparents, le résultat peut paraître incorrect. En général, l’erreur est moins visible lorsque l’opacité est faible.

Les objets entièrement opaques ainsi que les objets semi-transparents qui ne se chevauchent pas seront toujours rendus correctement, car Qt utilise le test du tampon de profondeur pour éviter de dessiner derrière des objets opaques. Cependant, l’absence de tri peut avoir des répercussions sur les performances des objets opaques : ceux-ci risquent de ne pas être rendus dans l’ordre optimal, ce qui signifie qu’un même pixel peut être écrit plusieurs fois, alourdissant ainsi la charge de travail du shader de fragment.

Le moteur de rendu n’inspecte pas le contenu de la table d’instanciation ; il faut donc le spécifier explicitement lorsqu’une table d’instanciation contient des valeurs alpha semi-transparentes : définissez la propriété ` hasTransparency ` sur ` true ` pour vous assurer que le moteur de rendu active le mélange alpha. Cela s’applique à toutes les instances : même les instances entièrement opaques seront rendues sans test de profondeur, ce qui peut entraîner des erreurs visibles.

L’ordre de rendu par rapport au reste de la scène peut être ajusté en définissant la propriété « depth bias » du modèle.

Transformations et instanciation

Chaque instance possède sa propre transformation dans la table d’instances. Celle-ci est combinée aux transformations appliquées au modèle instancié. Ce processus est légèrement complexe, car il existe plusieurs cas d’utilisation :

  • Effectuer une transformation sur le modèle qui s’applique à chaque instance individuellement. Cela permet de réaliser des animations peu gourmandes en ressources, par exemple en faisant pivoter toutes les instances en même temps sans avoir à modifier la table d’instances.
  • Transformer l’ensemble du groupe d’instances en une seule fois.
  • Instancier une hiérarchie de modèles.

Pour prendre en charge tous ces cas, la transformation du modèle est divisée en deux parties : la transformation locale de l’instance et la transformation globale de l’instance. Conceptuellement, l’instanciation s’effectue comme suit :

  • Tout d’abord, le modèle est transformé selon la transformation locale de l’instance.
  • Ensuite, chaque instance est calculée en appliquant la transformation de la table d’instances.
  • Enfin, l’ensemble des objets instanciés est transformé selon la transformation d’instance globale.

Par défaut, la transformation d’instance locale d’un modèle comprend l’échelle et la rotation du modèle, tandis que le reste est pris en charge par la transformation d’instance globale.

Ce comportement peut être contrôlé en définissant la propriété ` instanceRoot ` du modèle. Celle-ci définit l’origine du système de coordonnées de l’instance. L’utilisation la plus courante concerne l’instanciation d’une hiérarchie de modèles. Par exemple, une sphère en orbite autour d’un cube :

Model {
    id: cube
    instancing: someInstanceTable
    source: "#Cube"
    materials: DefaultMaterial { diffuseColor: "lightgray" }
    Node {
        Model {
            source: "#Sphere"
            instanceRoot: cube
            instancing: cube.instancing
            x: 150
            materials: DefaultMaterial { diffuseColor: "gray" }
        }
        NumberAnimation on eulerRotation.y {
            from: 0
            to: 360
            duration: 4000
            loops: Animation.Infinite
        }
    }
}

La propriété ` instanceRoot ` est nécessaire pour spécifier que l’instance de la sphère doit être positionnée comme si elle faisait partie du cube. Chaque modèle d’une hiérarchie doit tout de même spécifier la propriété ` instancing ` : dans les cas normaux, ils doivent tous être définis sur le même objet ` Instancing `.

instanceRoot Cette méthode peut également être utilisée lors de l’instanciation d’un modèle unique. Par exemple, un cylindre tournant autour d’un point décentré :

 Node {
    id: parentNode
    Model {
        source: "#Cylinder"
        instanceRoot: parentNode
        instancing: anotherInstanceTable
        x: 25
        materials: DefaultMaterial { diffuseColor: "white" }
    }
    NumberAnimation on eulerRotation.y {
        from: 0
        to: 360
        duration: 1000
        loops: Animation.Infinite
    }
}

Sélection et instanciation

Picking est un mécanisme permettant de sélectionner un modèle à partir d’une interaction avec l’interface utilisateur. Avec le rendu instancié, il existe plusieurs représentations d’un même modèle ; le résultat de la sélection inclura donc un instance index. La sélection instanciée est activée en définissant la propriété pickable sur le modèle de base.

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