代码之家  ›  专栏  ›  技术社区  ›  pseudomarvin

使用glBlitFramebuffer显示纹理

  •  7
  • pseudomarvin  · 技术社区  · 9 年前

    我正在尝试实现一个简单的多遍渲染方案。我首先将场景的多采样版本blit到FBO beforeEffectsContext.fbo 。如果我随后将其blit到提供FB的应用程序,则工作正常。但我想在场景上进行另一个过程来模糊它 COLOR_ATTACHMENT0 beforeEffectsContext.fbo之前 ,对其进行采样,绘制一个四边形,并将模糊效果添加到另一个帧缓冲区 blurContext.fbo .

    如果我知道显示的内容 blurContext.fbo 使用同样的方法,通过四元和纹理采样,将颜色附加到屏幕上,效果很好,我得到了一个模糊的场景。

    但如果我尝试使用 glBlitFramebuffer() 相反,在这一步中,我得到了一个黑色的屏幕。问题似乎在于我对闪电战过程和FBO的误解。

    的初始化代码 blurContext.fbo :

    // BeforeEffects Framebuffer
    glGenFramebuffers(1, &renderContext->beforeEffectsContext.fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, renderContext->beforeEffectsContext.fbo);
    
    glGenTextures(1, &renderContext->beforeEffectsContext.colorAttachment);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, renderContext->beforeEffectsContext.colorAttachment);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 800, 600, 0, GL_RGBA, GL_FLOAT, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderContext->beforeEffectsContext.colorAttachment, 0);
    
    // Blur Framebuffer
    glGenFramebuffers(1, &renderContext->blurContext.fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, renderContext->blurContext.fbo);
    
    glGenTextures(1, &renderContext->blurContext.colorAttachment);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, renderContext->blurContext.colorAttachment);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 800, 600, 0, GL_RGBA, GL_FLOAT, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderContext->blurContext.colorAttachment, 0);
    

    致使:

    // Draw to the MSampled scene to the BeforeEffects framebuffer
    glBindFramebuffer(GL_READ_FRAMEBUFFER, renderContext->multiSamplingContext.fbo);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, renderContext->beforeEffectsContext.fbo);
    glBlitFramebuffer(0, 0, 800, 600, 0, 0, 800, 600, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
    
    // Sample the texture attached to the beforeEffects FBO and draw to the blur FBO
    glBindTexture(GL_TEXTURE_2D, renderContext->beforeEffectsContext.colorAttachment);
    glBindFramebuffer(GL_FRAMEBUFFER, renderContext->blurContext.fbo);
    glViewport(0, 0, 800, 600);
    
    glUseProgram(renderContext->blurProgramContext.program);
    glBindVertexArray(renderContext->vaoBlur);
    
    glDrawArrays(GL_QUADS, 0, 4);
    
    glUseProgram(0);
    glBindVertexArray(0);
    
    // Blit the content of the blur FBO to the app-provided Framebuffer (doesn't work, black screen)
    glBindFramebuffer(GL_READ_FRAMEBUFFER, renderContext->blurContext.fbo);
    glReadBuffer(GL_COLOR_ATTACHMENT0);
    glBindFramebuffer(GL_DRAW_BUFFER, 0);
    glViewport(0, 0, 800, 600);
    glBlitFramebuffer(0, 0, 800, 600, 0, 0, 800, 600, GL_COLOR_BUFFER_BIT,
        GL_NEAREST);
    
    1 回复  |  直到 9 年前
        1
  •  8
  •   user3256930    9 年前

    在为绘图绑定默认帧缓冲区(0)的行中,目标为GL_DRAW_BUFFER。根据 https://www.opengl.org/sdk/docs/man/html/glBindFramebuffer.xhtml 用于设置绘制帧缓冲区的正确枚举是GL_draw_framebuffer。如果向glGetError添加调用,则可能会看到GL_INVALID_ENUM错误。