VBO简介
为什么要用VBO
不使用VBO时,我们每次绘制( glDrawArrays )图形时都是从本地内存处获取顶点数据然后传输给OpenGL来绘制,这样就会频繁的操作CPU->GPU增大开销,从而降低效率。
使用VBO,我们就能把顶点数据缓存到GPU开辟的一段内存中,然后使用时不必再从本地获取,而是直接从显存中获取,这样就能提升绘制的效率。
如果有什么不懂的同学可以看看 视频讲解吧:https://edu.youkuaiyun.com/course/detail/23746
创建vbo
//创建vbo
int vbos[] = new int[1];
//向OpenGL ES申请开辟新的VBO
GLES20.glGenBuffers(1, vbos, 0);
mVbo = vbos[0];
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mVbo);
//3. 分配VBO需要的缓存大小
//java中int站4个字节,byte站一个字节
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, texCoor.length * 4 + triangleCoords.length * 4,
null, GLES20.GL_STATIC_DRAW);
//缓存顶点的buffer
GLES20.glBufferSubData(GLES20.GL_ARRAY_BUFFER, 0, triangleCoords.length * 4, mVertexBuffer);
//缓存纹理的buffer
GLES20.glBufferSubData(GLES20.GL_ARRAY_BUFFER, triangleCoords.length * 4, texCoor.length * 4,
colorBuffer);
//解绑
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
使用vbo
public void onDrawFrame(GL10 gl) {
//清除深度缓冲与颜色缓冲
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glClearColor(0f, 0f, 0f, 1f);
//制定使用某套share程序
GLES20.glUseProgram(shape.program);
//绑定纹理
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, shape.texuresID);
//绑定vbo
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,shape.mVbo);
//启用三角形顶点的句柄
GLES20.glEnableVertexAttribArray(shape.vPositionHandle);
//画笔设置顶点数据
GLES20.glVertexAttribPointer(shape.vPositionHandle, 2, GLES20.GL_FLOAT,
false, 0, 0);
//启用三角形顶点的句柄
GLES20.glEnableVertexAttribArray(shape.mColorHandle);
//画笔设置顶点数据
GLES20.glVertexAttribPointer(shape.mColorHandle, 2, GLES20.GL_FLOAT,
false, 0, shape.triangleCoords.length*4);
//开始绘制
GLES20.glDrawElements(GLES20.GL_TRIANGLES, shape.did.length, GLES20.GL_UNSIGNED_BYTE, shape.indexBuffer);
//禁止顶点数组的句柄
GLES20.glDisableVertexAttribArray(shape.vPositionHandle);
//禁止顶点数组的句柄
GLES20.glDisableVertexAttribArray(shape.mColorHandle);
}