OpenGL帧缓冲区对象 - glBindFramebuffer错误

时间:2013-05-27 04:36:58

标签: opengl framebuffer fbo

背景
我试图将基元绘制到默认的窗口系统帧缓冲对象中。我有三个正确渲染的对象。现在,我想生成我自己的framebuffer对象以包含这些相同的图像,但是每个对象都以平面唯一颜色ID呈现,以便在运行时用于选择。将向用户呈现三个对象,通过鼠标单击选择其中一个对象,然后代码将读取帧缓冲对象中的像素以确定颜色。读取颜色后,将更改对象的颜色以指示它已被选中。

问题:
出于某种原因,glBindFramebuffer(GL_FRAMEBUFFER, fbo);在致电GL_INCOMPLETE_DRAW_BUFFER后给了我一个glCheckFramebufferStatus(GL_FRAMEBUFFER)。代码附后。也许我没有正确设置framebuffer对象?或者,VMWare可能不允许帧缓冲对象?我想进行一些健全性检查,以确保这是执行帧缓冲对象的正确方法。

代码(希望只是相关部分):

void initFrameBuffers()
{
    glGenRenderbuffers(NumRBOs, rbos);
    glBindRenderbuffer(GL_RENDERBUFFER, rbos[COLOR]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, WIDTH, HEIGHT);
    glBindRenderbuffer(GL_RENDERBUFFER, rbos[DEPTH]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, WIDTH, HEIGHT);

    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);   // Causes the error
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbos[COLOR]);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbos[DEPTH]);

    glEnable(GL_DEPTH_TEST);

    // Re-enable the default window-system framebuffer for drawing
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}

void drawToFBO()
{
    // Load the user defined framebuffer object
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
    glDrawBuffer(GL_COLOR_ATTACHMENT0);
    glViewport(0, 0, WIDTH, HEIGHT);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Draw into the user defined framebuffer object, not the default window-system FBO
    glBindVertexArray(vaos[CYLINDER]);
    glDrawArrays(GL_TRIANGLES, 0, cylinder.vertices.size());

    // Re-enable the default window-system framebuffer
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}

现在,在调用initFrameBuffers方法之前,我不确定是否需要做任何特殊操作,但这就是我正在做的事情。我的主要功能只是调用initFrameBuffers,然后调用我的init()方法,该方法将三个对象绘制到默认的窗口系统FBO中。

我在较新版本的Kubuntu中尝试了相同的代码,它给了我一个不同的错误代码:GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT而不是GL_INCOMPLETE_DRAW_BUFFER。我肯定不确定这里发生了什么。我正在阅读红皮书的第八版,并遵循他们的建议,但似乎无法让我的帧缓冲区结合。

1 个答案:

答案 0 :(得分:1)

正如所指出的,glBindFramebuffer(..)不会返回指示帧缓冲区完整性的状态。我在glCheckFramebufferStatus(GL_FRAMEBUFFER)例程中的每次调用后都使用了对initFrameBuffers()的调用。但是,在将渲染缓冲区绑定到帧缓冲区后,我没有检查状态。如果我这样做,我会看到我确实正确设置了渲染和帧缓冲区。

关于帧缓冲区的使用,每当我执行绘制时,我必须一直离开窗口系统帧缓冲区,因为每次绘制都不是在FBO中发生,而是在窗口系统帧缓冲区上。在注意到我绑定FBO的位置以及我如何调用glDrawBufferglReadBuffer之后,我似乎已经弄清楚了。我现在可以使用Phong照明将对象渲染到窗口系统帧缓冲区中,然后使用纯色将相同的对象渲染到FBO中。一旦将对象渲染到两个缓冲区中,我就可以使用glReadPixels来确定用户何时通过在FBO中执行颜色查找来点击对象。