Эффективное получение от QPaintDevice до QSGTexture в QQuickItem

Мой пользовательский QQuickItem в настоящее время выполняет следующие функции

  1. Создайте QSGNode, который является подклассом QSGSimpleTextureNode.
  2. В функции предварительной обработки узлов создайте объект QOpenGLFramebufferObject для рисования в
  3. Нарисуйте объект QOpenGLFramebufferObject с помощью QPainter
  4. Отображение содержимого QOpenGLFramebufferObject как содержимого узла

У меня есть следующий процесс преобразования FBO в QSGTexture, который я могу установить на QSGSimpleTextureNode.

QImage img = m_fbo->toImage();

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

setTexture(tex);

Это кажется очень неэффективным, и приложение начинает становиться реальным даже с FBO относительно разумного размера.

У меня следующие вопросы.

  1. Есть ли более простой способ добавить FBO в QSGTexture?
  2. Есть ли лучший совместимый с QPaintDevice элемент, который мне следует использовать, а не QOpenGLFramebufferObject?
  3. Есть ли лучший подкласс, который я должен расширить, чем QSGSimpleTextureNode, чтобы делать то, что я хочу делать?

Спасибо!


person XenoByteZero    schedule 04.05.2015    source источник


Ответы (1)


1) Для объектов фреймбуфера без мультисэмплов создается текстура с указанной целью текстуры. Вы можете получить идентификатор текстуры, прикрепленной к объекту фреймбуфера, используя QOpenGLFramebufferObject :: takeTexture (). А затем создайте новый объект QSGTexture из существующего идентификатора текстуры GL:

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

2, 3) Класс QQuickPaintedItem предоставляет способ использования QPainter API в QML Scene Graph.

Класс QQuickFramebufferObject - это вспомогательный класс для интеграции рендеринга с использованием объекта фреймбуфера (FBO) с Qt Quick.

person Meefte    schedule 04.05.2015
comment
Что касается QQuickPaintedItem, можете ли вы переопределить updatePaintNode, чтобы иметь возможность создавать поддерево узла? - person XenoByteZero; 05.05.2015
comment
как я могу передать этот QSGTexture, созданный, наконец, на шаге 1, в updatePaintNode? Или, другими словами, как я могу отобразить это QSGTexture в моем QQuickItem? - person TheWaterProgrammer; 02.03.2017