使用基于图像的照明
介绍
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 公司和/或全球其他国家的商标。所有其他商标均为各自所有者的财产。