VBO 定义
VBO(Vertex Buffer Object) 是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VBO 和 EBO实际上是同一类 buffer 按照用途的不同称呼
OpenGL-ES2.0 编程中,用于绘制的顶点数组数据首先保存在系统内存,在调用 glDrawArrays 或者 glDrawElements 等进行绘制的时候,需要将顶点数组数据从系统内存拷贝到显存,但是很多时候我们没必要在每次绘制的时候进行内存拷贝,如果可以在显存中缓存这些数据,就可以在很大程度上降低内存拷贝带来的开销
OpenGL-ES 支持的缓冲区对象包含:
- 数组缓冲区对象
GL_ARRAY_BUFFER指定数组缓冲区对象用于创建保存顶点数据的缓冲区对象 - 元素数组缓冲区对象
GL_ELEMENT_ARRAY_BUFFER用于创建保存图元索引的缓冲区对象 - 统一变量缓冲区
- 变换反馈缓冲区
- 像素解包缓冲区
- 像素包装缓冲器
- 复制缓冲区
OpenGL-ES3.0 编程中,VBO 和 EBO 的出现就是为了解决这个问题
VBO 和 EBO 的作用就是在显存中提前开辟好一段内存,用于缓存顶点数据或者图元索引数据,从而避免每次绘制时 CPU 和 GPU 之间的内存拷贝,改进渲染性能,降低内存带宽和功耗
GL_Array_Buffer标志指定的缓冲区对象用于保存顶点数组GL_Element_Array_Buffer用于标识指定缓冲区对象用于保存图元索引
VBO 创建
VBO 创建的基本流程如下所示:
// 创建两个VBO
glGenBuffers(2, userData->vboIds);
//绑定第一个VBO,拷贝顶点数组到显存
glBindBuffer(GL_ARRAY_BUFFER, userData->vboIds[0]);
glBufferData(GL_ARRAY_BUFFER, vtxStride * numVertices, vtxBuf, GL_STATIC_DRAW);
//绑定第二个VBO,拷贝图元索引的显存(EBO)
//可以认为图元索引也需要同时标志为(Element Buffer object)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, userData->vboIds[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(GLushort) * numIndices, indices, GL_STATIC_DRAW);
void glBufferData( GLenum target, GLsizeiptr size, const void * data, GLenum usage);
注意第二个和第三个参数:
GLsizeiptr size: 顶点存储区的实际大小(Bytes 为单位)const void * data: 指向顶点存储区的指针
统一VertexData
前面章节三角形的 demo 中,Vertex Array 的值得单独设定的,但是 Vertex 的颜色是使用的固定值,这里可以给每个Vertex 单独设定颜色

顶点位置和顶点颜色可以放在同一个数组中,通过 glVertexAttribPointer 的起始位置和 stride 进行区分,示意如下:

示例代码如下:(不使用 VBO 绘制)
#define VERTEX_POS_SIZE 3 // x, y and z
#define VERTEX_COLOR_SIZE 4 // r, g, b, and a
#define VERTEX_POS_INDX 0
#define VERTEX_COLOR_INDX 1
//代码起点,绘制函数
void Draw ( ESContext *esContext ) {
UserData *userData = esContext->userData;
// 3 vertices, with (x,y,z) ,(r, g, b, a) per-vertex
GLfloat vertices[3 * ( VERTEX_POS_SIZE + VERTEX_COLOR_SIZE )] = {
-0.5f, 0.5f, 0.0f, // v0
1.0f, 0.0f, 0.0f, 1.0f, // c0
-1.0f, -0.5f, 0.0f, // v1
0.0f, 1.0f, 0.0f, 1.0f, // c1
0.0f, -0.5f, 0.0f, // v2
0.0f, 0.0f, 1.0f, 1.0f, // c2
};
// Index buffer data
GLushort indices[3] = {
0, 1, 2 };
glViewport ( 0, 0, esContext->width, esContext->height );
glClear ( GL_COLOR_BUFFER_BIT );
glUseProgram ( userData->programObject );
glUniform1f ( userData->offsetLoc, 0.0f );
DrawPrimitiveWithoutVBOs ( vertices,
sizeof ( GLfloat

最低0.47元/天 解锁文章
3424

被折叠的 条评论
为什么被折叠?



