美文网首页OpenGL ESAndroid OpenGL
OpenGL ES 帧缓冲区位块传送(Blit)

OpenGL ES 帧缓冲区位块传送(Blit)

作者: 字节流动 | 来源:发表于2020-09-30 11:26 被阅读0次

该原创文章首发于微信公众号:字节流动

帧缓冲区位块传送(Blit)

上文 OpenGL ES 多目标渲染(MRT) 中我们了解了利用 MRT 技术可以一次渲染到多个缓冲区,本文将利用帧缓冲区位块传送实现高性能缓冲区之间的像素拷贝。

OpenGL ES 帧缓冲区位块传送

帧缓冲区位块传送(Blit)也是 OpenGL ES 3.0 的新特性,主要用于帧缓冲区之间的像素拷贝,性能高且使用方便,可以指定缓冲区任意矩形区域的像素拷贝。

帧缓冲区位块传送(Blit)API

本文的绘制流程是,新建一个 FBO 绑定纹理作为颜色附着,然后绑定该帧缓冲区进行一次离屏渲染,最后绑定渲染到屏幕的缓冲区作为渲染缓冲区,从新的帧缓冲区中拷贝像素。

渲染代码:

//首先获取当前默认帧缓冲区的 id 
GLint defaultFrameBuffer = GL_NONE;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFrameBuffer);

//绑定我们新创建的帧缓冲区进行渲染
glBindFramebuffer(GL_FRAMEBUFFER, m_FBO);
glViewport ( 0, 0, m_RenderImage.width, m_RenderImage.height);
glClear(GL_COLOR_BUFFER_BIT);
glDrawBuffers(ATTACHMENT_NUM, attachments);

glUseProgram (m_ProgramObj);
glBindVertexArray(m_VaoId);
UpdateMVPMatrix(m_MVPMatrix, 0, m_AngleY, (float)screenW / screenH);
glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_TextureId);
glUniform1i(m_SamplerLoc, 0);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);

//绑定默认的帧缓冲区对象,将像素从新建的帧缓冲区拷贝到当前默认的帧缓冲区
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFrameBuffer);
glViewport ( 0, 0, m_SurfaceWidth, m_SurfaceHeight);
glClear(GL_COLOR_BUFFER_BIT);

//位块传送
BlitTextures();

进行帧缓冲区间位块传之前,需要指定好源帧缓冲区 GL_READ_FRAMEBUFFER 和目标帧缓冲区 GL_DRAW_FRAMEBUFFER,下面代码实现是将四个颜色附着对应的缓冲区像素,分别拷贝到当前渲染缓冲区中的 1/4 矩形区域内:

void FBOBlitSample::BlitTextures() {
    //很重要,指定源帧缓冲区
    glBindFramebuffer(GL_READ_FRAMEBUFFER, m_FBO);

    glReadBuffer(GL_COLOR_ATTACHMENT0);
    glBlitFramebuffer(0, 0, m_RenderImage.width, m_RenderImage.height,
                        0, 0, m_SurfaceWidth/2, m_SurfaceHeight/2,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);

    glReadBuffer(GL_COLOR_ATTACHMENT1);
    glBlitFramebuffer(0, 0, m_RenderImage.width, m_RenderImage.height,
                        m_SurfaceWidth/2, 0, m_SurfaceWidth, m_SurfaceHeight/2,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);

    glReadBuffer(GL_COLOR_ATTACHMENT2);
    glBlitFramebuffer(0, 0, m_RenderImage.width, m_RenderImage.height,
                        0, m_SurfaceHeight/2, m_SurfaceWidth/2, m_SurfaceHeight,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);

    glReadBuffer(GL_COLOR_ATTACHMENT3);
    glBlitFramebuffer(0, 0, m_RenderImage.width, m_RenderImage.height,
                        m_SurfaceWidth/2, m_SurfaceHeight/2, m_SurfaceWidth, m_SurfaceHeight,
                        GL_COLOR_BUFFER_BIT, GL_LINEAR);
}

最后呈现的效果是将四张图像渲染到一个屏幕上。


帧缓冲区位块传送(Blit)

相关文章

  • OpenGL ES 帧缓冲区位块传送(Blit)

    该原创文章首发于微信公众号:字节流动 上文 OpenGL ES 多目标渲染(MRT)[https://www.ji...

  • OpenGL ES手册翻译---4.每块碎片的操作和帧缓冲(三)

    4.4 帧缓冲对象 如同第一章和第二章描述的一样,OpenGL ES渲染到帧缓冲(和从帧缓冲中读取)。OpenGL...

  • OpenGL ES for Android(帧缓冲)

    简介 我们学过的颜色缓冲,深度缓冲已经模板缓冲结合起来就叫帧缓冲。默认系统会定义一个帧缓冲(在移动端就是EGL创建...

  • OpenGL ES 基础理论

    OpenGL ES基础理论 (一) —— 缓存、帧缓存、上下文与坐标系等OpenGL ES基础理论 (二) —— ...

  • OpenGL的帧缓冲

    昨天终于把OpenGL的帧缓冲给看完了。让帧缓冲外加一些比较好的滤镜着色器,比如“反相”滤镜,就能做出很多有趣的全...

  • opengl学习-帧缓冲

    创建一个帧缓冲 完整的帧缓冲组成 附加至少一个缓冲(颜色、深度或模板缓冲)。 至少有一个颜色附件(Attachme...

  • OpenGL 帧缓冲区

    文章引用OpenGL 帧缓冲区 - wen_dao_ - 博客园 帧缓冲区 几乎每个图形程序的重要目标之一都是在屏...

  • OpenGL模板缓冲区与模板测试(转)

    OpenGL模板缓冲区与模板测试 帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区:用于绘图的缓冲区,它...

  • OpenGL学习之FBO的使用

    概述 帧缓冲对象FBO(Frame buffer Object)。 OpenGL默认情况下,在GLSurfaceV...

  • 关于FBO的理解和记录

    关于FBO: OpenGL中的FBO对象(含源码) OpenGL的帧缓冲对象和浮点纹理 GPGPU计算观念和基本思...

网友评论

    本文标题:OpenGL ES 帧缓冲区位块传送(Blit)

    本文链接:https://www.haomeiwen.com/subject/xveuuktx.html