乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - QT(v6.3,Beta) 支持新3D粒子(3D Particles)功能


2021年4月16日,介绍一下Qt Quick 3D粒子

https://www.qt.io/blog/introducing-qt-quick-3d-particles

你可能已经看到或听说,Qt Quick 3D在Qt 6.1中引入了对3D粒子的支持。与实例渲染类似,3D粒子模块也是Qt 6.1中的一个技术预览,并将在Qt 6.2中得到完全支持。在这篇博文中,我们将介绍每个开发者和设计师应该知道的关于新的3D粒子的事情,所以请继续阅读。对于像粒子这样的视觉元素,实际看看你能用它们做什么总是有好处的。下面的视频介绍了我们的Testbed应用程序的一些演示,这些演示包括在Qt 6.1的例子中。

使用方法(Usage)

如果你熟悉Qt Quick的粒子模块,你应该对3D粒子也感到满意。作为一个开始,你将在你的QML文件的开头使用 "import QtQuick3D.Particles3D",而不是 "import QtQuick.Particles"。下面是一个简单的粒子系统的QML代码,它有一个单一的逻辑粒子、一个发射器和一个影响器。

ParticleSystem3D {
    SpriteParticle3D {
        id: starParticle
        sprite: Texture {
            source: "images/star.png"
        }
        maxAmount: 200
        color: "#ffff00"
        particleScale: 20.0
        fadeOutDuration: 500
        billboard: true
    }
    ParticleEmitter3D {
        particle: starParticle
        velocity: VectorDirection3D {
            direction: Qt.vector3d(100, 200, 0)
            directionVariation: Qt.vector3d(20, 20, 20)
        }
        particleScaleVariation: 0.4
        emitRate: 50
        lifeSpan: 4000
    }
    Gravity3D {
        magnitude: 100
    }
}

当你运行上面的例子时,你会看到类似这样的东西。

image

或者,如果你用ModelParticle3D替换SpriteParticle3D来获得3D粒子,并添加一些颜色和旋转的变化,输出会是这样的。

image

因此,让我们来看看我们这个简单例子的一些方面。

  • ParticleSystem3D是粒子系统的根。它处理系统计时,并将所有其他相关元素(如粒子、发射器和影响器)分组。与Qt Quick ParticleSystem相比,ParticleSystem3D的一个显著特点是,你可以自由地对时间进行动画处理,例如,可以使粒子与其他动画同步。另一个让设计者乐此不疲的功能是,粒子系统可以用特定的种子随机化,以便在每次运行时获得相同的像素完美的粒子效果。

  • 支持两种不同的逻辑粒子类型。SpriteParticle3D用于2D纹理粒子,ModelParticle3D用于3D模型粒子。模型粒子实际上使用实例渲染,允许渲染成千上万的粒子,并支持完整的快速3D材料和灯光。逻辑粒子将定义粒子的共同外观。一个重要的属性是maxAmount ,它用于分配粒子的数据。Qt Quick粒子没有这个功能,而是根据emitRate、lifeSpan和bursts自动增长数据。要求定义它允许我们优化内存的使用,并在不重新分配的情况下修改emitRate和lifeSpan。

  • ParticleEmitter3D处理粒子的实际发射。有许多属性可以定义单个粒子的外观以及它们的发射方式。许多属性都有对应的变化,用于增加粒子之间的差异。要从另一个粒子发射粒子,你可以使用TrailEmitter3D。

  • 目前有4个不同的影响因子,用于控制粒子在其生命周期内的动画效果,将来可能会增加更多的影响因子。在这里,我们使用Gravity3D影响器,用一个幅度来拖动粒子。

要了解更多信息,请查看Particles3D的API文档和Testbed例子的文档。

性能说明(Performance Notes)

与所有的Qt模块一样,性能是新的3D粒子模块的关键因素之一。毕竟,我们希望粒子可以在各种硬件上使用,包括桌面、移动和嵌入式设备。这就是说,它不仅仅是在屏幕上渲染最大数量的粒子元素。对我们来说,易于使用的API、对不同使用场景的可扩展性、渲染质量、与其他UI元素的整合等也很重要。

目前,渲染在GPU上运行,而粒子系统逻辑在CPU上运行。我们正在使用一个所谓的无状态粒子系统,它也允许在GPU上移动系统逻辑,如果这看起来是有益的。初步测量表明,我们在CPU和GPU之间的平衡性相当好。我们的无状态系统也允许在未来有更好的工具集成,因为粒子可以在时间轴上被动画化(作为一个例子,见测试平台 "Qt Cube Burst")。而且正如已经提到的,模型粒子利用实例渲染来提高性能。这意味着OpenGL ES 2.0是不够的,至少需要OpenGL ES 3.0、Vulkan等现代的后端,这样我们才能使渲染具有高性能。

为了更具体地了解实际性能,下面的视频显示了在4个不同的Android设备上运行的粒子测试平台应用程序。这些设备及其芯片组和GPU可以被认为是低端/中端设备,这证实了粒子在更实惠的硬件上也能表现良好。

Qt Quick(2D)粒子怎么办?

