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

1,348 阅读1分钟


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

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

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

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

帧缓冲区位块传送 glBlitFramebuffer:

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

// 离屏渲染
glViewport(0, 0, m_RenderImage.width, m_RenderImage.height);

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

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

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

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

glBlitFramebuffer(0, 0, m_RenderImage.width, m_RenderImage.height,
                  0, 0, screenW, screenH,
                  GL_COLOR_BUFFER_BIT, GL_LINEAR);


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









\