Qt Quick 3D - 预烘焙光照贴图示例

// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtQuick3D
import QtQuick3D.Helpers

Window {
    width: 1280
    height: 720
    title: "Qt Quick 3D Baked Lightmap Example"
    visible: true

    View3D {
        id: root
        anchors.fill: parent

        environment: SceneEnvironment {
            backgroundMode: SceneEnvironment.Color
            clearColor: "black"
        }

        PerspectiveCamera {
            id: camera
            z: 300
            y: 100
        }

        property bool lmEnabled: lmToggle.checked
        property int lightBakeMode: lmToggle.checked ? Light.BakeModeAll : Light.BakeModeDisabled

        PointLight {
            bakeMode: root.lightBakeMode
            y: 190
            brightness: brightnessSlider.value
            castsShadow: true
            shadowFactor: 75
        }

        Box {
            usedInBakedLighting: true
            lightmapBaseResolution: 256
            bakedLightmap: BakedLightmap {
                enabled: root.lmEnabled
                key: "box"
                loadPrefix: "file:"
            }
            scale: Qt.vector3d(100, 100, 100)
        }

        Rectangle {
            color: "lightGray"
            width: 320
            height: 160
            ColumnLayout {
                anchors.centerIn: parent
                CheckBox {
                    id: lmToggle
                    text: "Use lightmaps (fully baked direct+indirect)\nif available"
                    checked: true
                    focusPolicy: Qt.NoFocus
                }
                Text {
                    text: "How to bake lightmaps: \nOpen DebugView -> Tools -> Bake lightmap"
                }
                Text {
                    text: "Slider controls light brightness"
                }
                Slider {
                    id: brightnessSlider
                    value: 5.0
                    from: 0
                    to: 10
                }
            }
        }
    }

    Item {
        width: debugViewToggleText.implicitWidth
        height: debugViewToggleText.implicitHeight
        anchors.right: parent.right
        Label {
            id: debugViewToggleText
            text: "Click here " + (dbg.visible ? "to hide DebugView" : "for DebugView")
            color: "white"
            anchors.right: parent.right
            anchors.top: parent.top
        }
        MouseArea {
            anchors.fill: parent
            onClicked: dbg.visible = !dbg.visible
            DebugView {
                y: debugViewToggleText.height * 2
                anchors.right: parent.right
                source: root
                id: dbg
                visible: false
            }
        }
    }
}