彩票走势图

Qt 6.0新增功能概述:QRhi,Qt Quick,Qt Quick 3D

翻译|使用教程|编辑:鲍佳佳|2020-10-30 10:30:27.817|阅读 6329 次

概述:对于Qt Quick,Qt 5.14中提供了新渲染架构的早期选择加入预览,Qt 5.15中进行了一些改进。随着即将发布的Qt 6.0,让我们看看自Qt 5.15以来发生了什么。这里不可能涵盖Qt Quick图形堆栈改进的每个细节,更不用说深入了解大量Qt Quick 3D功能了,其中许多功能是Qt 6.0中的新增功能或改进功能。相反,其目的仅仅是从今年晚些时候发布Qt 6.0时从图形堆栈的角度给出预期的概述。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

Qt技术交流群现已开通,QQ搜索群号“765444821”即可加入!

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。赶快点击下载Qt最新试用版>>

Qtitan组件集

  • QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 : 是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面操作系统。
  • QtitanDataGrid| 下载试用 : 适用于Qt的商业化DataGrid 组件,使得表格数据可以直接面向终端用户完全集成了QtDesigner,极易适应其他相似开发环境,保证100%兼容Qt GUI。

慧都现推出软件国产化服务季点击查看详情,Qt正版授权获取低价优惠>>

对于Qt Quick,Qt 5.14中提供了新渲染架构的早期选择加入预览,Qt 5.15中进行了一些改进。随着即将发布的Qt 6.0,让我们看看自Qt 5.15以来发生了什么。这里不可能涵盖Qt Quick图形堆栈改进的每个细节,更不用说深入了解大量Qt Quick 3D功能了,其中许多功能是Qt 6.0中的新增功能或改进功能。相反,其目的仅仅是从今年晚些时候发布Qt 6.0时从图形堆栈的角度给出预期的概述。

请注意,文档链接引用了Qt 6快照文档。这样可以查看最新的C ++和QML API页面,包括所有已更改的功能和新功能,但是内容也不是最终的。这些链接也可能在以后断开。

QRhi改进

Qhi,Qt渲染硬件接口QRhi,当涉及3D API(例如OpenGL,Vulkan,Metal和Direct 3D)时,是Qt的内部图形抽象。与5.15相比,6.0的主要改进是在此进行了许多抛光修复,最重要的是,进行了大量性能优化。虽然也使Qt Quick受益,但是当涉及到具有许多可渲染对象的复杂场景时,这些对于Qt Quick 3D尤为重要。

通过一些简化,Qt 6.0图形堆栈的主要层可以像这样可视化:

Shader management

现在,Qt Shader Tools模块是安装程序中的可选模块。对于应用程序来说,这可能是有意义的,因为这是提供qsb命令行工具(不要与qbs混淆)及其相关的CMake构建系统集成的模块。此外,该模块目前是Qt Quick 3D的必需依赖项。

Qt 6不再直接使用兼容OpenGL的GLSL源代码片段。相反,所有着色器都是以Vulkan样式的GLSL编写的,然后被反射并翻译为其他着色语言,最后打包为可序列化的QShader对象,QRhi可以使用该对象。Qt 6中的着色器准备管道如下:

在使用Qt Quick的QML应用程序中,每当使用ShaderEffect或将QSGMaterialShader子类化时,应用程序将需要以.qsb文件的形式提供烘焙的着色器包。这些是由qsb工具生成的。但是,这并不意味着开发人员必须直接开始使用新工具:通过CMake集成,可以通过qt6_add_shaders()CMake函数轻松地在CMakeLists.txt中列出顶点,片段和计算着色器。调用qsb并将生成的.qsb文件打包到Qt资源系统中,然后由构建系统处理。

Direct OpenGL不再适用于Qt Quick

在Qt 5.14和5.15中,Qt Quick附带了一个可选的基于QRhi的渲染路径,可以通过设置环境变量QSG_RHI来启用。这样就可以轻松地尝试新堆栈,同时将经过战役测试的传统OpenGL直接代码路径保留为默认值。

在Qt 6.0中,所有此类开关均已消失。无法使用Qt Quick场景将渲染直接转到OpenGL。相反,新的默认设置是Qt Quick场景图的基于QRhi的渲染路径。除了更改默认值外,与Qt 5.15相比,配置哪种QRhi后端以及使用哪种图形API的方法几乎没有变化。

但是有一些影响,尽管许多应用程序不会注意到这些。如果一个应用程序既不使用着色器代码(ShaderEffect,QSGMaterial),也不直接用OpenGL执行自己的渲染,那么它很有可能完全不需要迁移步骤。(至少不会因为图形的原因)

直接使用OpenGL的应用程序

