解决android opengl glReadPixels 慢的问题 三
使用2个pbo效率提上去了,但是我手机分辨率是720p, 或者1080p,我们手机相机使用一般是480x640,这样通过gpu渲染到1080p,然后再去从gpu里边去读,虽然使用了2
个pbo,但是感觉还是浪费系统资源了,那我们怎么能够尽可能使用gpu渲染我最需要的尺寸呢?
那么最好的办法是你需要离线的帧渲染缓冲区 FBO, 把你从摄像头拿来的480x640的尺寸 直接渲染到FBO里,再创建2个pbo从gpu读取渲染后的图片, 再通过surfaceview
显示出这个渲染后的照片,这样可以大大加快你的速度,这个时候你同时可以做动态贴图变脸等等操作。
创建FBO代码
private int loadFramebuffer(int texture, int width,int height){
IntBuffer max = IntBuffer.allocate(10);
int temp = 0;
GLES30.glGetIntegerv(GLES30.GL_MAX_RENDERBUFFER_SIZE, max);
temp = max.get(0);
if (temp <= width && temp <= height)
{
return -1;
}
GLES30.glGenFramebuffers(1, framebuffer);
GLES30.glGenRenderbuffers(1, depthRenderbuffer);
GLES30.glBindRenderbuffer(GLES30.GL_RENDERBUFFER, depthRenderbuffer.get(0));
GLES30.glRenderbufferStorage(GLES30.GL_RENDERBUFFER, GLES30.GL_DEPTH_COMPONENT16, width, height);
GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, framebuffer.get(0));
GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, texture, 0);
GLES30.glFramebufferRenderbuffer(GLES30.GL_FRAMEBUFFER,GLES30.GL_DEPTH_ATTACHMENT, GLES30.GL_RENDERBUFFER, depthRenderbuffer.get(0));
int status = 0;
status = GLES30.glCheckFramebufferStatus(GLES30.GL_FRAMEBUFFER);
if (status == GLES30.GL_FRAMEBUFFER_COMPLETE){
Log.d(TAG,"frame buffer init ok!!!!!!!");
return framebuffer.get();
}
Log.d(TAG,"frame buffer init file!!!!!!!");
return -1;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)