OpenGL 帧缓冲区位块传送,不得了(附源码)

2022-09-26 10:48:42 浏览数 (1)

如果你觉得本文内容有些超纲,可以先看看 OpenGL ES 干货汇总 系列补补基础。

帧缓冲区位块传送(Blit)可以高效地将一个矩形区域的像素值从一个帧缓冲区(读帧缓冲区)复制到另一个帧缓冲区(绘图帧缓冲区)。

在项目实践中确认了帧缓冲区位块传送的性能和功耗优于 Draw , 此外位块传送还是支持上下采样,以及通过调整映射的矩形区域,可以实现规则的镜像和旋转功能

还有重要的一点,在进行帧缓冲区间位块传之前,需要指定好源帧缓冲区 GL_READ_FRAMEBUFFER 和目标帧缓冲区 GL_DRAW_FRAMEBUFFER ,特别是使用多个 FBO 时需要注意。

帧缓冲区位块传送 glBlitFramebuffer:

使用位块传送的简单 demo , 在新建的帧缓冲区上做完离屏渲染后,直接使用 glBlitFramebuffer 进行上屏。

代码语言:javascript复制
    // 离屏渲染
    glViewport(, , m_RenderImage.width, m_RenderImage.height);

    glBindFramebuffer(GL_FRAMEBUFFER, m_FboId);
    glUseProgram(m_FboProgramObj);
    glBindVertexArray(m_VaoIds[]);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_ImageTextureId);
    glUniform1i(m_FboSamplerLoc, );
    GO_CHECK_GL_ERROR();
    glDrawElements(GL_TRIANGLES, , GL_UNSIGNED_SHORT, (const void *));
    GO_CHECK_GL_ERROR();
    glBindVertexArray();
    glBindTexture(GL_TEXTURE_2D, );
    glBindFramebuffer(GL_FRAMEBUFFER, );

    // 上屏
    glViewport(, , screenW, screenH);
    glBindFramebuffer(GL_READ_FRAMEBUFFER, m_FboId);
    glReadBuffer(GL_COLOR_ATTACHMENT0);

    //直接上屏
    glBlitFramebuffer(, , m_RenderImage.width, m_RenderImage.height,
                      , screenH, screenW, ,
                       GL_COLOR_BUFFER_BIT, GL_LINEAR);

思考题:使用 glBlitFramebuffer 上屏的时候,调用方式为什么不用下面这种?

代码语言:javascript复制
    glBlitFramebuffer(, , m_RenderImage.width, m_RenderImage.height,
                      , , screenW, screenH,
                      GL_COLOR_BUFFER_BIT, GL_LINEAR);

码字不易,帮忙点个赞呗!完整实现代码见项目:https://github.com/githubhaohao/NDK_OpenGLES_3_0,右上角选择 Blit Frame buffer ,有惊喜。

-- END --

0 人点赞