那么那些以某种方式直接使用OpenGL,而对其他图形API的功能不感兴趣的应用程序呢?例如,使用QQuickFramebufferObject,或者连接到QQuickWindow::beforeRendering()这样的信号,在Qt Quick场景下或上面注入自己的OpenGL渲染的应用程序。这时,上面提到的setGraphicsApi()函数就会真正发挥作用:如果应用程序愿意,它可以随时声明它只想要OpenGL(或Vulkan,或Metal,或D3D),而不想要其他的。这样就可以保证Qt Quick要使用相应的QRhi后端(否则会初始化失败),所以应用程序可以放心地认为直接去使用OpenGL是安全的,因为Qt Quick最终也会通过OpenGL进行渲染。请注意,这并不能免除应用程序必须进行其他类型的移植步骤:例如,如果它另外使用ShaderEffect或创建自己的自定义材质,它仍然需要迁移到处理着色器和材质的新方法。

QSG*和QQuick* API变化
API的变化主要分为3类。这不会是一个详尽的列表,而只是对一些重要变化的窥探。详细的变化列表和移植指南预计将在Qt 6.0最终发布时提供。

  • 不同的着色器和材质的方法。QSGMaterialShader得到了全面的改版(与现在被移除的QSGMaterialRhiShader在5.14和5.15中的功能多少有些匹配)。ShaderEffect不再允许内联shader字符串。相反,vertexShader和fragmentShader属性是URL,类似于Image.source和其他属性。它们可以引用本地的.qsb文件,或者通过Qt资源系统(qrc)嵌入的.qsb文件。

  • 从QQuickWindow、QSGTexture和其他地方删除OpenGL的特定功能。像 GLuint textureId()、createTextureFromId(GLuint textureId, ...)、setRenderTarget(GLuint fboId)这样的函数现在已经消失了,这一点也不奇怪。采用(包装)一个现有的OpenGL纹理、Vulkan图像、Metal纹理或D3D11纹理,或者访问QSGTexture的底层原生纹理仍然是完全可能的,但现在是通过一组不同的API来完成的,比如QSGVulkanTexture和其他类似的类,其实例可以从QSGTexure中查询。

    • 将应用程序自己的自定义渲染与Qt Quick渲染的图形API整合在一起是完全支持的,不仅是OpenGL,还包括Vulkan、Metal和D3D11。然而由于它们的性质,其中一些API需要的不仅仅是连接到一个单一的信号,比如beforeRendering()或afterRendering()。例如,我们现在还有beforeRenderPassRecording()。更多细节和示例链接请参见scenegraph概述文档中的相关章节。最后,可通过QSGRendererInterface查询的本地图形资源的数量已经扩展,现在也涵盖了Vulkan、Metal和Direct 3D。

  • 扩展了对将 Qt Quick 场景重定向到离屏渲染目标的支持。QQuickRenderControl 和相关的基础架构得到了极大的增强。这不仅是为了能够像在Qt 5中一样使用OpenGL以外的图形API(例如,在没有屏幕窗口的情况下将Qt Quick场景渲染到Vulkan VkImage中),也是为了能够与AR/VR框架和API(如OpenXR)集成(结合Vulkan、D3D11或OpenGL中的任何一种)。除了略微改变的QQuickRenderControl接口,我们现在还有一些辅助类来提高QQuickWindow的可配置性。QQuickRenderTarget、QQuickGraphicsDevice 和 QQuickGraphicsConfiguration。在需要更精细控制的场景中,这些都是必不可少的:当涉及到现有的渲染引擎时,与OpenXR等API的集成并不总是直接的,在实例、设备和其他图形对象的创建、初始化和所有权方面,有很多潜在的鸡肋问题。Qt Quick应该使用哪个Vulkan实例,还是应该在第一次初始化场景图时创建一个新的实例?Qt Quick应该选择哪个Vulkan物理设备或DXGI适配器,还是继续使用默认的?除了Qt本身需要的之外,还应该启用哪些VkDevice扩展?渲染的目标应该是什么2D图像/贴图,由谁来创建,何时创建?期待Qt 6.0能够做好充分的准备,并在Qt 6.x系列的其他版本中为进一步探索AR/VR的世界提供基础。

在ShaderEffect中处理着色器代码的新方法

ShaderEffect中的着色器代码新方法的综合示例是经典Qt 5 Cinematic Experience演示的Qt 6端口。(GitHub存储库)此版本已移植到CMake,并与所有图形API(包括所有着色器和粒子效果)完全兼容。

查看QML源代码,例如,帘效果的代码显示确实删除了所有内联GLSL字符串。

取而代之的是,顶点着色器和片段着色器现在作为源文件中的普通文件存在,不再与应用程序可执行文件捆绑在一起。

现在,由构建系统和Qt Shader Tools来在构建时进行编译,反映和转换-着色器编译错误的额外好处是变成了正确的构建错误,而不是模糊的运行时问题!-然后将生成的.qsb文件与应用程序捆绑在一起。这就是qt6_add_shaders()函数在项目的CMakeLists.txt中实现的功能

新的场景图示例

