En esta página

Qt Quick 3D - Ejemplo de sombreadores personalizados

Demuestra el uso de sombreadores de vértices y fragmentos personalizados.

Este ejemplo demuestra el uso de un material con un código de sombreado de vértices y fragmentos completamente personalizado.

Esfera de color arco iris con deformación de onda y ajustes de sombreado

Este ejemplo es la contrapartida del ejemplo custommaterials, que demuestra el otro grupo de materiales personalizados: shaded materiales donde el fragmento de código del shader aumenta un PrincipledMaterial, en lugar de reemplazarlo.

Implementación de un material personalizado

En este ejemplo, una malla es deformada por el sombreador de vértices según una función seno. El resultado final se controla mediante dos deslizadores correspondientes a los valores de tiempo y amplitud de la función seno.

El fragment shader se utiliza para colorear la malla según los valores de posición de los vértices. Se incluyen dos sombreadores de fragmentos: uno con texturizado y otro sin texturizar. La versión texturizada muestrea una textura que proviene de un archivo de imagen o de una capa en vivo de Qt Quick.

El material no participa en el sistema de iluminación o sombreado por defecto, y por lo tanto tiene su propiedad shadingMode establecida a CustomMaterial.Unshaded.

Consulte CustomMaterial para obtener una descripción detallada de las capacidades de los materiales personalizados.

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"
}

Utilización de un material personalizado

Un material personalizado que utiliza shaders personalizados se utiliza de la misma manera que cualquier otro material. Los uniformes en el shader se pueden actualizar fácilmente a través de los enlaces de propiedades 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
                }
            }
        }
    ]
}

Proyecto de ejemplo @ 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.