QtShader Tools 概述

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_glslspecification(GL_KHR_vulkan_glslspecification),了解其中的差异。

其他着色语言(如 GLSL、HLSL 和金属着色语言)的源代码是通过翻译 SPIR-V 字节码以及反射信息(输入、输出、着色器资源)生成的。特别是对于 GLSL,这还涉及生成多个变体,即适合不同 GLSL 版本的源代码,如 GLSL ES 100、GLSL ES 300 以及 GLSL 120 和 150。然后将其打包成可序列化的QShader 容器对象,通常以.qsb 文件的形式存储在磁盘上。Qt XML 渲染硬件接口直接消耗QShader 实例,挑选最适合运行时使用的图形 API 的着色器源或字节码。QShader 对象通常是从 Qt 资源系统(Qt Resource System)中与应用程序或 Qt 本身一起装运的.qsb 文件中反序列化出来的。

某些平台提供将着色器源代码编译为类似 SPIR-V 的中间格式的选项。这需要运行特定于平台的工具。在 Direct 3D 中,一旦生成 HLSL 源代码,qsb 工具就会提供从 Windows SDK调用fxc 工具的选项。然后,它将 HLSL 源代码替换为由fxc 生成的DXBC 二进制文件。这将对应用程序的运行性能产生积极影响,因为它们不再需要自己完成编译的第一阶段(HLSL 源代码到 DXBC)。对于 macOS 和 iOS,XCode SDK 也提供了类似的工具。这种方法的缺点是只能在各自的平台上运行这些工具。因此,这种方法最适合与 qsb 的 CMake 集成结合使用,因为在应用程序构建时进行 Shader Tools 调节隐含了有关目标平台以及可以调用哪些特定平台工具的知识。

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

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 文件。应用程序预计会在.qml 文件旁边发送myeffect.frag.qsb 。要从 Vulkan 风格的 GLSL 源生成该文件(该源本身无需与应用程序一起发布),应用程序必须直接或通过 CMake 使用qsb 工具。

典型用法Qt Quick 3D

Qt Quick 3D 直接使用 模块在运行时执行着色器调节。此外,它还提供了在构建时为材质预生成着色器的解决方案,以防运行时依赖着色器编译器和其他工具的情况并不理想。无论哪种情况,开发人员都无需直接使用 工具,因为它已被 自带的框架和工具封装。Shader Tools qsb Qt Quick 3D

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