本页内容

使用基于图像的照明

简介

Qt Quick 3D 支持 IBL(基于图像的照明)技术,用于为场景或单个材质提供照明。

IBL 是一种利用图像为场景提供照明的照明技术。当您希望在室内和室外场景中创建逼真的照明和反射效果时,该技术特别有用。

您可以使用任何图像文件进行 IBL,但建议使用 360º HDR(高动态范围)图像。与 JPEG 或 PNG 图像相比,HDR 图像的动态范围要高得多。更高的动态范围通过从非常亮到非常暗的广泛亮度级别,提供了更逼真的照明效果。

以下示例展示了使用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 的立方贴图文件。随后,可以在 lightProbe 属性的关联Texture 中引用该文件,Qt 便会在运行时加载预生成的立方贴图,而无需进行任何耗时的处理。

手动烘焙

举个例子,假设应用程序使用 .hdr 图像作为其光探针或天空盒:

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

只要运行时环境文件 environment.hdr 可用,这种方式完全可行。然而,加载 .hdr 图像需要进行耗时的预处理。可以通过执行以下操作来避免这一点:

balsam environment.hdr

生成的结果是一个新文件environment.ktx 。将此文件代替 .hdr 文件发布,并修改纹理来源,可显著加快加载速度。

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

通过 CMake 进行构建时烘焙

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

这可以通过使用 Qt6 包中 Quick3D 组件提供的qt_add_lightprobe_images()CMake 函数来实现:

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

将 `application_target ` 替换为相应的目标。 这样一来,就无需再手动对 environment.hdr 运行 balsam,也不需要将 .hdr 文件随应用程序一起发布。相反,在构建过程中会自动调用 balsam,并且会在:/ibl/environment.ktx 路径下向应用程序资源中添加一个 environment.ktx 文件。随后,lightProbe 的Texture 属性需要引用该文件。

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

注意:通过设置 PREFIX,使资源系统中的最终名称路径与 .qml 文件的位置匹配,即可使用相对源路径,而无需使用 qrc 方案提供绝对路径。

除了 PREFIX 之外,还可以使用 BASE 关键字。其行为与qt_add_resources() 一致。例如,以下代码将生成:/ibl/maps/environment.ktx :

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

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

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

注意: FILES 列表中的每一项,都 必须在 OUTPUTS 中有相应的条目。

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