使用基于图像的照明

简介

Qt Quick 3D 图像引擎支持 IBL(基于图像的照明)来照明场景或单个材质。

IBL 是一种照明技术,可通过图像对场景进行照明。当你想在室内和室外场景中创建逼真的照明和反射时,这种方法尤其有用。

您可以使用任何图像文件进行 IBL,但建议使用 360º HDR(高动态范围)图像。HDR 图像的动态范围远高于 JPEG 或 PNG 图像。更高的动态范围可以通过从非常亮到非常暗的大范围亮度水平提供更逼真的照明效果。

下面的示例演示了使用 HDR 图像与单一方向光线对物体进行照明的效果:

光线光滑介电材料粗糙电介质材料光滑金属材料粗糙金属材料
单向光

图像光

场景照明

要使用图像照明scene ,您需要将图像作为Texture 添加到lightProbe 属性。

lightProbe: Texture {
    source: "maps/OpenfootageNET_garage-1024.hdr"
}

选择图像后,就可以为场景设置 IBL。默认情况下,场景中的所有模型都会被光探针照亮。

注: 您也可以将 IBL 与任何其他光源相结合,以完善物体上的照明效果。

现在您已经为场景设置了 IBL,让我们来看看探针的不同属性。在许多情况下,默认值可以提供令人满意的效果,但您可以根据图像和所需效果调整以下属性值:

  • Exposure 探针发出的光量。
  • Horizon Cut-Off 增加该值会使环境的下半部分变暗(黑色),迫使光线主要来自图像的顶部(并消除下半部分的特定反射)。
  • Orientation 该属性定义了探针的方向。方向是以 x、y 和 z 轴上的欧拉角为单位定义的。
属性金属材料介质材料
默认设置

曝光

水平截止

方向

材质照明

若要只在一个材质上而不是整个场景中使用基于图像的照明,或对已经使用基于图像的照明的模型使用单独的探针,请将图像设置为材质的light probe

完成上述步骤后,您就为材质设置了一个单独的探针。如果指定了场景光探针,该光探针将覆盖场景光探针。

预生成 IBL 立方体地图

使用 IBL 时,应用程序需要为 IBL 图像生成立方体贴图。默认情况下,这发生在应用程序启动过程中,速度可能相当慢,尤其是在嵌入式和移动设备上。因此,可以使用Balsam 预先生成立方体图像。只需将 .hdr 文件作为输入运行Balsam,它就会输出一个与输入文件同名但扩展名为 ktx 的 cubemap 文件。然后,我们可以在 lightProbe 属性的相关Texture 中引用该文件,Qt XML 就会加载预生成的立方体贴图,而无需在运行时进行任何代价高昂的处理。

手动烘烤

举例来说,假设应用程序使用 .hdr 图像来制作光线探针或天空盒:

View3D {
    environment: SceneEnvironment {
        backgroundMode: SceneEnvironment.SkyBox
        lightProbe: Texture {
            source: "environment.hdr"
        }
        probeOrientation: Qt.vector3d(0, -90, 0)
    }
    // ...
}

如果运行时环境.hdr 可用,则功能完全正常。但是,加载 .hdr 图像需要进行昂贵的预处理。通过运行.hdr,可以避免这种情况:

balsam environment.hdr

运行后会生成一个新文件environment.ktx 。使用该文件代替 .hdr 文件并更改纹理源,可大大加快加载速度。

lightProbe: Texture {
    source: "environment.ktx"
}

通过 CMake 在构建时烘焙

在资产上手动运行 balsam 并不总是理想的选择。因此,建议应用程序在构建时依靠 CMake 自动执行相同的任务。

具体方法是使用 Qt6 软件包中 Quick3D 组件提供的 qt6_add_lightprobe_images CMake 函数:

...
find_package(Qt6 COMPONENTS Quick3D)
...
qt6_add_lightprobe_images(application_target "ibl_assets"
    PREFIX
        "/ibl"
    FILES
        "environment.hdr"
)

用适当的目标替换application_target 。在这里,不再需要在 environment.hdr 上手动运行 balsam,.hdr 文件也无需随应用程序一起提供。相反,在构建过程中,balsam 将被自动调用,environment.ktx 将被添加到:/ibl/environment.ktx 的应用程序资源中。lightProbe 的Texture 需要引用该文件。

lightProbe: Texture {
    source: "qrc:/ibl/environment.ktx"
}

注意: 设置 PREFIX 后,资源系统中的最终名称路径与 .qml 文件的位置相匹配,这样就可以使用相对源路径,而不必使用 qrc 方案提供绝对路径。

除 PREFIX 外,还可使用关键字 BASE。其行为与 qt6_add_resources 相同。例如,以下代码会生成:/ibl/maps/environment.ktx

qt6_add_lightprobe_images(application_target "ibl_assets"
    PREFIX
        "/ibl"
    BASE
        "../data/shared"
    FILES
        "../data/shared/maps/environment.hdr"
)

与 qt6_add_shaders 一样,OUTPUTS 关键字也可用于为资源系统中的文件指定完全自定义的名称。例如,以下代码也会生成:/ibl/maps/environment.ktx

qt6_add_lightprobe_images(application_target "ibl_assets"
    PREFIX
        "/ibl"
    FILES
        "../data/shared/maps/environment.hdr"
    OUTPUTS
        "maps/environment.ktx"
)

注意: 对于 FILES 列表中的每个条目,OUTPUTS 中必须有一个对应的条目。

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