本页内容

使用Qt Quick 3D

着色器与3D材质

渲染带有材质的3D对象涉及顶点着色器和片段着色器。

在 3D 场景的生命周期内首次遇到某种材质时,运行时会发生以下情况:

  • 生成着色器源代码。
  • 着色器将通过标准的 Qt 着色器管道进行处理。处理结果包括着色器的中间字节码版本(SPIR-V)、针对其他 3D API 的多种源代码变体(如 OpenGL 的 GLSL、Direct3D 的 HLSL 等)以及附加元数据。
  • 当 3D 引擎创建graphics pipeline 时,会选择适合所用 3D API 的字节码或源代码变体,随后底层 3D API 通常会执行第二阶段编译,以生成针对实际 GPU 指令集的代码。

所有这些操作加起来可能非常耗时。为了避免在应用程序后续运行中出现这种情况,采用了两个基于磁盘的持久缓存。

低级缓存

Qt Quick 3D 基于Qt Quick 和场景图构建。在对OpenGL程序二进制文件、Vulkan管道等进行基于磁盘的持久化缓存时,会使用相同的基础架构。

有关此内容的详细讨论,请参阅QQuickGraphicsConfiguration#Pipeline Cache Save and Load 。

默认情况下,着色器磁盘缓存处于启用状态。这意味着,即使平台或 3D API 实现本身不执行对编译后着色器的持久化缓存,Qt 仍可能存储在QQuickWindow 生命周期内收集到的 OpenGL 程序二进制文件或类似资源。 数据会在窗口关闭时写入磁盘,并在应用程序下次运行时重新加载。这样,如果渲染器曾在应用程序之前的运行中出现过,则图形管道的创建速度可能会显著加快。

用于3D材质和后处理效果的着色器也参与其中。

材质着色器缓存

与Qt Quick 不同,Qt Quick 3D 目前依赖于运行时生成 3D 材质和特效的着色器源代码。使用Shadergen 工具的情况是个例外,但该功能尚处于实验阶段,目前不建议在生产环境中使用。

生成着色器源代码并执行第一阶段的编译和转译(详情请参见Qt XMLShader Tools)可能是一项耗时的操作。对于 2D 材质和特效,这通常在构建时完成,而对于 3D 材质和特效,目前尚无法实现。

因此,Qt Quick 3D 采用了另一种基于磁盘的缓存。该缓存用于存储已生成的 3D 材质和特效的资源。

这意味着,结合低级缓存,当应用程序在后续运行中再次遇到包含该材质的 3D 场景时,该材质此前已在应用程序的运行中出现过,因此不会引发耗时且阻塞的操作。

注意: 与低级着色器和管道缓存一样 ,这需要一个可写文件系统,并且平台必须通过QStandardPaths 提供一个可写的缓存位置。

应用程序属性Qt::AA_DisableShaderDiskCache 及其对应的环境变量同样适用于材质着色器缓存。一旦设置,Qt 的低级缓存和Qt Quick 3D 的材质缓存都将被禁用。

注意: qml 工具 默认会设置此属性。若要获得与独立 Qt 应用程序完全一致的行为,请传递--enable-shader-cache 命令行参数。

启用日志类别qt.quick3d.cache ,可在运行时输出有关 3D 材质缓存的一些信息。

© 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.