Qt OpenGL帧缓冲区到图像

Posted

技术标签:

【中文标题】Qt OpenGL帧缓冲区到图像【英文标题】:Qt OpenGL framebuffer to image 【发布时间】:2012-02-29 10:35:33 【问题描述】:

我正在将帧缓冲区绘制到图像上,它曾经可以正常工作,但是有些东西坏了,我不知道是什么..

任何帮助都会很棒。

我收到错误“QGLFramebufferObject:帧缓冲区不完整,缺少附件。”

它似乎间歇性地工作。

VoxelEditor::VoxelEditor(QWidget *parent)
    : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)


    makeCurrent();
    catchFbo = new QGLFramebufferObject(PICTURE_SIZE, PICTURE_SIZE);




void VoxelEditor::renderToImage() 
    saveGLState();
    const int nrPics = 360 / DEGREES_BETWEEN_PICTURES;
    for (int i = 0; i < nrPics; i++) 
        catchFbo->bind();
        glColorMask(true, true, true, true);
        glClearColor(0,0,0,0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
        glEnable(GL_MULTISAMPLE);
        glLoadIdentity();

        GLfloat x = GLfloat(PICTURE_SIZE) / PICTURE_SIZE;
        glFrustum(-x, +x, -1.0, +1.0, 1.0, 1000.0);
        glViewport(0, 0, PICTURE_SIZE, PICTURE_SIZE);

        drawScreenshot(i);
        catchFbo->release();

        QImage catchImage = catchFbo->toImage();
        catchImage.save("object/test" + QString::number(i) + ".png");
    
    glDisable(GL_MULTISAMPLE);

    restoreGLState();

【问题讨论】:

向我们展示初始化帧缓冲区的代码。 哦,是的,错过了。我扫描了寻找glGenFramebuffers的源。 【参考方案1】:

我通过将 fbo 的创建放在 rendertoimage 调用中解决了这个问题。

它似乎在创建时是有效的并且有适当的附件,但在执行时它失败了..

也许在 initializeGL 调用中创建 fbo 也可以。

【讨论】:

我遇到了同样的问题,但我在initializeGL() 中创建了FBO,在将它移动到paintGL() 之后(确保它当然只执行一次)它起作用了。所以看来initializeGL也不是这个地方。【参考方案2】:

您是否使用 isValid() 方法检查过缓冲区?调用 toImage() 方法后尝试释放缓冲区。

【讨论】:

我尝试在 toImage 之后释放缓冲区,但这没关系。 我怎么能忘记它?!在initializeGL中创建fbo是正确的方法,我前段时间遇到了类似的问题。

以上是关于Qt OpenGL帧缓冲区到图像的主要内容,如果未能解决你的问题,请参考以下文章

如何定义 QT Opengl 帧缓冲区的大小

OpenGL Qt:使用帧缓冲区实现绽放效果的问题

如何从 OpenGL 中的帧缓冲区纹理中采样像素?

从帧缓冲区对象读取时,OpenGL 纹理坐标是相反的

OpenGL 帧缓冲区颜色附件到计算着色器

OpenGL帧缓冲性能问题