我正在使用openGL进入FBO(Framebuffer对象)。现在,我只是尝试向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的纹理。答案 0 :(得分:1)
如果没有完整的代码示例,很难看出什么是错的。为了启动你的FBO努力,我提供了https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimalfbo