opengl fbo离屏渲染,处理Android截屏卡顿太久。

1.首先说明一下,只做参考。项目记录。由于项目需求,涉及到摄像头截图。当然了是GLSurfaceView了。

2.自己定义一个Renderer实现GLSurfaceView.Renderer,在onDrawFrame函数里面操作。

相信大部分人都是在这里面开启异步进行截图。使用这个函数,或者其他

GLES20.glReadPixels(0, 0,width_surface, height_surface,GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer);

在此之前,楼主也是这样操作,发现截图会卡顿,每个机子卡顿时间不一样。但大多数要300多ms。或更久。

3.不想啰嗦了,上代码。

4.定义两对象。

 private int[] fFrame = new int[1];
 private int[] fTexture = new int[1];
5.开启的函数,这里是用GLES20。

 private void bindfbo() {
        GLES20.glGenFramebuffers(1, fFrame, 0);

        GLES20.glGenTextures(1, fTexture, 0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, fTexture[0]);
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width_surface, height_surface,0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);

        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

        GLES20.glBindFramebuffer(GL_FRAMEBUFFER, fFrame[0]);
        GLES20.glFramebufferTexture2D(GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D, fTexture[0], 0);

        int status= GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
        if(status !=GLES20.GL_FRAMEBUFFER_COMPLETE) {
            throw new RuntimeException("status:"+status+", hex:"+Integer.toHexString(status));
        }
}
6.每一次开启后要解绑

private void unbindfbo() {
        GLES20.glBindFramebuffer(GL_FRAMEBUFFER, 0);
        GLES20.glDeleteTextures(1, fTexture, 0);
        GLES20.glDeleteFramebuffers(1, fFrame, 0);
    }
7.注意事项:

不要每一次都开启。用按钮写个接口或者布尔值控制,点击就截图。然后解绑。

来张截图吧。





  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值