问题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暂时渲染到这个地方,之后再次使用。下面是几点需要注意的地方:
关于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如果英文不好,可以看下对应的部分译文 http://blog.youkuaiyun.com/xiajun07061225/article/details/7283929
framebuffer本身是没有内存的,实际上可以把他理解为一个插线板,他上面可以附加一些外设(包含两种:texture和render buffer),而这两种外设是需要分配内存的,同时一个framebuffer可以附加的外设的数量也是有限的,这个最大数量GL_MAX_COLOR_ATTACHMENTS与硬件相关,可以通过glget函数查询。
Part2:在GPU中存放多张待使用的texture
- 我想要实现的应用是,对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