一段时间以来,我一直在尝试在我的引擎中实现延迟着色/渲染,但是我还没有真正看到它的最终产品。
为了测试问题可能出在哪里,我设计了一个实验来查看我的目标 FBO 是否实际上是通过 glBlitFramebuffer() 命令从我的默认 FBO 读取和读取的。
我已经做到了,在我的默认 FBO 自行清除之前,清除颜色设置为black,并且在我的目标 FBO 清除自己之前,清除颜色设置为red。
结果是,当我渲染我的场景时,我看到的都是黑色。
我的问题是这样的:
如果一个 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);
我在每一步都检查了我的帧缓冲区状态,我没有收到任何错误。