一、前言
前面说了VBO和EBO。这里面会导致一个问题,当顶点属性不多的时候,直接使用VBO、EBO比较好,但是对于有很多顶点属性的时候,太多的VBO会导致操作错误。为此出现了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