VBO的目的:
主要是为了提高效率,减少在CPU向GPU中传输数据,直接在GPU上申请内存空间
两种target分别是GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER
分别对应顶点数据和索引
使用glVertexAttribPointer和glDrawElements的流程和以前大致保持一致,区别在于,最后一个参数不是传指针了,而是传bindBuffer的偏移量
VBO使用的大概流程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| //获取一个操作句柄 glGenBuffers(1, &_vertexBuffer); //设置缓存对象类型,数据缓存对象,还是元素缓存对象,通俗的说就是数组还是索引 glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); //分配内存空间 glBufferData(GL_ARRAY_BUFFER, 7*3*sizeof(GLfloat), vertices, GL_STATIC_DRAW);
在绘制代码Draw时,可以使用,绘制代码与正常并无冥想差别 glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 7*sizeof(float), 0); glEnableVertexAttribArray(_positionSlot);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _triangleIndexBuffer); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, 0);
//可以在清理时,释放VBO glDeleteBuffers(1, &_vertexBuffer); _vertexBuffer = 0;
glDeleteBuffers(1, &_triangleIndexBuffer); _triangleIndexBuffer = 0;
|