本页内容

Shader Tools Qt XML-ph-0000@deepl.internal 概述

QtShader Tools 模块基于Khronos SPIR-V 网站所述的 SPIR-V 开源生态系统。编译为 SPIR-V 时使用glslang,而转换和反射则通过SPIRV-Cross 实现。

为了在 Qt 应用程序和库中实现“一次编写,多处使用”的着色器代码,所有着色器均应使用单一语言编写,随后编译为 SPIR-V。目前,该着色语言是与 Vulkan 兼容的 GLSL。这与 Qt 5.x 中采用的 OpenGL 风格 GLSL 有所不同。 有关差异的概述,请参阅GL_KHR_vulkan_glsl规范。

随后,通过转换 SPIR-V 字节码并结合反射信息(输入、输出、着色器资源),生成其他着色语言(如 GLSL、HLSL 和 Metal 着色语言)的源代码。 特别是对于 GLSL,这还涉及生成多种变体,即适用于不同 GLSL 版本(如 GLSL ES 100、GLSL ES 300 以及 GLSL 120 和 150)的源代码。随后,这些内容会被打包到可序列化的 `QShader ` 容器对象中,通常以 `.qsb ` 文件的形式存储在磁盘上。 Qt渲染硬件接口会直接使用QShader 实例,并根据运行时所使用的图形API,选择最合适的着色器源代码或字节码。QShader 对象通常是从应用程序或Qt自身在Qt资源系统中随附的.qsb 文件中反序列化而来的。

某些平台提供了将着色器源代码编译为类似 SPIR-V 的中间格式的选项。这需要运行特定的平台工具。对于 Direct 3D,qsb 工具提供了一项功能:在生成 HLSL 源代码后,可调用Windows SDK 中的 fxc 工具。 随后,它会将 HLSL 源代码替换为由fxc 生成的DXBC 二进制文件。这可以提升应用程序的运行时性能,因为应用程序不再需要自行执行第一阶段的编译(HLSL 源代码到 DXBC)。对于 macOS 和 iOS,XCode SDK 提供了类似的工具。 这种方法的缺点是,这些工具只能在各自的平台上运行。因此,最适合将其与 qsb 的 CMake 集成结合使用,因为在应用程序构建时进行着色器条件处理,隐含地需要了解目标平台以及可以调用的平台特定工具。

下图描述了调用 `qsb ` 工具时的步骤:

从 Vulkan GLSL 源代码到打包的 QShader 文件的着色器处理流程图,展示了编译、转换以及可选步骤

Qt着色器条件处理系统的主要组件包括:

  • qsb 命令行工具
  • qsb 工具的 CMake 集成
  • QShader (QtGui 模块的一部分)
  • QShaderBaker (该模块的一部分,相当于qsb 工具的库版本)

典型用法Qt Quick

应用程序开发人员通常在包含以下任一类型的Qt Quick 场景中处理自定义着色器代码:

例如,请看以下 QML 代码片段:

ShaderEffect {
    width: 100; height: 100
    fragmentShader: "myeffect.frag.qsb"
}

此处的fragmentShader URL指向相对于.qml 文件所在位置的.qsb 文件。应用程序应将myeffect.frag.qsb 文件与.qml 文件一同发布。若要从Vulkan风格的GLSL源代码(该源代码本身无需随应用程序发布)生成该文件,应用程序必须直接或通过CMake使用qsb 工具。

典型用法:Qt Quick 3D

Qt Quick 3D 直接使用Shader Tools 模块在运行时执行着色器条件处理。 此外,它还提供了在构建时预生成材质着色器的解决方案,以应对运行时依赖着色器编译器及其他工具的情况(这种情况通常被视为不理想)。无论哪种情况,开发人员都不需要直接操作qsb 工具,因为该工具已被Qt Quick 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.