建议那些对某些较低级别主题感兴趣的人,例如直接使用场景图或将3D渲染代码与其集成,请查看Qt附带的场景图示例的修订列表,请参阅此处的“场景图”部分。所有这些都已针对Qt 6.0进行了更新,而其中一些是全新的。

例如,专门介绍了“自定义材质”示例,重点关注如何实现使用其自身材质的自定义QQuickItem。

同样值得注意的是图形API特定示例,这些示例遵循Qt 5的openglunderqml示例,现在演示了如何使用Vulkan,Metal和Direct3D 11实现相同的功能。自然地,这些示例仅适用于所涉及的图形API。查看它们的main()函数将显示它们都强制执行了相关的RHI后端。

其中一些方法比经典的底图/叠加方法更进一步。例如,metaltextureimport和vulkantextureimport示例演示了如何向场景添加QQuickItem,该场景实际上是带纹理的四边形,并使用MTLTexture或VkImage进行纹理化,该MTLTexture或VkImage可以创建并渲染到Qt Quick Scenegraph的控件之外。


Qt Quick 3D不再支持Direct OpenGL

在Qt 5.15中,主要新闻是Qt Quick 3D的引入,使3D世界,3D模型和PBR材料成为Qt Quick世界的头等公民。从许多方面讲,这只是Qt 6.0即将发布的预览。


虽然在Qt 5.15中仍与OpenGL绑定,但Qt 6.0附带了Qt Quick 3D的新内部组件,现在基于QRhi的基础结构。如文档页面所述,适用于Qt Quick的配置选项也隐式适用于Qt Quick 3D。例如,如果通过设置QSG_RHI_BACKEND = vulkan或使用等效的C ++ API将Qt Quick配置为使用Vulkan,则同样适用于Qt Quick 3D。

与Qt中如何处理着色器的常规更新一致,自定义材质的概念在Qt 6.0中也经历了重大转变。现在,Qt Quick 3D材质系统有了一个全新的扩展,可以创建可编程的材质,其中网格的着色方式由应用程序提供的着色器代码控制,该代码以Vulkan兼容的GLSL代码片段的形式提供,并通过Qt的标准如上所述的着色器管道,因此在运行时可与任何受支持的图形API一起发挥功能,同时仍被引擎进行修改以执行所有预期的照明,阴影,遮挡和其他步骤,并将场景环境中的所有贡献与应用程序提供的着色逻辑。

小部件呢?

QRhi部分中的图提到了Widgets,尽管乍一看它位于一个奇怪的位置,远离QRhi和Qt Quick。这试图表明什么?

通常,所有在Qt 5中工作的东西都可以在Qt 6中工作,但已过时和现在已删除的功能除外,例如所有带有QGL前缀的Qt 4时代类(最著名的是QGLWidget)。如果Qt 5应用程序将其自己的OpenGL内容渲染到QWindow中,或使用QOpenGLWidget,它将全部像以前一样运行。(在最坏的情况下,需要执行一些非常小的迁移步骤,例如,由于QOpenGLWidget移至其自己的模块openglwidgets而必须更新应用程序项目文件)。

QRhi或新的着色器管道目前在这里不起作用,至少在Qt 6.0中不起作用。小部件的呈现类似于Qt 5,而QOpenGLWindow或QOpenGLWidget中的OpenGL内容继续直接使用OpenGL API。

QQuickWidget是Qt 6.0中一个有趣的混合体,它将要求应用程序使用OpenGL来强制实施。这是因为尽管Qt Quick可以与其他图形API一起使用,但小部件(QOpenGLWidget和QQuickWidget所依赖)中的合成架构暂时仍继续直接使用OpenGL。

一个值得注意的变化是ANGLE的删除,这意味着ANGLE在Windows上不再与Qt捆绑在一起。除了以某种形式依赖于ANGLE在幕后将OpenGL ES转换为Direct 3D的应用程序外,这不会影响绝大多数应用程序。根据依赖关系的性质和复杂性,此类应用程序应考虑适当地启用OpenGL的功能,或考虑直接使用Direct 3D。对于基于Qt Quick和Qt Quick 3D的应用程序,实际上没有问题可能不是问题,因为Direct3D 11现在是Qt 6中的一流渲染选项。

到此为止。还有更多的Qt 6图形主题需要讨论,但是希望我们上面提供的内容为Qt 6.0中的更改和新功能提供了一个很好的起点。预计在不久的将来会有更多的帖子,特别是在Qt Quick 3D的情况下。

感谢您的阅读,希望这篇文章能带给你一定的帮助!如果这篇文章没能满足你的需求、点击获取更多文章教程!现在立刻下载Qt6免费试用吧!更多Qt类开发工具QtitanRibbonQtitanChartQtitanNavigationQtitanDockingQtitanDataGrid在线订购现直降1000元,欢迎咨询慧都获取更多优惠>>

====================================================

想要了解或购买Qt正版授权的朋友,欢迎

Qt技术交流群现已开通,QQ搜索群号“765444821或者扫描下方二维码即可加入



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP