Qt6 中如何使用 qsb

article/2025/11/7 20:41:20

【写在前面】

        Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出,市场发生了巨大变化。现在,Qt 6 加入了大量不同平台的图形 API,以确保用户可以在所有平台上以最高性能运行 Qt。

        在 Qt Quick 中的所有 3D 图形现在都基于称为 RHI(渲染硬件接口)的 3D 图形新抽象层之上。RHI 使 Qt 可以使用基础 OS /平台的本机 3D 图形 API。因此,默认情况下,Qt Quick 现在将在 Windows 上使用Direct3D,在 macOS 上使用 Metal。有关详细信息,请参阅有关 RHI 的博客文章系列。 

        Qt 中的 OpenGL 特定类仍然存在,但现在已从 QtOpenGL 模块中的 QtGui 中移出。此外,Qt 6 还添加了一个名为 QtShaderTools ( Qt 着色器工具 ) 的新模块,以跨平台的方式处理这些 API 的不同着色语言。


【qsb详细说明】

        qsb 是 Qt 着色器工具模块提供的命令行工具。

        它集成了第三方库,如 glsland SPIRV-Cross,可以选择调用外部工具,如 fxc 或 SPIRV-opt,并生成 .qsb 文件。此外,它还可用于检查 .qsb 包的内容。

简单提一下:

        glsland 是用于将 GLSL 转换为 SPIR-V 的工具。

        SPIRV-Cross 是用于将 SPIR-V 解析和转换为其他着色器语言的工具。

        Qt 着色器工具模块构建在 Khronos SPIR-V 网站上描述的 SPIR-V 开源生态系统上。为了编译成 SPIR-V,使用 glsland,而翻译和反射是通过 SPIRV-Cross 完成的。

        为了允许在 Qt 应用程序和库中编写一次着色器代码,所有着色器都应该用一种语言编写,然后编译成SPIR-V。目前,这种 shanding 语言是与 Vulkan 兼容的 GLSL。这与 OpenGL 风格 GLSL Qt 5.x 预期的不同。有关差异的概述,请参阅 GL_KHR_vulkan_glsl 规范。

        然后通过翻译 SPIR-V 字节码以及反射信息(输入、输出、着色器资源)生成其他着色语言(如 GLSL、HLSL 和金属着色语言)的源代码。

        特别是对于 GLSL,这还涉及生成多个变体,这意味着源代码适用于不同的 GLSL 版本,例如 GLSL ES 100、GLSL ES 300、GLSL 120、150等。然后将所有这些都打包到可序列化的 QShader 容器对象中,通常以扩展名为 .qsb 的文件形式存储在磁盘中。

        Qt 渲染硬件接口( RHI )直接使用 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 工具期间发生的步骤:

        Qt 着色器调节系统的主要组件包括:

        - qsb命令行工具

        - CMake集成qsb工具

        - QShader(QtGui模块的一部分)

        - QShaderBaker(本模块的一部分,与 qsb 工具等效的库)

        注意:从 Qt 6.2 开始,C++API 被认为是私有的。不建议从应用程序直接使用它们。相反,直接或间接从 CMake 项目使用 qsb 命令行工具。


【正文开始】

        上面巴拉巴拉讲了一大坨,我们不需要过于关心,只需要知道:Qt 6 以后,对于 Qt Quick 不再直接使用各个图形 API 的着色器语言,而是使用一种 .qsb 的文件,这个文件由 qsb.exe 工具生成,它包含了各个图形 API 使用的字节码。

        通过使用 qsb,我们便可以自由切换硬件渲染后端而无需写多个平台的着色器代码。

        另一方面,.qsb 文件主要由 Qt Scene Graph Qt3D 使用,当然,Qml 中相关的组件也同样使用,例如:ShaderEffect

        因此,本篇使用前一篇的圣诞树作为例子来教大家如何使用。

        首先,因为现在是 Qt6,所以需要使用 qsb.exe glsl 文件生成 .qsb 文件:

        qsb.exe 工具的位置位于编译套件目录下的 bin 文件夹中,比如 Qt\6.2.0\msvc2019_64\bin,接着,我们敲入命令:

qsb.exe --glsl "450 es,120,150" --hlsl 50 --msl 12 -o christmas_tree_lights.vert.qsb .\christmas_tree_lights.vert

qsb.exe --glsl "450 es,120,150" --hlsl 50 --msl 12 -o christmas_tree_lights.frag.qsb .\christmas_tree_lights.frag

        将分别生成 christmas_tree_lights.vert.qsb 和 christmas_tree_lights.frag.qsb,这是顶点&片段着色器对应的各个平台着色器的字节码。

        命令具体的意义很简单,也可以使用 qsb --help 来获取帮助、

        接着,上篇 ShaderEffect vertexShader fragmentShader 文件名需要更改:

