Qt Quick 3D - Beispiel für kaskadierte Schattenkarten

Veranschaulicht kaskadierte Schattenkarten.

Eine Reihe schwarzer Kegel und Zylinder, die lange Schatten werfen, mit einem kaskadierten Einstellungsfeld für die Schattenkarte

Dieses Beispiel zeigt, wie man einen „ DirectionalLight “ mit kaskadierten Schattenkarten verwendet.

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

    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.LeftButton
        propagateComposedEvents: true
        onClicked: {
            settings.drawerVisible = false
            wasd.forceActiveFocus() // focus WASD controller for keyboard input
        }
    }
}

Die Szene besteht aus einem „ DirectionalLight “, einem „ PerspectiveCamera “, einem „floor Model “ sowie einer langen Reihe von Kegeln und Zylindern („ Model“). Diese lange Reihe ist so angeordnet, um zu zeigen, wie Kaskaden dazu beitragen können, die grafische Wiedergabegenauigkeit der Szene zu verbessern. Mit nur einer Schattenkarte würden Artefakte entstehen, die sich jedoch durch Kaskaden beheben lassen. Der „ DirectionalLight “ enthält zahlreiche Eigenschaften, die über einen Einstellungsbereich in der Benutzeroberfläche angepasst werden können.

Dem Leser wird empfohlen, den Artikel zum Thema „Shadow Mapping“ zu lesen, um weitere Informationen zu den verschiedenen Eigenschaften zu erhalten, und das Beispiel auszuprobieren, um zu sehen, wie diese zusammenwirken.

Beispielprojekt @ 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.