Sur cette page

Qt Quick 3D - Exemple de shaders personnalisés

Illustre l'utilisation de shaders de sommets et de fragments personnalisés.

Cet exemple montre comment utiliser un matériau avec un code de shader de sommet et de fragment entièrement personnalisé.

Sphère aux couleurs de l'arc-en-ciel avec déformation ondulatoire et paramètres de shader

Cet exemple est le pendant de l’exemple « custommaterials », qui illustre l’autre catégorie de matériaux personnalisés : les matériaux « shaded », dans lesquels l’extrait de code de shader vient compléter un « PrincipledMaterial » plutôt que de le remplacer.

Implémentation d’un matériau personnalisé

Dans cet exemple, un maillage est déformé par le shader de sommets selon une fonction sinusoïdale. Le résultat final est contrôlé par deux curseurs correspondant aux valeurs de temps et d’amplitude de la fonction sinusoïdale.

Le shader de fragment est utilisé pour colorer le maillage en fonction des valeurs de position des sommets. Deux shaders de fragment sont fournis : l’un avec texturation et l’autre sans. La version texturée échantillonne une texture provenant soit d’un fichier image, soit d’un calque d’ Qt Quick en temps réel.

Le matériau ne participe pas au système d’éclairage ou d’ombrage par défaut ; sa propriété « shadingMode » est donc définie sur « CustomMaterial.Unshaded ».

Consultez la section « CustomMaterial » pour une description détaillée des fonctionnalités des matériaux personnalisés.

CustomMaterial {
    id: root
    property real time: 0.0
    property real amplitude: 5.0
    property real alpha: 1.0

    property bool texturing: false
    property bool textureFromItem: false
    property Item texSrc
    Texture {
        id: texFromFile
        source: "qt_logo.png"
    }
    Texture {
        id: texFromItem
        sourceItem: root.texSrc
    }
    property TextureInput tex: TextureInput {
        enabled: root.texturing
        texture: root.textureFromItem ? texFromItem : texFromFile
    }

    shadingMode: CustomMaterial.Unshaded
    sourceBlend: root.alpha < 1.0 ? CustomMaterial.SrcAlpha : CustomMaterial.NoBlend
    destinationBlend: root.alpha < 1.0 ? CustomMaterial.OneMinusSrcAlpha : CustomMaterial.NoBlend
    cullMode: CustomMaterial.BackFaceCulling

    vertexShader: "example.vert"
    fragmentShader: root.texturing ? "example_tex.frag" : "example.frag"
}

Utilisation d’un matériau personnalisé

Un matériau personnalisé utilisant des shaders personnalisés s’utilise de la même manière que n’importe quel autre matériau. Les variables uniformes du shader peuvent être facilement mises à jour via des liaisons de propriétés QML.

Model {
    position: Qt.vector3d(0, 0, 0)
    NumberAnimation on eulerRotation.y {
        from: 0
        to: 360
        duration: 3000
        loops: -1
        running: control.animateRotation
    }
    scale: Qt.vector3d(2, 2, 2)
    source: "#Sphere"
    materials: [
        ExampleMaterial {
            id: exampleMaterial
            time: control.time
            amplitude: control.amplitude
            alpha: control.alpha
            texturing: control.texturing
            textureFromItem: control.textureFromItem
            texSrc: Rectangle {
                layer.enabled: true
                layer.textureMirroring: ShaderEffectSource.NoMirroring
                visible: false
                SequentialAnimation on color {
                    ColorAnimation { from: "black"; to: "yellow"; duration: 2000 }
                    ColorAnimation { from: "yellow"; to: "cyan"; duration: 1000 }
                    ColorAnimation { from: "cyan"; to: "black"; duration: 500 }
                    loops: -1
                }
                width: 512
                height: 512
                Image {
                    source: "qt_logo.png"
                    anchors.centerIn: parent
                }
            }
        }
    ]
}

Exemple de projet sur code.qt.io

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