import QtQuick
import QtQuick.WindowWindow {id: rootwidth: 1280height: 900visible: truetitle: qsTr("Christmas tree lights")ShaderEffect {anchors.fill: parentvertexShader: "file:./glsl/christmas_tree_lights.vert.qsb"fragmentShader: "file:./glsl/christmas_tree_lights.frag.qsb"property vector3d iResolution: Qt.vector3d(root.width, root.height, 0)property real iTime: 0Text {text: "Time: " + parent.iTime.toFixed(2)color: "white"}Timer {running: truerepeat: trueinterval: 10onTriggered: parent.iTime += 0.01;}}
}

        导入 qsb 即可。

        当然,要生成 qsb,我们的 glsl 需要改为 GL_KHR_vulkan_glsl,其规范链接:GLSL/GL_KHR_vulkan_glsl.txt at master · KhronosGroup/GLSL · GitHubGLSL Shading Language Issue Tracker. Contribute to KhronosGroup/GLSL development by creating an account on GitHub.https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_vulkan_glsl.txt        顶点着色器 christmas_tree_lights.vert 改为:

#version 450layout(location = 0) in vec4 qt_Vertex;
layout(location = 1) in vec2 qt_MultiTexCoord0; //未使用
layout(location = 0) out vec4 fragCoord;
layout(std140, binding = 0) uniform buf {mat4 qt_Matrix;
};void main()
{fragCoord = qt_Vertex;gl_Position = qt_Matrix * qt_Vertex;
}

        因为 ShaderEffect 有一些默认的输入,即便没有使用也需要写全。

        片段着色器 christmas_tree_lights.frag 改为:

#version 450layout(location = 0) in vec2 fragCoord;
layout(location = 0) out vec4 fragColor;
layout(std140, binding = 0) uniform buf {mat4 qt_Matrix;float qt_Opacity;vec3 iResolution; // viewport resolution (in pixels)float iTime;      // shader playback time (in seconds)
};const float pi = 3.1415927;
const float dotsnbt = 90.0; // Number of dots for the tree
const float dotsnbs = 20.0; // Number of dots for the star (per circle)vec3 hsv2rgb (vec3 hsv) { // from HSV to RGB color vectorhsv.yz = clamp (hsv.yz, 0.0, 1.0);return hsv.z * (1.0 + 0.63 * hsv.y * (cos (2.0 * 3.14159 * (hsv.x + vec3 (0.0, 2.0 / 3.0, 1.0 / 3.0))) - 1.0));
}void mainImage(out vec4 fragColor, in vec2 fragCoord) {float time = iTime;float mx = max(iResolution.x, iResolution.y);vec2 scrs = iResolution.xy / mx;vec2 uv = vec2(fragCoord.x, iResolution.y - fragCoord.y) / mx;//vec2 m = vec2(mouse.x / scrs.x, mouse.y * (scrs.y / scrs.x));vec2 pos = vec2(0.0);               // Position of the dotsvec3 col = vec3(0.0);               // Color of the dotsfloat intensitys = 1.0 / 4000.0;    // Light intensity for the starfloat intensityt = 1.0 / 2000.0;    // Light intensity for the treefloat scale = 0.2;                  // Size of the star/*** Star ***/for(float i = 0.0 ; i < dotsnbs; i++){pos = vec2(cos(time * 0.2) / 20.0 * cos(2.0 * pi * i / dotsnbs),0.15 * sin(2.0 * pi * i / dotsnbs)) * scale;pos += vec2(scrs.x / 2.0, scrs.y * 0.11);col += hsv2rgb(vec3(i / dotsnbs, distance(uv, pos) * (1.0 / intensitys), intensitys / distance(uv, pos)));pos = vec2(0.12 * cos(2.0 * pi * i / dotsnbs + time * 0.2),0.08 * sin(2.0 * pi * i / dotsnbs)) * scale;pos += vec2(scrs.x / 2.0, scrs.y * 0.11);col += hsv2rgb(vec3(1.0 - i / dotsnbs, distance(uv, pos) * (1.0 / intensitys), intensitys / distance(uv, pos)));pos = vec2(0.12 * cos(2.0 * pi * i / dotsnbs + time * 0.2),-0.08 * sin(2.0 * pi * i / dotsnbs)) * scale;pos += vec2(scrs.x / 2.0, scrs.y * 0.11);col += hsv2rgb(vec3(i / dotsnbs, distance(uv, pos) * (1.0 / intensitys), intensitys / distance(uv, pos)));}/*** Tree ***/float angle = dotsnbt * 1.8; // Angle of the conefor(float i = 0.0 ; i < dotsnbt ; i++){pos = vec2(scrs.x / 2.0 + sin(i / 2.0 - time * 0.2) / (3.0 / (i + 1.0) * angle),scrs.y * ((i) / dotsnbt + 0.21) * 0.80);col += hsv2rgb(vec3(1.5 * i / dotsnbt + fract(time / 4.0), distance(uv, pos) * (1.0 / intensityt), intensityt / distance(uv, pos)));}fragColor = vec4( col, 1.0 );
}void main() {mainImage(fragColor, vec2(fragCoord.x, iResolution.y - fragCoord.y));
}

        运行的效果与前篇一致:


