3

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

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

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

QImage img = m_fbo->toImage();

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

setTexture(tex);

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

我的问题如下。

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

谢谢!

4

1 回答 1

1

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

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

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

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

于 2015-05-04T17:50:19.663 回答