Qt 6.12 中,SkyMaterial 就是极限

Qt 6.12 中,SkyMaterial 就是极限

💡 原文英文,约1300词,阅读约需5分钟。
📝

内容提要

Qt Quick 3D 6.12 新增 SkyMaterial 类型,支持用自定义片段着色器渲染天空并据此计算基于图像的光照(IBL),使天空同时作为背景和光源,可实现动态天空、昼夜循环、云和星空等效果。QML 属性会自动传入着色器,属性更新时天空重新渲染。使用时将 SceneEnvironment 的 backgroundMode 设为 SkyMaterial 并指定 skyMaterial;默认以立方体贴图渲染并启用 IBL,若天空每帧变化且无需 IBL,可改用屏幕空间模式。文中还演示了可控制天空、地面颜色和太阳位置的程序化天空。

🔎

延伸解读

天空即光源:IBL 让背景参与照明

SkyMaterial 的核心在于将天空渲染与基于图像的光照(IBL)绑定。默认启用 IBL 时,天空立方体贴图会被过滤为辐射度和辐照度贴图,后者直接照亮场景中的物体,使每个面呈现所对天空区域的颜色。这意味着天空不仅是视觉背景,还实际影响材质表现,适合需要环境光一致性的场景。

动态天空的性能取舍:立方体贴图 vs 屏幕空间

默认的 Cubemap 模式只渲染一次天空并采样,适合静态天空;若天空每帧变化且无需 IBL,可关闭 enableIBL 并改用 ScreenSpaceFull/Half/Quarter 模式,让着色器直接在全屏、半屏或四分之一屏运行。但屏幕空间模式每帧都会执行,即使内容不变,因此静态天空用默认模式更省。

属性自动映射为着色器 uniform,驱动动态效果

SkyMaterial 支持 real、int、bool、color、向量、矩阵和纹理等 QML 类型,这些属性会自动作为 uniform 传入片段着色器。属性更新时天空重新渲染,因此可通过动画驱动属性实现旋转天空、昼夜循环等效果。但每次更新都会触发立方体贴图和 IBL 重算,提高 radianceMapSize 或 iblSampleCount 会增加开销,需按性能预算调整。

❓

Q&A

Qt 6.12 的 SkyMaterial 是什么?它有什么作用?

SkyMaterial 是 Qt Quick 3D 6.12 新增的 QML 类型,允许用自定义片段着色器渲染场景天空,并基于该天空计算图像光照(IBL)。这样天空既是可见背景,也是场景光源,可用于创建动态天空、移动太阳、昼夜循环、云和星空等效果。

如何在 Qt Quick 3D 场景中使用 SkyMaterial?

需要将 SceneEnvironment 的 backgroundMode 设置为 SceneEnvironment.SkyMaterial,并将 skyMaterial 属性指向一个 SkyMaterial 对象。例如在 SceneEnvironment 中设置 backgroundMode: SceneEnvironment.SkyMaterial 和 skyMaterial: SkyMaterial { ... }。

SkyMaterial 的着色器如何获取 QML 中定义的属性?

在 SkyMaterial 上设置的兼容 QML 属性(如 real、int、bool、color、向量、矩阵、纹理等)会自动作为 uniform 变量传入自定义着色器。当属性更新时,SkyMaterial 会重新渲染,从而实现动态天空。

SkyMaterial 的 skyboxMode 和 enableIBL 默认值是什么?它们有什么影响?

skyboxMode 默认为 SkyMaterial.Cubemap,天空被渲染到立方体贴图的六个面;enableIBL 默认为 true,会将立方体贴图过滤为辐射度和辐照度贴图用于 IBL。辐照度贴图用于照亮场景中的物体。

如果天空每帧都在变化且不需要 IBL,应该如何优化性能?

可以设置 enableIBL 为 false,并将 skyboxMode 改为 SkyMaterial.ScreenSpaceFull、ScreenSpaceHalf 或 ScreenSpaceQuarter。这样不会渲染立方体贴图和 IBL,天空着色器直接以全、半或四分之一分辨率在屏幕上运行。但注意屏幕空间模式每帧都会执行,即使天空不变;对于静态天空,默认的 Cubemap 模式更高效。

如何用 SkyMaterial 实现一个程序化天空(包含天空、地面和太阳)?

通过定义颜色属性(如 skyTopColor、skyHorizonColor、groundBottomColor 等)、太阳位置属性(sunLatitude、sunLongitude)以及曲线和能量参数,并在片段着色器中根据视线方向计算颜色混合和太阳光晕。所有属性自动传入着色器,属性变化时天空重新渲染。

🏷️

标签

➡️

继续阅读