【发布时间】:2011-11-02 22:32:36
【问题描述】:
我的问题的小版本
在 QGraphicsItem::paint() 函数中,我有一个 QGLFrameBufferObject。如何在作为参数传递的画家的paintdevice上获取它? (前提是 QGraphicsItem 位于由具有 QGLWidget 作为视口的 QGraphicsView 渲染的场景中 => 画家正在使用 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?
}
我查看了 Qt 提供的 framebufferobject 和 pbuffer 示例。使用自定义 opengl 代码在 QGLWidget 中绘制 fbo/pbuffer。是否可以在 QGraphicsItem 的 paint() 方法中执行相同的操作并考虑 QGraphisItem 在场景/视图中的位置?
我的问题的大版本
情景草图
我有一个 QGraphicsScene。其中有一个具有 QGraphicsEffect 的项目(通过覆盖 QGraphicsEffect 的 draw() 来实现自己的实现)。场景由具有 QGLWidget 作为视口的 QGraphicsView 渲染。
在 QGraphicsEffect::draw(QPainter*) 中,我必须生成一些像素图,然后我想使用提供的画家进行绘制(画家将 QGLWidget 作为paintdevice)。构建像素图是一些绘制调用的组合,我希望这些在硬件中完成。
简化示例:(我没有在 draw() 方法中调用 sourcepixmap,因为不需要它来演示我的问题)
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 转换。有没有办法从我的 glpixelbuffer 中获取像素图,然后使用painter->drawpixmap()?
我知道我也可以使用以下方法将 pbuffer 复制到纹理:
GLuint dynamicTexture = pbuffer.generateDynamicTexture();
pbuffer.updateDynamicTexture(dynamicTexture);
但我不知道如何将此纹理添加到“画家”上。
【问题讨论】:
-
我这里也有同样的问题。我不认为 QPainter 可以绘制 OpenGL 纹理,因为 QPainter 抽象了绘制设备以进行绘制,而不必使用 OpenGL。因此,我不认为有一个纯粹的基于 QPainter 的解决方案不需要将图像数据从显卡复制到您的进程(软件)中。我也不认为(但我不太确定)转换为 QPixmap 可以直接解决这个问题。但也许我错了?因此赏金。 :)