SkyMaterial QML Type
渲染过程化天空并生成基于图像的照明数据。更多...
| Import Statement: | import QtQuick3D |
| Since: | Qt 6.12 |
属性
- enableIBL : bool
(since 6.12) - fragmentShader : url
(since 6.12) - fragmentShaderCode : string
(since 6.12) - iblRenderFrames : int
(since 6.12) - iblSampleCount : int
(since 6.12) - radianceMapSize : int
(since 6.12) - skyboxMode : enumeration
(since 6.12)
详细说明
SkyMaterial 通过自定义片段着色器代码,将天空环境渲染到立方贴图中。生成的立方贴图可选地经过滤波处理,并用作基于物理的渲染中的基于图像的照明(IBL)。
该着色器会对立方贴图的全部六个面进行计算,可实现任意程序化天空、渐变或解析模型。
生成的立方贴图既可作为可见场景的背景,也可在启用时作为基于图像的照明的光源。
注意: 着色器代码或属性的更改 可能需要一个帧或更长时间才能反映在生成的 IBL 中。
着色器
着色器可以访问内置变量qt_eyeDir (vec3 ),该变量提供从立方贴图中心到当前采样方向的未归一化方向向量。
片段着色器必须定义一个MAIN() 入口点,该入口点将在渲染立方贴图时针对每个生成的片段执行。
最终像素颜色必须写入FRAGCOLOR (vec4 ),这是片元着色器的输出变量。
一个最简的着色器示例:
void MAIN()
{
vec3 dir = normalize(qt_eyeDir);
// Output color (encoded direction as RGB)
FRAGCOLOR = vec4(dir * 0.5 + 0.5, 1.0);
}在 SkyMaterial 上声明的自定义 QML 属性会自动作为统一变量(uniforms)在片段着色器中暴露。属性名称必须与 GLSL 变量名称一致。无需显式声明统一变量。
支持以下类型映射:
| QML 类型 | 着色器类型 | 备注 |
|---|---|---|
| real、int、bool | float、int、bool | |
| color | vec4 | sRGB 被转换为线性空间 |
| vector2d | vec2 | |
| vector3d | vec3 | |
| vector4d | vec4 | |
| 4×4矩阵 | mat4 | |
| 四元数 | vec4 | w 存储标量分量 |
| rect | vec4 | |
| 点,大小 | vec2 | |
| TextureInput | sampler2D |
属性文档
enableIBL : bool [default: true, since 6.12]
确定生成的天空立方贴图是否用于基于图像的照明。
启用后,引擎将生成经过滤波的辐射度图和辐照度图,用于基于物理的渲染中的环境光和反射效果。
若禁用,天空仅作为视觉背景渲染,且不会执行 IBL 预处理。
该属性自 Qt 6.12 起引入。
另请参阅 SceneEnvironment::lightProbe 。
fragmentShader : url [since 6.12]
指定从文件或资源 URL 加载的片段着色器。
如果同时设置了 fragmentShader 和fragmentShaderCode ,则fragmentShaderCode 具有优先级。
如果未指定着色器,则使用内置的调试着色器。
该属性在 Qt 6.12 中引入。
另请参阅 fragmentShaderCode 。
fragmentShaderCode : string [since 6.12]
指定内联片段着色器源代码。
其行为与 `fragmentShader ` 完全一致,并采用相同的执行模型、内置函数以及属性到统一变量的自动映射。
如果同时设置了 `fragmentShader ` 和 `fragmentShaderCode`,则此属性具有优先级。
该属性在 Qt 6.12 中引入。
另请参阅 fragmentShader 。
iblRenderFrames : int [default: 0, since 6.12]
控制IBL预滤波器的工作如何在帧之间分配。
- 0— 所有操作均在同一帧内完成:采样累积、归一化和辐照度计算均在同一帧内进行。
- N ≥ 1—iblSampleCount 样本被分配到 N 个切片帧中(每帧
ceil(iblSampleCount / N)个样本),随后是一个专门的归一化和辐照度帧。
较高的数值将 GGX 预滤波器的计算开销摊销到更多帧上,这在天空变化不频繁且为保证图像质量需要较高“iblSampleCount ”值时非常有用。
注意: 当enableIBL 为false 时,此 属性无效。
该属性在 Qt 6.12 中引入。
另请参阅 iblSampleCount 和enableIBL 。
iblSampleCount : int [default: 32, since 6.12]
针对经过滤波的辐射度图的每个输出纹素,所评估的 GGX 重要性样本总数。较高的数值可减少太阳圆盘等高频特征上的闪烁现象,但会增加生成时间。
数值被限制在 [1, 1024] 范围内。
注意: 当enableIBL 的值为false 时,此 属性无效。
该属性于 Qt 6.12 中引入。
另请参阅 iblRenderFrames 和enableIBL 。
radianceMapSize : int [default: 512, since 6.12]
指定用于基于图像的照明和反射探针的生成的环境立方贴图的分辨率。
较高的数值可提高反射的清晰度和照明质量,特别是对于高光泽材质,但会增加内存占用和渲染开销。
数值将对齐到最接近的 2 的幂,并限制在 [8, 2048] 范围内。
注意:当 skyboxMode 设置为ScreenSpace 值时 ,可见天空将直接在屏幕上进行计算,此属性仅影响IBL/反射立方贴图。当SkyMaterial.Cubemap 时,它还决定了可见背景的清晰度。当enableIBL 为false 、skyboxMode 为ScreenSpace 值且不存在反射探针时,将完全不生成立方贴图。
该属性在 Qt 6.12 中引入。
另请参阅 skyboxMode 和enableIBL 。
skyboxMode : enumeration [default: SkyMaterial.Cubemap, since 6.12]
用于选择SkyMaterial 生成的可见背景效果。
| 常量 | 描述 |
|---|---|
SkyMaterial.Cubemap | 背景会对辐射度立方贴图(即基于图像的照明所使用的同一立方体)进行采样,其分辨率遵循radianceMapSize 的设置。对于静态天空,该立方体仅需渲染一次,随后每帧以较低开销进行采样,因此当只有摄像机在移动时,这是每帧开销最低的方案。锐度上限为radianceMapSize 。 |
SkyMaterial.ScreenSpaceFull | 天空着色器每帧直接在屏幕上以全视口分辨率进行计算(最清晰,成本最高)。 |
SkyMaterial.ScreenSpaceHalf | 直接在屏幕空间内按每个轴半分辨率(像素数量为四分之一)进行计算,然后放大到视口尺寸。 |
SkyMaterial.ScreenSpaceQuarter | 按每个轴四分之一分辨率(像素数为十六分之一)在屏幕空间中直接评估,然后放大到视口。 |
ScreenSpace 模式将可见背景与IBL立方体解耦,最适合动态天空(例如移动的太阳、动画体素云);Cubemap 则最适合静态天空。Cubemap 会强制生成立方贴图,即使enableIBL 的值为false 时也是如此。
该属性自 Qt 6.12 起引入。
另请参阅 radianceMapSize 和enableIBL 。
© 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.