有效地从 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 中的数据帧复制输出并以漂亮/可读的格式粘贴到 ***
快速有效地从具有 rgb/rgba 纹理的 flt 对象传输到具有 jpg/png 纹理的 fbx