提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:鲍佳佳|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组件集】
慧都现推出“软件国产化服务季”(点击查看详情),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。
在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类开发工具QtitanRibbon、QtitanChart、QtitanNavigation、QtitanDocking、QtitanDataGrid在线订购现直降1000元,欢迎咨询慧都获取更多优惠>>
====================================================
想要了解或购买Qt正版授权的朋友,欢迎
Qt技术交流群现已开通,QQ搜索群号“765444821”或者扫描下方二维码即可加入
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