opengles vbo

VBO简介

为什么要用VBO

不使用VBO时,我们每次绘制( glDrawArrays 图形时都是从本地内存处获取顶点数据然后传输给OpenGL来绘制,这样就会频繁的操作CPU->GPU增大开销,从而降低效率。
使用
VBO我们就能把顶点数据缓存到GPU开辟的一段内存中,然后使用时不必再从本地获取,而是直接从显存中获取,这样就能提升绘制的效率。

如果有什么不懂的同学可以看看 视频讲解吧:https://edu.csdn.net/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需要的缓存大小
//javaint4个字节,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);
}

 

你可能感兴趣的:(Android)