美文网首页
OpenGl ES 2.0 Learn For Android(

OpenGl ES 2.0 Learn For Android(

作者: 月止风溟 | 来源:发表于2019-06-09 00:32 被阅读0次

OpenGl ES 2.0 Learn For Android(6)VBO

还是想在技术的路上走得更远,现在却相当的疑惑。有时也想想,自己说淡出想做技术,或许是想逃避人事与职场关系?

加班,换住所,以及在晚上一个人痛哭,和朋友喝酒到凌晨。幸运的是,在这个城市里,还有很多的朋友愿意听我倾诉,给我安慰。生活还会继续,明天自然会更好!

前六篇的内容在这里。
OpenGl ES 2.0 Learn For Android
OpenGl ES 2.0 Learn For Android(一)世界是三角形的
OpenGl ES 2.0 Learn For Android(二)给三角形贴上图片
OpenGl ES 2.0 Learn For Android(三)初探三维的世界
OpenGl ES 2.0 Learn For Android(四)画一个三角锥
OpenGl ES 2.0 Learn For Android(五)碰撞检测

1. VBO

技术的发展背景就是这样的吧。出现问题,解决问题。所以接口和框架越来越多,而入门门槛月以来越低。
顶点数据通过渲染通道绘制到屏幕,要有CPU->GPU这样的一个过程。每绘制一帧,都需要重复传输一遍的话,这个IO的效率实在是太低了。
VBO是可以在GPU划分一块内存,将顶点输出存储在GPU。那每次渲染的时候,如果顶点数据没有变化,就可以直接在GPU端进行读取,减少了CPU->GPU这个过程。

2. 创建VBO

VBO的使用方法类似,还是glGenBuffers->glBindBuffer。使用示例如下:

    private void initVBO(){
        // Allocate a buffer.
        final int buffers[] = new int[1];
        glGenBuffers(buffers.length, buffers, 0);

        if (buffers[0] == 0) {
            throw new RuntimeException("Could not create a new index buffer object.");
        }

        mVboBufferId = buffers[0];

        // Bind to the buffer.
        glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);

        // Transfer data from native memory to the GPU buffer.
        glBufferData(GL_ARRAY_BUFFER,mVertexData.capacity()*BYTES_PER_FLOAT,mVertexData,GL_STATIC_DRAW);

        // IMPORTANT: Unbind from the buffer when we're done with it.
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        // We let the native buffer go out of scope, but it won't be released
        // until the next time the garbage collector is run.
    }

在这里用一个变量mVboBufferId保存了这段buffer的地址。那么在使用的时候,我们之前传输数据,用的是

        mVertexData.position(0);
        glVertexAttribPointer(aPositionLocation, 3, GL_FLOAT,
                false, 0, mVertexData);
        glEnableVertexAttribArray(aPositionLocation);

使用VBO之后,我们通过以下代码初始化顶点:

        initVBO();
        glBindBuffer(GL_ARRAY_BUFFER,mVboBufferId);
        glVertexAttribPointer(aPositionLocation, 3, GL_FLOAT,
                false, 3*BYTES_PER_FLOAT, 0);
        glBindBuffer(GL_ARRAY_BUFFER,0);

由一开始的直接传入mVertexData,换成了先glBindBuffer,再进行数据传入。其实第一个操作的实质也就是第二个。用更早的API接口,才会涉及不缓存顶点数据。这个更早的接口都废弃了。

3.改变顶点数据

那我们想改变改变已有的顶点数据,该怎么办呢?
这里在第一次点击的时候,把顶点大小扩大一倍。

private void updateVertex() {
        synchronized (this) {
            if (!mHadChanged) {
                for (int i = 0; i < mTrianglePoints.length; i++) {
                    mTrianglePoints[i] *= 2f;
                }
                mVertexData.clear();
                mVertexData.put(mTrianglePoints);
                mVertexData.position(0);
                glBindBuffer(GL_ARRAY_BUFFER, mVboBufferId);
                glBufferData(GL_ARRAY_BUFFER, mVertexData.capacity() * BYTES_PER_FLOAT, mVertexData, GL_STATIC_DRAW);
                glBindBuffer(GL_ARRAY_BUFFER, 0);
                mHadChanged = true;
            }
        }
    }

可以录屏的手机坏了,就这样吧。。。

demo地址:
https://github.com/YueZhiFengMing/LearnOpenGl/tree/master/Fourth3D

参考资料###

  1. 《OpenGL ES应用开发实践指南:Android卷》

相关文章

网友评论

      本文标题:OpenGl ES 2.0 Learn For Android(

      本文链接:https://www.haomeiwen.com/subject/bxtgxctx.html