背景:
我正在尝试将原语绘制到默认的窗口系统帧缓冲区对象中。我有三个正确渲染的对象。现在,我想生成我自己的帧缓冲区对象来包含这些相同的图像,但让每个对象都呈现在一个单一的唯一颜色 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
. 我绝对不确定这里发生了什么。我正在阅读红皮书第八版,并遵循他们的建议,但似乎无法通过让我的帧缓冲区绑定。