C++用户界面开发框架Qt 6.x入门级指南 - Qt着色器工具

介绍Qt Shader Tools模块建立在 SPIR-V 开源生态系统之上,为了编译成 SPIR-V,使用 glslang,而翻译和反射是通过 SPIRV-Cross 完成的 。
为了允许在 Qt 应用程序和库中编写一次着色器代码,所有着色器都应该用一种语言编写,然后编译成 SPIR-V 。这种着色语言目前是与 Vulkan 兼容的 GLSL,这不同于OpenGL风格的GLSL Qt 5.x所期望的 。
然后通过翻译 SPIR-V 字节码以及反射信息(输入、输出、着色器资源)生成其他着色语言的源代码,例如 GLSL、HLSL 和Metal Shading语言 。特别是对于 GLSL,这还涉及生成多个变体,这意味着适用于不同 GLSL 版本的源代码,例如 GLSL ES 100、GLSL ES 300、GLSL 120、150 等 。然后将其全部打包到可序列化的 QShader 容器对象中,通常以 .qsb 扩展名的文件形式存储在磁盘中 。Qt 渲染硬件接口直接使用 QShader 实例,选择最适合运行时使用的图形 API 的着色器源或字节码,QShader 对象通常从应用程序附带的 .qsb 文件或 Qt 资源系统中的 Qt 本身反序列化 。
一些平台提供将着色器源代码编译为类似于 SPIR-V 的中间格式选项,这涉及运行特定于平台的工具 。对于 Direct 3D,qsb 工具提供了在生成 HLSL 源代码后从 windows SDK 调用 fxc 工具的选项,然后它用 fxc 生成的 DXBC 二进制文件替换 HLSL 源代码 。这可以对应用程序的运行时性能产生积极影响,因为它们不再需要自己进行第一阶段的编译(HLSL 源到 DXBC) 。对于 macOS 和 IOS,XCode SDK 提供了类似的工具,这种方法的缺点是只能在它们各自的平台上运行这些工具 。因此这最适合与 qsb 的 CMake 集成结合使用,因为在应用程序构建时进行着色器调节隐含地带有目标平台所需的知识以及可以调用哪些特定于平台的工具 。
下图描述了调用 qsb 工具期间发生的步骤:

C++用户界面开发框架Qt 6.x入门级指南 - Qt着色器工具

文章插图
 
Qt 着色器调节系统的主要组件有:
  • qsb 命令行工具
  • qsb 工具的 CMake 集成
  • QShader(QtGui 模块的一部分)
  • QShaderBaker(本模块的一部分,相当于 qsb 工具的库)
注意:从 Qt 6.2 开始,C++ API 被认为是私有的,不建议从应用程序直接使用它们,而是直接或间接从 CMake 项目中使用 qsb 命令行工具 。
Qt Quick 的典型用法应用程序开发人员通常需要在 Qt Quick 场景中使用自定义着色器代码,这些场景具有:
  • ShaderEffect项目,或
  • QQuickItem子类将场景图节点与通过子类化QSGMaterial.构建的自定义材质结合使用 。
例如,考虑以下 QML 片段:
【C++用户界面开发框架Qt 6.x入门级指南 - Qt着色器工具】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 自己的框架和工具封装的 。
Qt商用组件推荐