Qt Quick 3D - Beispiel für kaskadierte Schattenkarten

Demonstriert kaskadierte Shadow Maps.

Dieses Beispiel demonstriert die Verwendung einer DirectionalLight mit kaskadierten Shadowmaps.

Werfen wir einen Blick auf den QML-Code der Szene:

View3D {
    id: view
    x: settings.viewX
    y: 0
    width: parent.width - settings.viewX
    height: parent.height
    camera: camera
    environment: SceneEnvironment {
        clearColor: "lightblue"
        backgroundMode: SceneEnvironment.Color
        antialiasingMode: SceneEnvironment.MSAA
        antialiasingQuality: SceneEnvironment.High
    }

    PerspectiveCamera {
        id: camera
        position: Qt.vector3d(458, 300, 515)
        eulerRotation: Qt.vector3d(-14, 19, 0)
        clipFar: settings.clipFar
    }

    DirectionalLight {
        visible: true
        castsShadow: true
        shadowFactor: settings.shadowFactor
        eulerRotation: settings.eulerRotation
        csmSplit1: settings.csmSplit1
        csmSplit2: settings.csmSplit2
        csmSplit3: settings.csmSplit3
        csmNumSplits: settings.csmNumSplits
        shadowMapQuality: settings.shadowMapQuality
        csmBlendRatio: settings.csmBlendRatio
        shadowBias: settings.shadowBias
        pcfFactor: settings.pcfFactor
        softShadowQuality: settings.softShadowQuality
        shadowMapFar: settings.shadowMapFar
        lockShadowmapTexels: settings.lockShadowmapTexels
    }

    Model {
        id: ground
        source: "#Cube"
        scale: Qt.vector3d(25, 0.01, 135)
        z: -5500
        materials: PrincipledMaterial {
            baseColor: "gray"
        }
        castsShadows: false
    }

    Node {
        id: shapeSpawner
        Component.onCompleted: {
            var conesAndCylinderTrio = Qt.createComponent("ConesAndCylinderTrio.qml")
            var z_pos = 0
            for (var i = 0; i < 25; i++) {
                conesAndCylinderTrio.incubateObject(shapeSpawner, {
                                                    "z_positions": [
                                                            z_pos,
                                                            z_pos - 125,
                                                            z_pos - 250
                                                        ]})
                z_pos -= 450
            }
        }
    }
}

Die Szene besteht aus einer DirectionalLight, einer PerspectiveCamera, einem Boden Model und einem langen Array von Kegeln und Zylindern Models. Dieses lange Array ist so angeordnet, um zu zeigen, wie Kaskaden dazu beitragen können, die grafische Treue der Szene zu verbessern. Mit nur einer Schattenkarte werden Artefakte verursacht, aber mit Kaskaden können diese behoben werden. DirectionalLight enthält eine Vielzahl von Eigenschaften, die über ein Einstellungsfenster in der Benutzeroberfläche angepasst werden können.

Weitere Informationen zu den verschiedenen Eigenschaften finden Sie im Artikel Shadow Mapping, und Sie können das Beispiel ausprobieren, um zu sehen, wie sie zusammenwirken.

Beispielprojekt @ code.qt.io

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