如果你觉得本文内容有些超纲,可以先看看 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 --