无法从一个帧缓冲区读取到另一个帧缓冲区

时间:2015-09-08 01:16:18

标签: opengl framebuffer fbo deferred-rendering deferred-shading

我一直试图在我的引擎中实现延迟着色/渲染一段时间,但是我还没能真正看到它的最终产品。

为了测试问题所在,我已经设计了一个实验来查看我的目标FBO是否实际上是通过glBlitFramebuffer()命令从我的默认FBO中读取的。

我已经做到这一点,在我的默认FBO清除之前,清晰的颜色设置为黑色,在我的目标FBO清除之前,清晰颜色设置为红色

结果是当我渲染场景时,我看到的只是黑色。

我的问题是:

如果一个fbo设置为read_framebuffer,并且默认设置为draw_framebuffer,那么"清除颜色"像素也会在" glBlitFramebuffer"中被复制。操作

如果不是,则无法确定我的目标FBO是否实际被渲染,因为该颜色无论如何都不会被复制。

如果是,那么我应该看到红色,我不知道我的FBO设置有什么问题......

正如我之前所说,我一直在尝试使用延迟着色系统。该系统要求我在FBO中执行所有操作,然后将其全部恢复到默认FBO。

由于它不起作用,我已将其程序简化为将基本场景直接渲染到默认FBO(可以正常工作),或将其渲染到目标FBO上并按照过程复制FBO回到默认的FBO(它没有工作)。

我试图使用的帧缓冲设置与我一直关注的教程相同:

glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
glGenTextures(1, &m_finalTexture);
glBindTexture(GL_TEXTURE_2D, m_finalTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WindowWidth, WindowHeight, 0, GL_RGB, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_2D, m_finalTexture, 0);

我像这样渲染我的场景(简化):

//Flush content out of fbo at color attachment 4
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
glDrawBuffer(GL_COLOR_ATTACHMENT4);
glClear(GL_COLOR_BUFFER_BIT);

//Render scene to m_fbo 
RenderPass();

//Swap default FBO back ("0"), read from target fbo (m_fbo)
//Draw target fbo onto default fbo
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo);
glDrawBuffer(GL_COLOR_ATTACHMENT4);
glReadBuffer(GL_COLOR_ATTACHMENT4);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

我已经检查了每一步的帧缓冲状态,并且没有错误。

我发现了实际问题,我会在这里发布更多信息,当我完全理解它时。

2 个答案:

答案 0 :(得分:2)

此调用序列无效:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
...
glDrawBuffer(GL_COLOR_ATTACHMENT4);

GL_COLOR_ATTACHMENT4不是默认帧缓冲区的有效绘制缓冲区。仅当当前绘制帧缓冲区是FBO时才有效。对于默认的帧缓冲,您需要使用:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
...
glDrawBuffer(GL_BACK);

这将允许glBlitFramebuffer()复制到默认帧缓冲区的后台缓冲区中。

答案 1 :(得分:0)

一直存在的问题是,如果在主渲染类之外完成,我对绑定默认帧缓冲区的调用就不会起作用。 所以我把那行从我的GBuffer中移到了我的主渲染类中并在调用GBuffer.FinalPass()之前执行了它;

相关问题