2015-05-04 5 views
2

Моего заказа QQuickItem в настоящее время выполняет следующиеЭффективного получения от QPaintDevice к QSGTexture в QQuickItem

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

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

QImage img = m_fbo->toImage(); 

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

setTexture(tex); 

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

Мои вопросы следующие.

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

Спасибо!

ответ

1

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

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.

+0

Что касается QQuickPaintedItem, можете ли вы переопределить updatePaintNode для создания поддерева узла? – XenoByteZero

+0

как я могу передать эту 'QSGTexture', созданную, наконец, на шаге 1 в' updatePaintNode'? Или, другими словами, как я могу отобразить эту 'QSGTexture' на моем QQuickItem? –

 Смежные вопросы

  • Нет связанных вопросов^_^