【问题标题】:Rendering a QGraphicsScene using OpenGL in Qt在 Qt 中使用 OpenGL 渲染 QGraphicsScene
【发布时间】:2012-03-17 22:37:22
【问题描述】:

我正在尝试使用 OpenGL 将 QGraphicsScene 保存为图像(png 或 jpeg),但我不希望图像依赖于当前视图(缩放)。这就是为什么我不使用 grabFrameBuffer 而是使用 render() 的原因:

QImage imgToSave(1024,768,QImage::Format_ARGB32_Premultiplied);
// fill the image
// and define rectbuffer(), the QRect() containing what I want to save
QPainter painter(&imgToSave);
m_scene = new QGraphicsScene;
// fill the Scene
m_scene->render(&painter,imgToSave.rect(),rectbuffer());

确实有效。我的问题是:它是否使用 OpenGL 功能? 如果没有,怎么办?

n.b. :我使用 QGLWidget 作为我的 GraphicsView 的视口。并且使用 OpenGL 的显示正在工作。我担心的是图像保存。

【问题讨论】:

    标签: image qt opengl render


    【解决方案1】:

    我猜:不会。因为要让 QGraphicsScene 通过 OpenGL 进行渲染,您需要指定一个 QGLWidget 派生对象作为场景的视口——您没有,所以几乎可以肯定它使用的是光栅引擎。其次,QPainter 使用您构建它的任何绘画设备作为后端,您指定了一个不使用 OpenGL 的直接 QImage。

    如果您不能/不会通过QGraphicsView 使用QGLWidget,那么您可能能够在QGLFramebufferObject 上进行渲染。但这带来了它自己的复杂性,即您必须事先创建一个隐藏的上下文。

    【讨论】:

    • 您好,感谢您的回答。很奇怪,我编辑了我的第一篇文章,但它已经消失了。我是说我确实在使用 QGLWidget 作为视口。并且 OpenGL 正在为 GraphicsScene 的显示工作。所以我的问题更多是关于图像保存。如何指定将 OpenGL 与 QPainter 一起使用并进行渲染?我必须选择 QImage 以外的其他类型吗?
    • 我在我的回答中给出了一个与 QImage 不同的绘图设备的建议。但请记住,您必须执行渲染,然后将数据从卡中拉回并将其推送到另一个图像容器(可能是 QImage)中以保存/操作它 - 因此您可能看不到较低分辨率图像的性能提升。
    • 所以即使我使用的是 QGLWidget,您也建议使用 QGLFrameBufferObject 而不是 QImage?
    • 在您的示例中,您直接在QGraphicsScene 上使用render() 调用,未使用视口的QLGWidget (AFAIK)。
    • 我知道,但我确实有一个 QGLWdiget 作为视口。如果可能的话,你能告诉我如何指定它与 render() 一起使用吗?如果没有,我必须看什么?谢谢你帮助我!
    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多