解决android opengl glReadPixels 慢的问题 三

解决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;

	}

你可能感兴趣的:(android,opengl,es,android,glread,慢,FBO,帧缓冲区)