有效地从 QPaintDevice 到 QQuickItem 中的 QSGTexture

Posted

技术标签:

【中文标题】有效地从 QPaintDevice 到 QQuickItem 中的 QSGTexture【英文标题】:Efficiently getting from a QPaintDevice to a QSGTexture in QQuickItem 【发布时间】:2015-05-04 15:01:10 【问题描述】:

我的自定义 QQuickItem 当前执行以下操作

    创建一个 QSGNode 的子类 QSGSimpleTextureNode 在节点预处理函数中,创建一个 QOpenGLFramebufferObject 来绘制 使用 QPainter 在 QOpenGLFramebufferObject 上绘图 将 QOpenGLFramebufferObject 的内容显示为节点内容

我将 FBO 转换为可以在 QSGSimpleTextureNode 上设置的 QSGTexture 的过程如下。

QImage img = m_fbo->toImage();

QSGTexture* tex = m_window->createTextureFromImage(img, QQuickWindow::TextureCanUseAtlas);

setTexture(tex);

这似乎非常低效,即使具有相对合理大小的 FBO,应用程序也开始变得非常框架。

我的问题如下。

    有没有更简单的方法可以将 FBO 放入 QSGTexture? 我应该使用更好的 QPaintDevice 兼容项目而不是 QOpenGLFramebufferObject 吗? 我应该扩展一个比 QSGSimpleTextureNode 更好的子类来做我想做的事吗?

谢谢!

【问题讨论】:

【参考方案1】:

1) 对于非多重采样帧缓冲对象,创建具有指定纹理目标的纹理。您可以使用QOpenGLFramebufferObject::takeTexture() 获取附加到帧缓冲区对象的纹理的纹理ID。进而 从现有的 GL 纹理 ID 创建一个新的 QSGTexture 对象:

QSize textureSize = m_fbo.size();
GLuint textureId = m_fbo.takeTexture();
QSGTexture* texture = window()->createTextureFromId(textureId, textureSize);

2, 3) QQuickPaintedItem 类提供了一种在 QML 场景图中使用 QPainter API 的方法。

QQuickFramebufferObject 类是一个方便的类,用于将使用帧缓冲区对象 (FBO) 的渲染与 Qt Quick 集成。

【讨论】:

关于 QQuickPaintedItem,你还能重写 updatePaintNode 来创建节点子树吗? 我怎样才能将步骤 1 中最终创建的 QSGTexture 传递到 updatePaintNode 中?或者换句话说,我怎样才能在我的 QQuickItem 上显示这个 QSGTexture

以上是关于有效地从 QPaintDevice 到 QQuickItem 中的 QSGTexture的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地从 jupyter 或 colab 中的数据帧复制输出并以漂亮/可读的格式粘贴到 ***

有效地从 lua 表中删除 nil 值

快速有效地从具有 rgb/rgba 纹理的 flt 对象传输到具有 jpg/png 纹理的 fbx

如何在 C# 中有效地从 SQL 数据读取器写入文件?

如何有效地从 NSManagedObject 中获取属性的所有有效值?

有效地从 32 位数据类型中删除 2 位