OpenGLES 之 VAO顶点数组对象(七)

一、前言

前面说了VBO和EBO。这里面会导致一个问题,当顶点属性不多的时候,直接使用VBO、EBO比较好,但是对于有很多顶点属性的时候,太多的VBO会导致操作错误。为此出现了VAO,顶点数组对象。

VAO

对于一个VAO,可以绑定多个VBO和一个EBO数据。这样所有的操作就从EBO转入到VAO了,便于操作和管理。

下面就看下VAO管理VBO的例子。

二、VAO的使用

  • 1、创建VAO
    glGenVertexArrays是创建VAO对象的句柄的方法。
   GLES30.glGenVertexArrays(1,vaos,0);
  • 2、创建VBO
    将顶点和颜色数据放入到同一个数组triangleCoords中。

然后再创建一个VBO,将triangleCoords中的数据放入到VBO缓冲区中。

    // 三维的顶点坐标,有方向的
    private static final float triangleCoords[] = {
            // 位置              // 颜色
            0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
            -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
            0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部
    };

        // 创建VBO
        int[] vbos = new int[1];
        GLES20.glGenBuffers(vbos.length, vbos, 0);
        vboId = vbos[0];

        int[] ebos = new int[1];
        GLES20.glGenBuffers(ebos.length, ebos, 0);
        eboId = ebos[0];

        // 绑定VBO
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId);
        //赋值
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER,triangleCoords.length * 4,vertexBuffer,GLES20.GL_STATIC_DRAW);

        //获取顶点着色器的vPosition成员句柄
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
        mColorHandle = GLES20.glGetAttribLocation(mProgram, "aColor");
  • 3、VBO绑定到VAO中
    在glBindVertexArray绑定到VAO中,后期执行 GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboId);这样就把VBO依附于VAO中了。

因为顶点数据和颜色数据都存在同一个数据当中,我们需要分别的处理,就需要偏移量。

下面的例子中,设置顶点句柄和颜色句柄的时候就分别的从缓存中读取数据。

      //准备三角形的坐标数据
        GLES20.glVertexAttribPointer(mPositionHandle, 3,
                GLES20.GL_FLOAT, false,
                24,0);
        //启用三角形顶点的句柄
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        //设置绘制三角形的颜色
        GLES20.glVertexAttribPointer(mColorHandle, 3,
                GLES20.GL_FLOAT, false,
                24,12);
        GLES20.glEnableVertexAttribArray(mColorHandle);
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
        GLES30.glBindVertexArray(0);

三、代码

代码整合在github

你可能感兴趣的:(OpenGLES 之 VAO顶点数组对象(七))