【问题标题】:Using openGL's glBindFramebuffer seems to have no effect使用openGL的glBindFramebuffer好像没有效果
【发布时间】:2012-03-10 02:51:28
【问题描述】:

我正在研究 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();

这一定是一些非常简单的错误或误解,当我重新输入所有这些 两次 时以某种方式逃避根除,或者是驱动程序问题?我的驱动程序应该能够运行 3.2 版的 openGL...

对这个令人沮丧的问题的任何帮助都会很棒。

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

【问题讨论】:

  • 如果你给出一个最小但可以编译的例子而不是代码片段,实际上会更容易。

标签: c++ opengl textures framebuffer


【解决方案1】:

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

【讨论】:

  • 谢谢。您链接到的最小示例只需一点点努力就可以按照预期的方式编译和运行,并且我已经成功地获得了相同部分的代码在我的项目中工作。当我弄清楚我做错了什么时,我会在这里发帖......
猜你喜欢
  • 2016-05-19
  • 1970-01-01
  • 2019-04-06
  • 2018-11-05
  • 2018-02-25
  • 2014-11-06
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多