Qt 6仍然完全支持2D Qt Quick粒子模块,所以不必担心这个问题。Laszlo Agocs已经将粒子模块移植到QRhi,因此它可以在所有Qt 6支持的渲染后端(OpenGL、Vulkan、Metal和D3D11)上运行。我自己和其他社区成员也进行了不同的清理、错误修复和优化。因此,实际上Qt 6上的Qt Quick粒子比以往任何时候都要好,只要继续使用你的2D Qt Quick粒子UI即可。

下一步是什么?

如果你正在读这篇文章,但还没有下载最新的Qt 6.1版本,请现在就下载吧。你可以运行粒子测试平台的例子,了解它目前提供的功能,并查看源代码。然后你可以自己实验一下3D粒子,用你自己的设计创造出狂野的效果。还有一个最重要的要求。请通过Jira tickets向我们提供反馈,这样我们就可以在未来的Qt版本中改进3D粒子模块以满足你的需求。谢谢!

2022年1月14日,Qt 6.3 Alpha发布

image

https://www.qt.io/blog/qt-6.3-alpha-released

我们今天已经发布了Qt 6.3 Alpha。

你可以在Qt 6.3.0的文档中找到Qt 6.3.0的新功能的初始列表。但请注意,该文档仍在建设中,并将在我们准备好最终发布之前进行更新。

像往常一样,你可以通过使用维护工具将Qt 6.3 Alpha添加到现有的在线安装中。或者你可以通过使用Qt在线安装器来做一个干净的安装。Qt 6.3 Alpha源码包可以从Qt账户门户和download.qt.io上下载。

请现在开始测试Qt 6.3 Alpha,并立即在Jira中报告你的所有发现。

2022年2月4日,Qt v6.3测试版发布

image

https://www.qt.io/blog/qt-6.3-beta-released

我们今天发布了第一个Qt 6.3测试版。在测试阶段,我们通过在线安装程序提供多个后续的测试版本。目标是根据测试阶段收到的反馈最终确定Qt 6.3,并在三月底发布Qt 6.3.0。

与Qt 6.2相比,Qt 6.3带来了多种新功能和改进,并增加了两个新模块。关于Qt 6.3版本的更多信息,请查看Qt 6.3中最重要的变化概述。我们已经在博客中介绍了Qt 6.3的一些新项目,并将在未来几周内围绕Qt 6.3在本博客中发表更多的文章。

在今天发布的第一个测试版之后,我们将使用在线安装程序推送多个新的测试版。通过这种方式,用户可以很容易地测试新功能并提供反馈。我们不打算为后续的测试版和候选版单独发表博客文章。除了二进制文件之外,每个测试版的源代码包也可以供那些喜欢自己构建的人使用。

我希望你们中的许多人能够试用Qt 6.3测试版,并提供反馈,以帮助我们确定在Qt 6.3中需要改进的地方,以便在三月底发布。对于你可能发现的任何问题,请向bugreports.qt.io提交一份详细的bug报告。在提交bug报告时,记得要提到你是在哪个测试版发现的问题,并查看已知问题的列表。我们也欢迎你加入Qt项目邮件列表和开发者论坛的讨论。

2022年2月8日,Qt 6.3中新的3D粒子功能

image

https://www.qt.io/blog/new-3d-particles-features-in-qt-6.3

是的,我知道,Qt 6.3还没有出来。但由于第一个测试版刚刚发布,现在是开始谈论新功能的好时机。在这篇博文中,我将列出我最喜欢的Qt Quick 3D粒子模块中的三个新功能。

自定义形状(Custom Shapes)

Quick 3D粒子模块中的形状定义了粒子发射的区域或粒子被吸引的区域。定义形状的最常见方法是使用ParticleShape3D并选择形状类型(Cube、Sphere、Cylinder)。另外,如果你想从一个现有的三维模型中发射粒子,还有ParticleModelShape3D专门用于此。这些选项通常是足够的,但它们并没有涵盖所有的需求,所以在Qt 6.3中,我们添加了一个新的ParticleCustomShape3D元素。这个元素允许以简单的CBOR格式定义形状的精确粒子位置。

[
  "QQ3D_SHAPE", // string
  version, // integer
  [
    posX, // float
    posY, // float
    posZ, // float
    posX, // float
    ...
  ]
]

下面是一个使用自定义形状的应用实例。

为了创建这些形状文件,我们提供了一个简单的命令行工具,叫做shapegen,它接收图像和深度,并在其中创建定义数量的位置。下面是shapegen工具的帮助。

C:\qt6_3-install\bin
λ shapegen.exe --help
Usage: shapegen.exe [options]
Tool to generate Qt Quick 3D Particles Custom Shapes

Options:
-?, -h, --help Displays help on commandline options.
--help-all Displays help including Qt specific
options.
-i, --image  Input image for the data.
-o, --output  Output CBOR file for the shape data.
-d, --depth  Depth (z scale) for the data.
-s, --scale  Scale used for the image data. Default
1.0
-a, --amount  Amount of position data to generate.
-p, --sorting-position  Position to use for sorting. Format "x,
y, z"
-l, --list-cbor Lists CBOR file content.

