使用 openGL 的 glBindFramebuffer 似乎没有效果

Using openGL's glBindFramebuffer seems to have no effect

本文关键字:有效果 glBindFramebuffer openGL 使用      更新时间:2023-10-16

我正在了解openGL中的FBO(帧缓冲区对象)。现在,我只是想将一些东西渲染到FBO,然后使用与之相关的纹理将图像渲染到屏幕上。我今天和昨天已经为这个问题研究了好几个小时了。我试着尽可能地复制两个不同的例子,但我仍然有同样的问题。我完全被卡住了。

发生的情况似乎是帧缓冲区对象实际上并没有被绑定。在代码中,我有两组glClear()和glClearColor()命令:第一组用于绘制到帧缓冲区,第二组用于绘制屏幕。然而,当我评论第二套时,第一套显然影响了屏幕。如果FBO被绑定,它是否应该接收这些命令,并且是否直接影响到屏幕的实际输出?

首先,我使用glewInit(),然后创建一个FBO,然后创建Renderbuffer对象和与其关联的纹理,并执行所有必要的步骤将其组合在一起:

glewInit();
int width=512,height=512;
glGenFramebuffers(1, &fbo);
glGenRenderbuffers(1, &rbo);
glGenTextures(1, &fboTex);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glBindTexture(GL_TEXTURE_2D, fboTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_INT, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
assert(status==GL_FRAMEBUFFER_COMPLETE);
glBindTexture(GL_TEXTURE_2D,0);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);

然后,我绘制到帧缓冲区对象。

glClearColor(0.5,0.5,0.5,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glColor4f(1.0,0,0,1);
glBegin(GL_QUADS);
glVertex2f(100,100);
glVertex2f(200,100);
glVertex2f(200,250);
glVertex2f(100,200);
glEnd();

然后我解除以下三个对象的绑定:

glBindFramebuffer(GL_FRAMEBUFFER,0);
glBindRenderbuffer(GL_RENDERBUFFER,0);
glBindTexture(GL_TEXTURE_2D,0);

然后我尝试将纹理绘制到窗口:

glEnable(GL_TEXTURE_2D);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTextureEXT(GL_TEXTURE_2D, fboTex);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(-.5,-.5,0);
glTexCoord2f(1,0);glVertex3f(.5,-.5,0);
glTexCoord2f(1,1);glVertex3f(.5,.5,0);
glTexCoord2f(0,1);glVertex3f(-.5,.5,0);
glEnd();
glDisable(GL_TEXTURE_2D);
glFlush();

这一定是一些非常简单的错误或误解,当我重新键入所有这些两次时,不知何故避免了根除,还是驱动程序问题?我的驱动程序应该能够运行openGL的3.2版本。。。

在这个令人沮丧的问题上,任何帮助都将是伟大的。

编辑:我发现我最终做错了什么。我没有意识到glColor命令会影响任何完成的绘图,无论当时是否绑定了帧缓冲区。在绘制到FBO后,我需要将glColor改回为(1,1,1),以便稍后用其所有颜色渲染FBO的纹理。

如果没有完整的代码示例,很难看出哪里出了问题。为了启动你的FBO工作,我提供https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimalfbo