使用基于图像的照明

介绍

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

IBL 是一种照明技术,允许用图像照亮场景。这对于在室内和室外场景中创建逼真的照明和反射非常有用。

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

以下示例展示了使用 HDR 图像与单方向光相比,对对象照明效果的影响

灯光平滑介电材料粗糙介电材料平滑金属材料粗糙金属材料
单方向光

基于图像的照明

场景照明

要使用图像照亮场景,您需要在场景中将图像作为纹理添加到lightProbe属性。

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

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

注意:您也可以将 IBL 与任何其他光源相结合,以增强对象的照明效果。

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

  • 曝光 光照探针发出的光的量。
  • 地平线截止 增加该值会给环境的下半部分添加黑暗(黑色),迫使照明主要来自图像的顶部(并从下半部分删除特定的反射)。
  • 方向 当定义光照探针的方向时,该属性。方向以 x、y 和 z 轴上的度数形式定义的欧拉角来表示。
属性金属材料介电材料
默认设置

曝光

地平线截止

方向

材质照明

要仅对一个材质而不是整个场景使用图像照明,或者为已经由图像照明照亮的模型使用单独的光照探针,请将图像设置为材质的light probe

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

预生成 IBL 立方体贴图

当使用 IBL 时,应用程序需要生成 IBL 图像的立方体贴图。默认情况下,这发生在应用程序启动时,并且可能相当慢,尤其是在嵌入式和移动设备上。因此,可以使用 `Balsam` 预生成这个立方体贴图。只需用 .hdr 文件作为输入运行 `Balsam`,它将输出一个与输入同名但以 ktx 为扩展名的立方体贴图文件。然后可以在光探针属性关联的 `纹理` 中引用此文件,Qt 将在运行时无需任何昂贵处理的情况下加载预生成的立方体贴图。

手动烘焙

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

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

这是完全功能的,假设在运行时环境.hdr 是可用的。然而,加载 .hdr 图像涉及到昂贵的预处理。这可以通过运行

balsam environment.hdr

结果是一个新的文件 environment.ktx。用此文件代替 .hdr 文件,并更改纹理源可以显著加快加载速度。

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

通过 CMake 构建时间烘焙

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

这是通过使用 Qt6 软件包快速 3D 组件提供的 `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 {
    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 中有一个相应的条目。

© 2024 Qt 公司有限。此处包含的文档贡献是各自所有者的版权。此处的文档是在自由软件开发基金会发布的 GNU 自由文档许可 version 1.3 条件下提供的。Qt 和相关徽标是芬兰的 Qt 公司和/或全球其他国家的商标。所有其他商标均为各自所有者的财产。