FBO Frame Buffer object 为什么要用FBO 我们需要对纹理进行多次渲染采样时,而这些渲染采样是不需要展示给用户看的,所以我们就可以用一个单独的缓冲对象(离屏渲染)来存储我们的这几次渲染采样的结果 渲染方式 渲染到纹理(Texture)- 图像渲染 渲染到缓冲区(Render)- 深度测试和模板测试 FBO纹理的坐标系 ? 渲染到纹理 ? 创建FBO的步骤: //1. 绑定FBO GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId); //3. 创建FBO纹理 fboTextureId = createTexture(); //4. , 0); 使用FBO的步骤: //1.
理解FBO,就像掀开舞台幕布的一角,得以窥见那些令人惊叹的视觉效果背后,数据如何被驯服、被重塑、被赋予新的意义。要真正触摸到FBO的价值,需先拆解WebGL的基础渲染链条。 正是这种"接口+器材"的灵活组合,让FBO能应对从简单滤镜到复杂光影模拟的各种需求。离屏渲染的完整流程,是FBO功能的最佳诠释。 例如,制作带有光晕的角色技能特效时,可先在第一个FBO中渲染角色本体,在第二个FBO中绘制发光效果,然后通过混合算法将两个FBO的结果叠加,最终呈现出既有清晰轮廓又有朦胧光晕的效果。 此外,FBO的复用策略也能显著提升效率——预先创建多个FBO组成"对象池",需要时直接调用,避免频繁创建与销毁对象带来的性能损耗。 对于开发者而言,掌握FBO意味着跳出"所见即所得"的局限,进入"按需构建"的创作维度:想要什么样的效果,就搭建什么样的FBO流程,数据的流转路径完全由需求决定。
什么是 FBO FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO)。 使用 FBO 作为渲染目标时,首先需要为 FBO 的附着添加连接对象,如颜色附着需要连接纹理或者渲染缓冲区对象的颜色缓冲区。 ? 因此,引入了帧缓冲区对象 FBO 来解决这个问题。 怎么用 FBO 创建并初始化 FBO 的步骤: // 创建一个 2D 纹理用于连接 FBO 的颜色附着 glGenTextures(1, &m_FboTextureId); glBindTexture( FBO 渲染结果图
FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO)。 FBO 本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它仅且提供了 3 个附着(Attachment),分别是颜色附着、深度附着和模板附着。 渲染缓冲区可以用于分配和存储颜色、深度或者模板值,可以用作 FBO 中的颜色、深度或者模板附着。 使用 FBO 作为渲染目标时,首先需要为 FBO 的附着添加连接对象,如颜色附着需要连接纹理或者渲染缓冲区对象的颜色缓冲区。 PBO 仅用于执行像素传输,不连接到纹理,且与 FBO (帧缓冲区对象)无关。 PBO 类似于 VBO(顶点缓冲区对象),PBO 开辟的也是 GPU 缓存,而存储的是图像数据。
帧缓冲(Framebuffer Object),简称 FBO,在渲染绘制中, 图像最终都是绘制到 FBO 上的,一般都是默认的 FBO 上,也就是我们的屏幕。 除此之外,还可以创建自己的 FBO,用来作为绘制的载体,当在自己的 FBO 上绘制好了之后,可以再把绘制内容显示到屏幕上,实现一个双缓冲的绘制。 FBO 的颜色和深度附件。 使用步骤 创建 FBO 按照上面的步骤,首先是创建 FBO 。 如果是使用 OpenGL 3.x 版本,在绑定 FBO 时,还可以选择是绑定只读还是只写的 FBO。
通过FBO,我们可以先把摄像头数据绘制到Camera SurfaceTexture纹理上,然后把这个纹理数据再绘制到一个离屏的FBO,我们可以在这个FBO上做各种特效处理,处理完之后再把离屏FBO中的数据绘制到 其实Camer SurfaceTexture也需要一个FBO,因为需要把摄像头数据缓存到这个FBO,那为什么TextureView却不需要呢,因为广义上来说,屏幕的缓存就是它的FBO。 从数据流方向来看,Camer SurfaceTexture从Camera中读取数据缓存到自己的FBO中,然后离屏FBO通过Camer SurfaceTexture的ID读取Camera FBO中的数据缓存到自己的内存中 ,在这里可以对这个FBO做各种处理,最后TextureView从离屏FBO的ID读取缓存的数据绘制到屏幕上。 ,通过这个往FBO内存中写入数据 frameBuffer = frameBuffer[0] //FBO ID,通过这个从FBO的内存中读取数据 frameBufferTexture
接下来我们来介绍另外一种重要的对象:FBO。 8、FBO 上面我们介绍了通过 VBO、EBO 和 VAO 管理渲染过程中的数据来优化渲染性能,接下来我们来介绍另一个重要的 XXO:帧缓冲区对象 FBO(Frame Buffer Object)。 FBO 是 OpenGL 渲染管线的最终目标,但其实 FBO 本身不直接用于渲染,而是要为其绑定好附件后才能作为渲染目标。 下面是一个简单的使用纹理附件的例子: // 创建和绑定 FBO: GLuint fbo; glGenFramebuffers(1, &fbo); // 创建 FBO glBindFramebuffer( (1, &fbo); // 创建 FBO glBindFramebuffer(GL_FRAMEBUFFER, fbo); // 绑定 FBO,注意:如果这里用 glBindFramebuffer(GL_FRAMEBUFFER
上操作,把输入的纹理ID上的图像,输出到FBO的纹理ID上然后返回。 FBO离屏渲染呢,什么是FBO呢。 帧缓冲对象FBO(Frame buffer Object)。 安卓端FBO写法 前文代码示例中,已经给出了FBO的写法了,这里再展示FBO的OpenGL.API 1、创建FBO //创建FrameBuffer mFrameBuffers = new int[1]; GLES20.glGenFramebuffers(mFrameBuffers.length, mFrameBuffers, 0); 2、绑定FBO 通过绑定纹理对象来锁定挂接渲染区 //绑定FBO,在
引言 在上一章节讲解FBO时,使用纹理来存储颜色缓存附件、深度缓存附件、模板缓存附件,但纹理并不是唯一的选择。 渲染缓冲对象(RBO)是 OpenGL 提供的一种存储渲染结果的帧缓冲对象(FrameBuffer Object,FBO)附件,与帧缓冲对象(FBO)配合使用。 相关接口 RBO的相关接口涉及到其创建、绑定、分配存储空间、附加到FBO等操作,下面是相关接口的详细说明: // 创建渲染缓冲对象 // n: 要创建的 RBO 数量 // renderbuffers ,GLuint &colorTexture, GLuint &rbo, int width, int height) { // 创建 FBO glGenFramebuffers(1, &fbo ); glBindFramebuffer(GL_FRAMEBUFFER, fbo); // 创建并绑定颜色缓冲纹理 glGenTextures(1, &colorTexture);
而在视频编辑当中,FBO离屏渲染扮演着很重要的角色,许多的视频滤镜都会用到,接下来就来看看FBO如何使用吧。 二、FBO简介 OpenGL 在渲染到系统窗口之前,都会将数据送到 FBO 上,也就是说,FBO 其实一直在默默的为我们服务。 所以,OpenGL 在一开始就创建了一个默认的 FBO。 之所以说是缓冲索引,是因为FBO并不包含这些缓冲数据,仅仅保存了缓冲数据的索引地址。 FBO和这些缓冲区则通过附着点进行连接。 ? 可以看到FBO中包含了: 1. 上面说了,FBO可用于离屏渲染,下面就来看看如何通过FBO将画面渲染到一个“后台”的纹理中。 这里的后台,指不用于显示到窗口的纹理。 三、如何使用FBO 1. 的流程了: 新建纹理 新建FBO 绑定将纹理附着到FBO的颜色附着点上 【渲染】 解绑FBO 删除FBO 除了第4步以外,其他都是上面的封装好的方法。
着色器✅glReadPixels着色器访问✅可被采样❌无法绑定采样性能特点Mipmap/Filter支持硬件层优化(某些GPU更快)适合场景后处理/屏幕特效纯深度测试(如阴影生成)使用帧缓冲的步骤:创建FBO 展开代码语言:C++AI代码解释GLuintfbo;glGenFramebuffer(1,&fbo);为FBO创建texture或者renderbuffer,用于存储信息展开代码语言:C++AI代码解释 backwardSceneDepthRBO);//分配内存+格式glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH24_STENCIL8,width,height);为fbo texture,0);glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_STENCIL_ATTACHMENT,GL_RENDERBUFFER,rbo);//检查fbo (GL_FRAMEBUFFER,fbo);glViewport(0,0,width,height);//必须匹配fbo尺寸renderScene();glBindFramebuffer(GL_FRAMEBUFFER
一、添加目标纹理为 FBO 的颜色附着(颜色缓冲区) ,绑定源纹理渲染到目标纹理。 二、添加源纹理为 FBO 的颜色附着(颜色缓冲区) , 使用 glCopyTexImage2D 拷贝当前 FBO 的颜色缓冲区到目标纹理。 glBlitFramebuffer 一般用于帧缓冲区(颜色缓冲区)间高性能数据拷贝(OpenGL ES 3.0)参考:OpenGL ES 多目标渲染(MRT) glGenFramebuffers(1, &fbo ); // 源texture和目标texture共用一个FBO即可 glBindFramebuffer(GL_FRAMEBUFFER, fbo); glFramebufferTexture2D(GL_READ_FRAMEBUFFER
在不了解其本质的时候就想得很复杂,把简单的事情复杂化,这样就算实现出来,也没什么意义,所以要观察其本质,保留上一帧就是其本质 笔者也是琢磨了很久,如何保留上一帧,保留后要如何再显示出来,当笔者一筹莫展的时候,突然发现Fbo 就有保留上一帧的功能,好了,本质找到了,那么就着手实现 FBO 保留上一帧 首先,Fbo 的概念性的东西,大家可以上网查查,这里就直接说说Fbo的作用 Oes纹理转换2D纹理 预览相机、播放视频等这些通过 ,之前笔者也说过,BaseRender是笔者自定义一个基础渲染类,包括渲染、绑定Fbo、绑定Vbo之类的操作 onDraw中,将当前渲染后的Fbo纹理传入lastRender的onDraw方法中,此时, 因为LaseRender绑定了Fbo,则对应的内容不渲染到屏幕,而是保留在帧缓存里,接着获取LaseRender的Fbo纹理,并赋值给LaseTextureId 于是,就得到了两个纹理,一个是当前相机纹理 的值,就可以达到对应的效果 到这里,还差一点,就是蓝线 那么,接下来就来绘制下蓝线 蓝线绘制 蓝线的绘制就比较简单,在「RetainFrameVerticalRender.java」绘制完成后,再使用其Fbo
上操作,把输入的纹理ID上的图像,输出到FBO的纹理ID上然后返回。 离屏渲染呢,什么是FBO呢。 帧缓冲对象FBO(Frame buffer Object)。 安卓端FBO写法 前文代码示例中,已经给出了FBO的写法了,这里再展示FBO的OpenGL.API 1、创建FBO //创建FrameBuffer mFrameBuffers = new int[1]; GLES20.glGenFramebuffers(mFrameBuffers.length, mFrameBuffers, 0); 2、绑定FBO 通过绑定纹理对象来锁定挂接渲染区 //绑定FBO,
上操作,把输入的纹理ID上的图像,输出到FBO的纹理ID上然后返回。 FBO离屏渲染呢,什么是FBO呢。 帧缓冲对象FBO(Frame buffer Object)。 安卓端FBO写法 前文代码示例中,已经给出了FBO的写法了,这里再展示FBO的OpenGL.API 1、创建FBO //创建FrameBuffer mFrameBuffers = new int[1]; GLES20.glGenFramebuffers(mFrameBuffers.length, mFrameBuffers, 0); 2、绑定FBO 通过绑定纹理对象来锁定挂接渲染区 //绑定FBO,在
在这篇文章主要用到的知识点有如下,建议先看一下: OpenGLES绘制图片纹理 OpenGLES顶点缓冲VBO OpenGLES帧缓冲FBO 有一个渲染流数据的相关的示例,也可以看一下,这样对本篇理解就会很简单 ES生成纹理 2.OpenGL ES创建SurfaceTexture并绑定 3.OpenGL ES摄像头预览 比如美颜相机那些,处理摄像头数据展示出来,为了提高预览的效率,所以这里使用了VBO和FBO FBO所需的glsl: vertex_shader.glsl attribute vec4 av_Position;//顶点位置 attribute vec2 af_Position;//纹理位置 varying 处理,然后拿到fbo的纹理id渲染即可: @Override public void onDrawFrame() { //调用触发onFrameAvailable glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //使用程序 GLES20.glUseProgram(program); //绑定fbo
使用 MRT 技术,一般需要为帧缓冲区对象(FBO)的设置多个颜色附着。 FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO)。 FBO 帧缓冲区对象 FBO 本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它提供了 3 种附着(Attachment),分别是颜色附着、深度附着和模板附着。 本文为演示 MRT 技术的使用,为 FBO 的颜色附着设置 4 个纹理,一个纹理作为一个颜色附着(颜色缓冲区)。 ); glBindFramebuffer(GL_FRAMEBUFFER, m_FBO); //生成 4 个纹理 glGenTextures(ATTACHMENT_NUM, m_AttachTexIds
然后根据当前的context,创建捕获屏幕纹理CVOOpenGLESTextureRef,随后创建中间渲染纹理;最后绑定纹理到FBO上面,此时,原本绘制到屏幕上的内容,将转为绘制到我们创建的中间渲染纹理上面 其实现流程如图所示: 其中绑定纹理到FBO的代码如下: //绑定纹理到FBO上 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 ; glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo); //创建输出屏幕FBO glGenFramebuffers ); 上面主要阐述创建自己的renderTexture后,然后通过绑定纹理到FBO上面,执行这样的操作以后,原本输出到屏幕上的内容,将转为绘制到renderTexture中,然后再创建输出屏幕FBO,以及截图的 FBO;最后再通过_captureFbo画入捕捉纹理,通过_outFbo输出到屏幕。
使用 MRT 技术,一般需要为帧缓冲区对象(FBO)的设置多个颜色附着。 FBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO)。 ? FBO 本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它提供了 3 种附着(Attachment),分别是颜色附着、深度附着和模板附着。 本文为演示 MRT 技术的使用,为 FBO 的颜色附着设置 4 个纹理,一个纹理作为一个颜色附着(颜色缓冲区)。 ); glBindFramebuffer(GL_FRAMEBUFFER, m_FBO); //生成 4 个纹理 glGenTextures(ATTACHMENT_NUM, m_AttachTexIds
创建FBO int[] fbos = new int[1]; GLES20.glGenFramebuffers(1, fbos, 0); fboId = fbos 绑定FBO GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId); //3. 创建FBO纹理 fboTextureId = createTexture(); //4. 设置FBO分配内存大小 GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, w, h, 解绑纹理和FBO GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); GLES20.glBindFramebuffer(GLES20