Android OpenGL ES 3.0 Pixel Buffer Object使用

关于PBO,找了很多资料,然而google了很久,大部分的PBO资料都和这个类似https://blog.youkuaiyun.com/panda1234lee/article/details/51546502 。在上传texture的过程中,我分别试了1、2、3个PBO来进行上传,然而效率并没有增加,反而下低了,有点无法理解。然而在读取数据时候,使用两个PBO是可以提高效率,所以总的来说还是有一定研究价值的。

使用两个PBO减少glReadPixels的时间

我这里模仿了一下不断采集纹理,我每次用同一张图片去完整更新纹理,就好像每次都采集了一张图片。然后使用FBO进行中间处理,读取数据后复制出来到一个数组。总的来说就是模拟摄像头采集然后编码的流程吧。主要是为了避免过多的逻辑尽量减少额外的功能点。

首先先生成两个PBO,并且分配空间,这里我还生成了三个上传纹理的PBO,但是没有使用了,因为上传纹理没办法通过PBO提高效率,有知道的大佬可以告诉一下原因。

if (init) {
        init= false;
        uploadPobs = new GLuint[3];
        downloadPbos = new GLuint[2];
        glGenBuffers(3, uploadPobs);
        glGenBuffers(2, downloadPbos);
        int align = 128;
        int width = curPicWidth;
        int height = curPicHeight;
        mPboSize = ((width * 4 + (align - 1)) & ~(align - 1)) * height;
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, uploadPobs[0]);
        glBufferData(GL_PIXEL_UNPACK_BUFFER, mPboSize, 0, GL_STREAM_DRAW);
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, uploadPobs[1]);
        glBufferData(GL_PIXEL_UNPACK_BUFFER, mPboSize, 0, GL_STREAM_DRAW);
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, uploadPobs[2]);
        glBufferData(GL_PIXEL_UNPACK_BUFFER, mPboSize, 0, GL_STREAM_DRAW);
        glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
        glBindBuffer(GL_PIXEL_PACK_BUFFER, downloadPbos[0]);
        glBufferData(GL_PIXEL_PACK_BUFFER, mPboSize, 0, GL_STATIC_READ);
        glBindBuffer(GL_PIXEL_PACK_BUFFER, downloadPbos[
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值