关于帧缓冲区:OpenGL帧缓冲区对象-glBindFramebuffer错误

OpenGL Frame Buffer Object - glBindFramebuffer Error

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

问题:
由于某些原因,在调用glCheckFramebufferStatus(GL_FRAMEBUFFER)后,glBindFramebuffer(GL_FRAMEBUFFER, fbo);给了我一个GL_INCOMPLETE_DRAW_BUFFER。该代码已附加。也许我没有正确设置framebuffer对象?或者,也许VMWare不允许帧缓冲对象?我想进行一些检查,以确保这是做帧缓冲对象的正确方法。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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。我绝对不确定这是怎么回事。我正在阅读红皮书第八版,并遵循他们的建议,但似乎无法摆脱绑定帧缓冲区的麻烦。


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

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