【结语】

        最后,如果需要完整代码或者了解 ShaderEffect 的用法,可以看看前篇:

Qml 中用 Shader 实现圣诞树旋转灯_梦起丶的博客-CSDN博客2022年圣诞节到来啦,很高兴这次我们又能一起度过~这次给大家带来一个简单漂亮圣诞树灯。当然了,本篇文章主要是讲解一下如何在 Qml 中使用GLSL来实现自己的特效。至于代码嘛,我比较喜欢在Shaderjoy上寻找,那里有很多超级炫酷的着色器实现的特效,并且可以很轻松的集成到 Qml 中。https://blog.csdn.net/u011283226/article/details/128429822?spm=1001.2014.3001.5501


http://chatgpt.dhexx.cn/article/RT4ZF8bN.shtml

相关文章

MyBatis十:逆向工程(QBC风格)

逆向工程 一、创建逆向工程 创建依赖pom.xml <packaging>jar</packaging><!-- 依赖MyBatis核心包 --> <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5…

QBC 查询

当使用 hibernate 的 QBC 进行查询的时候&#xff0c;无需写 sql 语句&#xff0c;使用的是 Criteria 对象中的方法进行的实现&#xff0c;创建 Criteria 对象的时候&#xff0c;需要传入一个实体类.class&#xff0c;会自动关联该实体类对应的数据库表。 一&#xff1a;查询所…

Hibernate--QBC举例+详解(一)

QBC检索 QBC&#xff08;Query By Criteria&#xff09;是Hibernate提供的另一种检索对象的方式&#xff0c;它主要由Criteria接口、Criterion接口和Expression类组成。 Criteria接口是Hibernate API中的一个查询接口&#xff0c;它需要由session进行创建。一个单独的查询就是…

统一软件开发过程(RUP)的概念和方法

统一软件开发过程&#xff08;Rational Unified Process,RUP)是一种面向对象且基于网络的程序开发方法论。 根据Rational(Rational Rose和统一建模语言的开发者)的说法&#xff0c;好像一个在线的指导者&#xff0c;它可以为所有方面和层次的程序开发提供指导方针&#xff0c;…

程序员技术开发委托合同模板 私活模板

---需要电子word版&#xff0c;请关注--------- 回复&#xff1a;私活 含税与不含税计算工具&#xff1a; 假设税率是6% 不含税金额&#xff1d;总金额/1.06 税额&#xff1d;不含税金额0.06 增值税在线计算器&#xff1a;http://www.ab126.com/goju/7332.html 大小写转换&…

软件开发模型

1.1大爆炸模型 大爆炸默认是相对简单的开发模型&#xff0c;在开发过程中&#xff0c;没有什么规范和计划&#xff0c;更没有测试 1.2 边做边改模型 相对于大爆炸模型&#xff0c;考虑到了项目需求&#xff0c;然后开发来回的编写&#xff0c;测试&#xff0c;修改缺陷的过程…

10种软件开发模型整理

准备整理一下软件模型&#xff0c;但是百度到都是零散信息&#xff0c;所以文章准备从概念、模型核心思想、优点、缺点、生命周期等体现各个软件模型 什么是软件模型 软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、…

系统软件开发基础知识

系统软件开发基础知识 最近最火的是孩子考了多少分&#xff0c;能上那个好大学&#xff0c;出现了我的大学的我的梦。 他们的大学他们的梦&#xff0c;我是啥&#xff0c;我的软件我的梦。 下面了解到的基础知识做一个归纳&#xff0c;本人了解这方面的知识点可能很片面&…

软件开发测试验收通知书,软件项目开发-客户告知书

为确保项目进度快速进行&#xff0c;在域名备案、开通相关第三方接口、确认功能文档、UI设计沟通和验收等阶段&#xff0c;恳请贵方百忙之中抽出时间积极配合&#xff0c;同时也为避免以后双方产生不必要的纠纷&#xff0c;特此告知贵方在项目进行过程中提供如下必要的配合条件…

