使用 openGL 的 glBindFramebuffer 似乎没有效果
Using openGL's glBindFramebuffer seems to have no effect
我正在了解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
- 警告处理为错误这里有什么问题
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 2D数组来自文本输入,中间有空格
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 有根的二进制搜索树.保留与其父级的链接
- 在计算中使用二的幂有多有利可图
- 有什么方法可以遍历结构吗
- 函数中堆分配的效果与缺少堆分配的情况
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 有一个打印语句的函数是一种糟糕的编程实践吗
- unique_ptr:在分配之前调用 reset 有什么效果
- 有提升一些东西到 fsync() 的效果
- 如何在C中获取char阵列的第一个X元素?提升效果是否有改进的方法
- 我怎样才能制作出具有电视效果的图像
- 我怎样才能有默认参数的效果与可变模板
- 有没有一种方法可以反转QWidget::setMask()函数或实现类似的效果