Небольшая версия моего вопроса
В функции QGraphicsItem:: paint() у меня есть объект QGLFrameBufferObject. Как я могу получить его на рисовалом художника, который передается в качестве аргумента? (при условии, что QGraphicsItem находится в сцене, которая визуализируется QGraphicsView, у которой есть QGLWidget, поскольку viewport = > художник использует механизм opengl)
QGraphicsItem::paint(QPainter* painter, ...)
{
QGLFramebufferObject fbo;
QPainter p(fbo);
... // Some painting code on the fbo
p.end();
// What now? How to get the fbo content drawn on the painter?
}
Я рассмотрел примеры framebufferobject и pbuffer, снабженные Qt. Там fbo/pbuffer рисуется в QGLWidget, используя пользовательский код opengl. Можно ли сделать одно и то же в методе paint() объекта QGraphicsItem и занять позицию QGraphisItem в сцене/представлении?
Большая версия моего вопроса
Ситуационный эскиз
У меня есть QGraphicsScene. В нем есть элемент, который имеет QGraphicsEffect (собственная реализация путем переопределения draw() из QGraphicsEffect). Сцена визуализируется QGraphicsView, который имеет QGLWidget как область просмотра.
В QGraphicsEffect:: draw (QPainter *) мне нужно создать некоторую pixmap, которую я тогда хочу рисовать, используя предоставленный художник (у живописца есть QGLWidget как paintdevice). Построение pixmap - это комбинация некоторых вызовов рисования, и я хочу, чтобы они выполнялись в аппаратном обеспечении.
Упрощенный пример: (я не называю sourcepixmap в методе draw(), поскольку это не обязательно для демонстрации моей проблемы)
class OwnGraphicsEffect: public QGraphicsEffect
{
virtual void draw(QPainter* painter);
}
void OwnGraphicsEffect::draw(QPainter* painter)
{
QRect rect(0,0,100,100);
QGLPixelBuffer pbuffer(rect.size(), QGLFormat(QGL::Rgba));
QPainter p(pbuffer);
p.fillRect(rect, Qt::transparent);
p.end();
painter->drawImage(QPoint(0,0), pbuffer->toImage(),rect);
}
Актуальная проблема
Мои проблемы связаны с последней строкой моего кода: pbuffer- > toImage(). Я не хочу это использовать. Из-за соображений производительности я не хочу преобразовывать QImage. Есть ли способ получить pixmap из моего glpixelbuffer, а затем использовать painter- > drawpixmap()?
Я знаю, что я также могу скопировать pbuffer в текстуру, используя:
GLuint dynamicTexture = pbuffer.generateDynamicTexture();
pbuffer.updateDynamicTexture(dynamicTexture);
но я понятия не имею, как получить эту текстуру на "художнике".