利用Windows注册Dll或其他文件

注册Dll文件 前章 有时候&#xff0c;我要使用ActiveX控件&#xff0c;但是。如果别人给了一个Dll没注册进去怎么办。 注册 在电脑开始界面->运行->输入regsvr32“Dll文件所在路径”&#xff08;也可以用winR快捷键输出&#xff09;&#xff0c;如下图&#xff1a;

DLL注入——使用注册表

1.简介 整个系统的配置都保存在注册表中&#xff0c;我们可以通过调整其中的设置来改变系统的行为。 该方式依赖User32.dll&#xff0c;也就是说&#xff0c;需要可执行程序调用到这个系统动态库&#xff0c;我们注入的dll才会被执行到。基本上所有基于GUI的应用程序都使用了…

如何手动运行dll文件,非注册dll

遇到一个dll文件的恶意样本&#xff0c;cuckoo沙箱给出的运行命令如下&#xff1a; cd C:\Windows\System32\ rundll32.exe C:\coreshell.dll,DllMain 方法&#xff1a;rundll32.exe 文件位置,DllMain but会弹出警告 另外一种方法&#xff0c;在专家的文章中有提到 DllM…

怎样在计算机上注册dll文件,win10如何注册dll文件_win10系统dll文件怎样安装

在win10系统中&#xff0c;有着大量的dll文件&#xff0c;这是一种计算机上的一类文件&#xff0c;而且一个DLL文件也可能被不同的应用程序使用&#xff0c;但是许多用户可能都不知道win10注册dll文件的操作&#xff0c;那么win10如何注册dll文件呢&#xff1f;接下来就来告诉大…

Win10注册DLL办法

测试环境&#xff1a;win7 64位系统自动升级到win10 64位系统 经验提升&#xff1a;不要在开始-运行-CMD里面执行&#xff0c;不起作用。 注册步骤如下&#xff1a; 1、准备要注册的DLL文件到指定目录 2、新建一个BAT文件&#xff0c;写入注册命令 3、右键已管理员身份运行注…

怎样在计算机上注册dll文件,注册dll文件【搞定步骤】

喜欢使用电脑的小伙伴们一般都会遇到win7系统注册dll文件的问题&#xff0c;突然遇到win7系统注册dll文件的问题就不知道该怎么办了&#xff0c;其实win7系统注册dll文件的解决方法非常简单&#xff0c;按照 1&#xff1a;在电脑桌面上&#xff0c;依次选中菜单项开始--运行&am…

C#【必备技能篇】注册dll+批量注册dll

文章目录 问题描述&#xff1a;一、注册单个dll&#xff1a;1、把相应的dll放置到System32&#xff08;32位&#xff09;和SysWOW64中2、以管理员身份打开“命令提示符”3、输入cmd指令完成注册4、把相关的dll放置到项目输出路径下&#xff0c;即可成功引用 二、批量注册dll1、…

photoshop cc 2018破解补丁(pscc2018注册机) 附使用方法

1、下载破解程序 破解文件自行到 http://www.ddooo.com/softdown/109954.htm 下载 博主可以到本博客的文件--》pscc2018zcj_109954.rar下载 2、破解 打开Amtemu.exe 第一个下拉框选择 adobe photoshop cc 2015 没错&#xff0c;就是2015 。。2015可以破解2018的 然后点击…

安装ADOBE全系列软件的步骤

第一步&#xff1a;下载Adobe Creative Cloud 这款应用里几乎囊括了Adobe旗下的所有软件&#xff0c;也就是说有了这个应用&#xff0c;以后下载Adobe的任意一款软件&#xff0c;完全不用再去百度搜索下载地址了&#xff0c;更不用担心来源不正有病毒啥的&#xff0c;只要你的电…

Adobe Audition CS6

Adobe Audition CS6是一款功能强大、效果出色的多轨录音和音频处理软件&#xff0c;可在普通声卡上同时处理多达64轨的音频信号&#xff0c;并且最多支持混合128个声道&#xff0c;创建回路并使用45种以上的数字信号处理效果&#xff0c;具有极其丰富的音频处理效果。而且Audit…

Adobe Lightroom For Mac安装使用教程

软件介绍 Adobe Photoshop Lightroom是Adobe 研发的一款以后期制作为重点的图形工具软件&#xff0c;是当今数字拍摄工作流程中不可或缺的一部分。其增强的校正工具、强大的组织功能以及灵活的打印选项可以帮助您加快图片后期处理速度&#xff0c;将更多的时间投入拍摄。 安装…