在这篇博客中,我们将探讨近期围绕光照贴图烘焙、全局光照及相关技术所做的改进,这些技术旨在使 Qt Quick 3D 场景呈现更逼真的视觉效果。本文主要聚焦于 Qt 6.10 中新增的光照贴图烘焙优化,同时也会介绍即将发布的 Qt 6.11 版本中的两项新特性:屏幕空间全局光照(SSGI)和屏幕空间反射(SSR)。
随着 Qt 6.10 的发布,Qt Quick 3D 模块在光照贴图烘焙方面实现重大改进。如果您正在使用 QML 构建实时 3D 场景,并希望以更低的运行成本获得更丰富的光照效果,这就是理想选择。在本节中,您会了解什么是光照贴图烘焙、新增特性及其重要意义。
光照烘焙是3D渲染中的一种技术,用于预先计算场景中光线和静态物体的交互效果。
与实时计算的光照、阴影和间接光不同,光照信息会在离线处理的过程中被“烘焙”到特殊的纹理贴图中,即光照贴图。 在运行时,渲染器会对这些纹理进行采样,从而以较低的计算成本为您提供逼真的全局照明、柔和阴影和环境光反射效果。这样不仅能让场景视觉表现更丰富,还能显著提升性能,特别是在 GPU 资源有限的移动设备和嵌入式设备上。
从 Qt 6.4 版本起,该框架已初步支持光照贴图烘焙特性。本文将重点讨论 6.10 中的改进,如需深入了解烘焙的工作原理以及如何在应用程序中实现烘焙,建议您阅读官方 Qt 文档。
下图显示了一个使用烘焙光照的 QtQuick3D 场景。
Qt 6.10 对光照贴图烘焙进行了多项改进,尤其在烘焙操作的易用性和场景设置方面。本文集中讨论其中最重要的几项,并逐一介绍。
6.10 版本中的 Qt Quick 3D 包含一个内置非局部均值(NLM)去噪器,可在光照贴图烘焙后自动运行。NLM 算法通过平均整个图像中的相似区域来减少烘焙光照中的噪点,从而消除光线跟踪过程中的随机噪点。您可以使用新增的 Lightmapper::denoiseSigma 属性来控制其强度 :较低的值会保留更多纹理细节,但会留下更多颗粒感;较高的值会产生更平滑、更干净的效果,但会牺牲一些锐度。这意味着您不再需要手动对光照贴图进行后期处理,因为 Qt Quick 3D 会将去噪处理作为烘焙步骤的一部分。
上图显示了使用有噪点的光照贴图(左)和经过降噪的光照贴图(右)的 Cornell box 场景。
Qt 6.10 版本的 Qt Quick 3D 引入了一种指定生成光照贴图分辨率的新方法。不必为每个模型指定固定的尺寸,而是定义世界空间中单位表面的光照贴图像素的大致数量。这被称为每单位像素数(TPU)。
TPU 在 Lightmapper::texelsPerUnit 或 Model::texelsPerUnit 属性中设置 。这意味着,一个 100x100 的矩形,如果每单位像素值为 1,则大约为 100x100 的像素。这种方法的好处是,在同一场景中添加多个模型时,保持光照贴图尺寸一致以及增减光照贴图尺寸都很容易。请注意,如下图所示,直接阴影的清晰度取决于光照贴图的分辨率。
上图显示的是同一个场景,但每单位像素值不同。左边场景的每单位像素值是右边场景的五倍。
通过 DebugView QML 组件启动光照贴图烘焙时 ,会弹出一个窗口。我们对该窗口进行了改进,可显示进度条和烘焙剩余时间的估计值。用户还可以在烘焙过程中继续与主程序交互。
上图显示了烘焙灯光照贴图时的进度窗口。
Qt 6.10 中的一个显著变化是,新增了 Lightmapper::source 属性,该属性可以指定一个包含场景中所有光照贴图的文件。在旧版本中,光照贴图烘焙中使用的每个模型都会生成一个网格文件和一个光照贴图纹理文件。现在,所有数据都存储在使用 Qt Quick 3D 独有的自定义格式文件中。这不仅简化了工作流程,还能轻松检查该文件。为此 ,我们创建了 一个光照贴图查看器应用程序,使用该程序,您可以检查生成的光照贴图及其对应的模型。
上图显示了光照图查看器和加载的光照图文件。
接下来我们将探讨 Qt Quick 3D 新增的一种技术,作为烘焙光照贴图的替代方案:SSGI(屏幕空间全局照明)是一种实时渲染技术,仅利用屏幕深度缓冲区和颜色缓冲区中的数据即可模拟逼真的间接光照(即光线在表面上的反射)。由于这是一种动态的后处理效果,它不依赖于预制的光照贴图,并能实时响应场景中的动态变化。
在 Qt 6.11 及更高版本中,可通过将 ExtendedSceneEnvironment::ssgiEnabled 设置为 true 来启用 SSGI 。 ExtendedSceneEnvironment 中还有其他属性可用于调整 SSGI 的外观。
上图展示了禁用 SSGI(左)和启用 SSGI(右)的效果对比。请注意当启用 SSGI 时,猴头雕像和窗帘被地板上的反射光照亮。
屏幕空间反射 (SSR) 是另一种与 SSGI 相似的实时渲染技术。与 SSGI 类似,它只使用屏幕深度缓冲区和颜色缓冲区中的可用数据,用于渲染反射效果。其工作原理是通过名为"光线追踪"的技术,检查屏幕中的每个像素点,寻找并混合对应的反射屏幕像素点。
在 Qt 6.11 及更高版本中,可通过将 ExtendedSceneEnvironment::ssrEnabled 设置为 true 来启用 SSR 。
上图展示了禁用 SSR(左)和启用 SSR(右)的效果对比。
如果您已经在使用 Qt Quick 3D 中的光照贴图烘焙功能,我希望 Qt 6.10 能让您看到视觉效果和性能方面的双重提升。如果您还没有尝试过,那么现在正是尝试的最佳时机。 您可以从烘焙光照贴图示例和文档开始。
要试用 SSGI 和 SSR,您可以查阅 ExtendedSceneEnvironmentQML 类型。
希望您喜欢这篇文章,期待看到您使用 Qt 创造的精彩作品!