Qt OpenGL帧缓冲到图像

时间:2012-02-29 10:35:34

标签: qt opengl framebuffer

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

任何帮助都会很棒。

我收到错误“QGLFramebufferObject:Framebuffer不完整,缺少附件。”

似乎间歇性地工作。

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();
}

2 个答案:

答案 0 :(得分:2)

我通过在rendertoimage调用中创建fbo来解决这个问题。

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

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

答案 1 :(得分:0)

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