关于OpenGL中FrameBuffer Object的使用

本文详细介绍了OpenGL Framebuffer Object(FBO)的使用,包括FBO的基本概念、如何在GPU中存放多张纹理,以及如何将TEXTURE_EXTERNAL_OES转换为TEXTURE_2D。通过FBO进行离屏渲染,讨论了帧缓冲切换速度与多个纹理挂载点的效率,并提供了将相机数据存储为纹理的实践方法。
摘要由CSDN通过智能技术生成

问题1:如何在GPU中存放一些texture以后用

问题2:如何把camera传过来的对应TEXTURE_EXTERNAL_OES目标的texture转换为TEXTURE_2D类型使用


Part1:FBO的介绍和学习

OpenGL frambuffer object简称FBO,我们在OpenGL最终的渲染地点在framebuffer中,相比default的framebuffer(连接在屏幕上),OpenGL frambuffer object是用户自定义的,可以用于offscreen render以及将一些texture暂时渲染到这个地方,之后再次使用。下面是几点需要注意的地方:

  1. 关于FBO网上我觉得最好的材料是:
    http://www.songho.ca/opengl/gl_fbo.html
    https://www.opengl.org/wiki/Framebuffer_Object_Examples#Quick_example.2C_render_to_texture_.282D.29

  2. 如果英文不好,可以看下对应的部分译文 http://blog.csdn.net/xiajun07061225/article/details/7283929

  3. framebuffer本身是没有内存的,实际上可以把他理解为一个插线板,他上面可以附加一些外设(包含两种:texture和render buffer),而这两种外设是需要分配内存的,同时一个framebuffer可以附加的外设的数量也是有限的,这个最大数量GL_MAX_COLOR_ATTACHMENTS与硬件相关,可以通过glget函数查询。


Part2:在GPU中存放多张待使用的texture

  1. 我想要实现的应用是,对camera传来的数据,在GPU中buffer 30帧,之后要以texture的方式要使用这30帧。这件事可以有两种解决方法:

第一,我的手机每个framebuffer最多可以挂载8个texture,那么我就建立4个framebuffer(4*8=32>0),依次把这30帧draw到每一个texture中。
第二,直接建立30个framebuffer,每个framebuffer都只挂载一个texture,之后每帧都draw到每个独立的framebuffer中的texture中。

在网上大部分帖子都推荐第一种方法,原因是,切换同一个framebuffer的不同texture挂载点(这里用gldrawbuffer函数)速度要比切换framebuffer(使用glBindFramebuffer)要快。但是我一开始开开心心的使用第一种方法的时候发现不管怎么整,我明明分配了8个Texture id挂载到一个framebuffer的,然而只有第一个才能用,也就是只有framebuffer的GL_COLOR_ATTACHMENT0可以用,挂载到其他texture的都是不报错,但是draw进去没有一点反应,全是黑的,气cry!如果有人能解决这个问题,就是从camera中读取texture之后draw到一个framebuffer的不同挂载texture的,求告知怎么做~

好,下面说第二种方法怎么做。

首先,你得分配n个空的Texture id,同时分配好空间

 public int[] createMultipleTextureObject(int n,int width,int height) {

        int[] textures = new int[n];
        GLES30
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值