如果你觉得本文内容有些超纲,可以先看看 OpenGL ES 3.0 系列补补基础。
帧缓冲区位块传送(Blit)可以高效地将一个矩形区域的像素值从一个帧缓冲区(读帧缓冲区)复制到另一个帧缓冲区(绘图帧缓冲区)。
在项目实践中确认了帧缓冲区位块传送的性能和功耗优于 Draw , 此外位块传送还是支持上下采样,以及通过调整映射的矩形区域,可以实现规则的镜像和旋转功能。
还有重要的一点,在进行帧缓冲区间位块传之前,需要指定好源帧缓冲区 GL_READ_FRAMEBUFFER 和目标帧缓冲区 GL_DRAW_FRAMEBUFFER ,特别是使用多个 FBO 时需要注意。
帧缓冲区位块传送 glBlitFramebuffer:
使用位块传送的简单 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 ,有惊喜。
\