这个工具仍然相当简单,但CBOR格式也是如此,所以你也可以看看私有的形状帮助类,以任何可以想象的方式生成你自己的自定义形状。

灯光支持(Lights Support)

为了在Quick 3D场景中发射2D纹理粒子,你可以使用SpriteParticle3D元素。在Qt 6.3中,我们为这些精灵粒子添加了灯光支持,定义了粒子应该受到哪些灯光的影响。

SpotLight {
  id: lightSpot
  ...
}

PointLight {
  id: lightPoint
  ...
}

SpriteParticle3D {
  id: spriteParticle
  sprite: Texture {
    source: "images/sphere.png"
  }
  lights: [lightSpot, lightPoint]
  ...
}

所有的Quick3D灯光类型都被支持。对于粒子,应用的光量是按粒子计算的,而不是像Quick 3D模型那样按像素分辨率计算。之所以做出这个决定,是因为粒子通常比较小,而且通过在顶点着色器方面计算光照来获得出色的性能。

下面是一个演示粒子与不同灯光的应用实例。

你可以利用这种照明支持来使粒子与3D场景的其他部分更好地融合。如前所述,灯光的实现是相当有效的,所以你也可以在嵌入式硬件上使用它们。

动态突发(Dynamic Bursts)

为了以突发方式发射粒子,Quick 3D支持几个burst()方法和声明性的EmitBurst3D元素。后者是在粒子系统启动时进行评估的(所以产生了爆裂粒子)。这对性能来说是最理想的,因为它意味着在系统运行时不需要生成突发粒子,但它不适合发射器移动、旋转等情况,因为突发粒子将在初始发射器阶段创建。出于这个原因,我们在Qt 6.3中增加了一个新的DynamicBurst3D元素。它的使用与EmitBurst3D类似。

ParticleEmitter3D {
  ...
  emitBursts: [
    DynamicBurst3D {
      time: 1000
      amount: 100
    },
    DynamicBurst3D {
      time: 2000
      amount: 200
    }
  ]
}

DynamicBurst3D元素在系统运行时被评估,也就是说,上面的例子在1s时发射100个粒子,在2s时发射200个粒子,发射器的属性在这些确切的时间内。DynamicBurst3D与TrailEmitter3D相结合,还可以在后续粒子开始或结束时触发爆裂。

下面是一个演示动态爆裂与跟踪发射器的应用实例。

博客中展示的所有例子都可以在Qt 6.3中使用,而且Qt 6.3中还有很多其他的新东西和修正。因此,请下载最新的6.3版本,并自己尝试一下。

Qt 6.3的新内容

https://doc-snapshots.qt.io/qt6-6.3/whatsnew63.html

Qt 6.3中新增和恢复的模块

Qt 6.3 增加了以下模块。

Qt语言服务器:实现了语言服务器协议规范(Language Server Protocol Specification)和JsonRpc 2.0协议。该模块不包含公共API。

Qt 6.3重新引入了以下在Qt 6.2中不存在的模块。所有列出的模块都被移植到Qt 6和CMake构建系统中。

Qt PDF(在技术预览中)

每个模块更详细的变化列表可以在Qt 6中的Qt模块变化中找到。

技术预览平台

1. WebAssembly

Qt for WebAssembly已经做了一些改进。详见Qt for WebAssembly的平台文档。

  • 增加了对图像和html文本的复制/粘贴到系统剪贴板的支持。
  • 增加了SIMD支持。注意,启用SIMD需要从源代码构建Qt。
  • 增加了对在二级线程上调用QEventLoop::exec()和QThread::exec()的支持。
  • 增加了对使用Emscripten Asyncify在主线程上调用QEventLoop::exec()和QDialog::exec()的支持。注意,启用asyncify需要从源代码构建Qt。
  • 拖放功能现在可以在启用asyncify的构建中使用。
  • 使用Emscriptens Emulated POSIX TCP Sockets over WebSockets,增加了对TCP和UDP套接字隧道的支持。该支持仅限于主线程上的异步套接字。

2. ARM上的Windows(Windows on ARM)

由于Qt的优化构建问题尚未解决,ARM64上的Windows仍处于技术预览阶段。

移动平台

1. 安卓(Android)

  • 应用内购买演示和Qt 3D: Planets QML 示例有了安卓特有的改进。
  • 将Gradle更新到了7.2.0,将Android Gradle 插件 (AGP) 更新到了 7.0.2(需要 JDK 11 或以上)。
  • 为CMake Android项目添加了缺失的_make_aab 目标。
  • 为CMake添加了多ABI构建,见QT_ANDROID_ABIS。
  • QML模块现在被放置在用户的构建文件夹下一个名为 "android-qml" 的公共目录中。这可以作为androiddeployqt工具的一个通用导入路径。
  • QML测试平台现在可以为Android构建工作。

参考

  • Qt 6.3 Alpha released
  • Qt 6.3 Beta Released
  • New 3D particles features in Qt 6.3
  • Introducing Qt Quick 3D Particles
  • What's New in Qt 6.3