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

下载Qt6最新试用版

Qt组件推荐:

  • QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 :是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面

QtQuick3D在Qt 6.1中引入了对实例渲染的支持。这是图形处理器(GPU)的一项功能,可以极大地提高性能。实例化渲染可以通过一次绘制调用来渲染大量项目。(对于熟悉低级OpenGL的人来说,函数glDrawElementsInstanced是一个示例。)

在我的开发机器上使用这个新的实例功能,QtQuick3D可以以每秒60帧(FPS)的速度渲染一百万个立方体,仅使用2%的CPU时间。同样的场景在Qt 6.0中使用API重新创建,使用Repeater3D生成立方体,在一万个立方体时开始挣扎:只能管理42 FPS,并且使用100%的CPU。

下面是上图所示的简单例子的源代码,创建一个场景,显示20000个位置、颜色和旋转随机的金属甜甜圈形状。

import QtQuick3D
import QtQuick3D.Helpers
import QtQuickWindow {width: 800height: 450visible: trueView3D {anchors.fill: parentcamera: cameraenvironment: SceneEnvironment {backgroundMode: SceneEnvironment.SkyBoxlightProbe: Texture {source: "skybox.hdr"}probeExposure: 3}PerspectiveCamera {id: cameraposition: Qt.vector3d(0, 300, 500)eulerRotation.x: -25}DirectionalLight {eulerRotation.x: -30eulerRotation.y: -70}RandomInstancing {id: randomTableinstanceCount: 20000position: InstanceRange { from: Qt.vector3d(-5000, -2000, -9000); to: Qt.vector3d(5000, 200, 500) }rotation: InstanceRange { from: Qt.vector3d(20, 0, -45); to: Qt.vector3d(60, 0, 45) }color: InstanceRange { from: Qt.rgba(0.1, 0.1, 0.1, 1); to: Qt.rgba(1, 1, 1, 1) }}Model {instancing: randomTablesource: "torus.mesh"materials: PrincipledMaterial { metalness: 1.0; roughness: 0.2; baseColor: "#ffffff" }}              }
}

API

实例化API的主要原理是明确的。它不会尝试自动检测现有API中实例化的机会。

起点是Instancing对象:一个定义如何呈现每个副本的表。修改是变换(位置,旋转和比例);颜色(与模型材料混合);以及可用于自定义材料的自定义数据。在6.1中,有两种现成的QML类型:

  • InstanceList允许您枚举所有实例并绑定到每个实例的属性。

  • 如上所示,RandomInstancing提供了一种快速测试和原型化的方法。

其他种类的实例表可以使用C ++ API轻松定义。我们将在以后的版本中添加其他QML实例化表。可能包括由数据模型定义的表,以及从外部源读取的表。

一旦定义了表,就可以通过设置其实例化属性将其应用于模型。单个表可以同时与多个不同模型一起使用。

通过编写自定义着色器代码,可以使用实例化 来控制其他属性,例如基于物理的渲染的变量,骨骼动画权重,变形或可以用自定义材质表达的任何其他内容。当前,实例化表中的自定义数据被限制为四个浮点数。

Qt 6.1中的custominstancing示例使用自定义材料和用C ++实现的实例表来绘制一个复杂的场景,该场景仅包含一个重复了多次的单个多维数据集:

权衡取舍

谁不希望性能提高100倍?我们应该把所有事情实例化吗?当然,实例化并非万能的灵丹妙药,它也不总是适合这项工作的合适工具。以下是一些注意事项:

  • 首先:实例化是指使用定义明确的修改来渲染同一模型的大量副本。当绘制少量非常不同的东西时,它将无济于事。

  • 主要的改进是在CPU和内存使用方面。GPU的性能好坏参半:我们通过减少绘制调用的次数以及可能的数据量来获得改进,但是顶点着色器更加复杂,因为它需要在每个实例中进行多次转换。

  • 渲染单个模型时,QtQuick3D将分别对不透明和半透明的对象进行排序,并以最佳顺序对其进行渲染。使用实例化时,GPU将按照实例化表指定的顺序进行渲染,而QtQuick3D不会为您对该表进行排序。这样可以节省大量CPU时间,但有两个后果:

    • 不透明的对象将不会以最佳顺序进行渲染,这意味着同一像素可能会被多次写入,从而导致片段着色器进行更多工作,并可能使性能变差

    • 对于半透明的对象,仅当项目从前向后渲染时,混合才是正确的。如果副本之间的重叠不太多,或者每个副本的不透明度很低,那么这可能不是一个大问题。但是,在最坏的情况下,它可能看起来像这样:

技术预览

