背景
我试图将基元绘制到默认的窗口系统帧缓冲对象中。我有三个正确渲染的对象。现在,我想生成我自己的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
。我肯定不确定这里发生了什么。我正在阅读红皮书的第八版,并遵循他们的建议,但似乎无法让我的帧缓冲区结合。
答案 0 :(得分:1)
正如所指出的,glBindFramebuffer(..)
不会返回指示帧缓冲区完整性的状态。我在glCheckFramebufferStatus(GL_FRAMEBUFFER)
例程中的每次调用后都使用了对initFrameBuffers()
的调用。但是,在将渲染缓冲区绑定到帧缓冲区后,我没有检查状态。如果我这样做,我会看到我确实正确设置了渲染和帧缓冲区。
关于帧缓冲区的使用,每当我执行绘制时,我必须一直离开窗口系统帧缓冲区,因为每次绘制都不是在FBO中发生,而是在窗口系统帧缓冲区上。在注意到我绑定FBO的位置以及我如何调用glDrawBuffer
和glReadBuffer
之后,我似乎已经弄清楚了。我现在可以使用Phong照明将对象渲染到窗口系统帧缓冲区中,然后使用纯色将相同的对象渲染到FBO中。一旦将对象渲染到两个缓冲区中,我就可以使用glReadPixels
来确定用户何时通过在FBO中执行颜色查找来点击对象。