我已经尝试在我的引擎中实现延迟着色/渲染一段时间了,但是我还没有能够真正看到它的最终产品。
为了测试问题可能在哪里,我设计了一个实验,通过glBlitFramebuffer()命令查看我的目标FBO是否实际上正在从我的默认FBO中读取。
我已经这样做了,在我的默认FBO清除自己之前,透明颜色被设置为黑色,在我的目标FBO清除自己之前,透明颜色被设置为红色。
结果是,当我渲染我的场景时,我看到的都是黑色。
我的问题是:
如果一个fbo被设置为read_framebuffer,而默认设置为draw_framebuffer,是否会"clear colord"像素也会在"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);
我已经检查了我的帧缓冲区状态的每一步,我没有得到错误。
我已经发现了实际的问题,当我完全理解它时,我会更新这篇文章,提供更多信息。
调用顺序无效:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
...
glDrawBuffer(GL_COLOR_ATTACHMENT4);
GL_COLOR_ATTACHMENT4
不是默认framebuffer的有效绘制缓冲区。它仅在当前绘制帧缓冲区为FBO时有效。对于默认的framebuffer,您需要使用:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
...
glDrawBuffer(GL_BACK);
这将允许glBlitFramebuffer()
复制到默认framebuffer的后缓冲区
一直以来的问题是,如果在主呈现类之外完成绑定默认帧缓冲区的调用,则无法工作。因此,我将这一行从GBuffer移到主渲染类中并在调用GBuffer。finalpass ();