0

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

问题:
出于某种原因,glBindFramebuffer(GL_FRAMEBUFFER, fbo);在给我GL_INCOMPLETE_DRAW_BUFFER打电话后给glCheckFramebufferStatus(GL_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 方法之前是否需要做任何特别的事情,但这就是我正在做的事情。我的 main 函数只是调用initFrameBuffers,然后调用我的init()方法,该方法将三个对象绘制到默认的窗口系统 FBO 中。

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

4

1 回答 1

1

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

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

于 2013-05-28T01:27:53.660 回答