Qt 6.1中的技术预览中提供了实例化,Qt 6.2中将完全支持实例化。我们不打算对API进行重大更改,但是根据您的反馈可能会进行较小的更改。二进制兼容性可能不会保留:最有可能更改的部分是,当前GPU实例化表的二进制布局已反映在公共C ++ API中。
如果您正在考虑将实例渲染与Qt 6.2一起使用,那么现在是开始的最佳时机。您的代码最多只需要很小的修改,您的反馈就可以帮助我们改进Qt 6.2,从而更好地支持您的用例。

Qt6.1教程:Qt Quick3D渲染实例相关推荐

  1. keyshot怎么批量渲染_keyshot快速渲染实例教程,黑白播放器渲染方法

    keyshot快速渲染实例教程,黑白播放器渲染方法 keyshot渲染一直是比较考验设计师渲染功底的软件,尤其是材质以及光影技巧,细节处理到位与否直接影响产品渲染效果.关于keyshot渲染需要打好基 ...

  2. 【C4D教程】Octane渲染大师班

    [C4D教程]Octane渲染大师班 本套教程共9大章 4小时20分 高清1920X1080 mp4 视频 英语+机译中文字幕 大小 17.8G 信息. 云桥网络 平台获取教程 学习使用Cinema ...

  3. 如何利用Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?

    Qt组件推荐: QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows.Linux和Ma ...

  4. Qt学习(四)---实例涂鸦画板mspaint

    Qt学习(四)-实例涂鸦画板mspaint 一.Qt图形绘制 自己在Qt开源社区在自学yafeilinux前辈的<Qt快速入门系列教程>中的图形篇,结合所学的知识,可以做一个涂鸦板实例 二 ...

  5. Qt Quick 图像处理实例之美图秀秀(附源码下载)

    在<Qt Quick 之 QML 与 C++ 混合编程详解>一文中我们讲解了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用,再来看一下 QML 与 C++ 混 ...

  6. Qt Quick 图像处理实例之美图秀秀 附源码下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在< ...

  7. python 爬虫实例 电影-Python爬虫教程-17-ajax爬取实例(豆瓣电影)

    Python爬虫教程-17-ajax爬取实例(豆瓣电影) ajax: 简单的说,就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: ...

  8. 微信公众平台开发教程(四) 实例入门:机器人(附源码)

    微信公众平台开发教程(四) 实例入门:机器人(附源码) 上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团. 一.功能介绍 通过微信公众平台实现在 ...

  9. java opengl_java基于OpenGL ES实现渲染实例

    这篇文章主要介绍了java基于OpenGL ES实现渲染,实例分析了OpenGL渲染操作的相关技巧,需要的朋友可以参考下 本文实例讲述了java基于OpenGL ES实现渲染的方法.分享给大家供大家参 ...

最新文章

  1. 干货 | 华尔街留下的指标之王(附代码展示)
  2. 正直摄影方式的精度估算式_[公务员考试]数量关系——估算法与直除法
  3. Spring MVC 如何加载静态html
  4. python中的urllib库_七、urllib库(一)
  5. leetcode刷题:相交链表
  6. LVM: Logical Volume Manager 逻辑卷管理
  7. VS中warning MSB8012:TargetPath与 Linker 的 OutputFile 属性值不匹配
  8. win10字体模糊设置
  9. Vue中 实现 Echarts 图表宽高自适应
  10. java keytool 生成p12证书
  11. python3中用django下载文件,中文名乱码怎么办?
  12. 本人对Oracle Bill Of Material模块的一些了解
  13. 随笔 - 记录下当前的生活
  14. python教你用骰子拼图
  15. java小数是怎么运算的_JAVA中小数的运算
  16. 有关Unity3D的OnRenderImage()和Blit()的一些问题
  17. 制作标准1寸和2寸照片方法
  18. java面试全套清单_Java 全套面试题 PDF 下载
  19. iOS开发之数据存取
  20. 国密SM3加密算法工具类(非对称)

热门文章

  1. 入境游平台http://cutetrip.com运营合作
  2. 禁止wordpress自动生成多尺寸的图片
  3. [通俗易懂] 无线通信读书笔记04(简化路径损耗模型)
  4. Java面试题-Java基础-并发编程
  5. Android Studio 启动项目报错 Warning:Uninstalling will remove the application data!
  6. 硬件-6-基站和移动通信系统的演进
  7. python 向上、向下、四舍五入取整方法 round圆整
  8. SAP中原材料寄售采购成本核算有误的问题分析处理实例
  9. 美团软件开发工程师一面
  10. 关于新型冠状病毒感染肺炎中国医学科学院专家组答疑解惑