OpenGL学习笔记-3

VBO、VAO、EBO

VBO

介绍

VBO,全称是Vertex Buffer Object

引自一个挂掉了网站——“VBO某种意义上来说就是VA(vertex array)的升级版。

传统的VA或“显示列表”需要在CPU和GPU之间反复传送数据,效率较低,于是就有了VBO。

VBO是在显存中开辟出来的内存缓存区,用于存储顶点的各类属性信息,包括Position Normal Color等。

渲染时,直接从VBO中取出顶点的各类属性数据,就不需要通过CPU传送,因此处理效率更高。

VBO不是唯一的,我们可以开辟多块VBO,每个VBO有独一无二的ID来标识,ID表示了具体VBO存储的显存地址。

代码

生成缓冲

1
2
unsigned int VBO;
glGenBuffers(1,&VBO);

把缓冲绑定到GL_ARRAY_BUFFER目标上

1
glBinBuffer(GL_ARRAY_BUFFER,VBO);

从此刻起,我们使用GL_ARRAY_BUFFER目标就是配置刚刚绑定的缓冲VBO。

配置顶点数据到缓冲的内存中

1
glBUfferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

这段代码把vertices数组这段数据缓冲到显存中,但是这些数据是如何组织的,那一部分代表位置,那一部分代表颜色,它的步长等等,我们后面通过另一个函数glVertexAtttribPointer(学习笔记2中记过的)来告诉OpenGL。

VAO

VAO全名叫做顶点数组对象(Vertex Array Object)

VAO是为了解决我们渲染物体数量过多的问题.

类似于复用,我们将顶点属性调用存储到VAO中,这样当配置顶点属性指针时,你只需要将那些调用执行一次,再绘制物体的时候只需要绑定相应的VAO就行了。

VAO本身并不存储顶点的相关属性数据,这些信息是存储在VBO中的,VAO相当于是对很多个VBO的引用

VBO是对顶点属性的绑定,VAO是对很多个VBO的绑定

代码

生成和绑定都和VBO很类似

1
2
3
unsigned int VAO;
glGEnVertexArrays(1,&VAO);
glBindVErtexArray(VAO);

创建着色器对象

1
2
3
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);

一个顶点数组对象会储存这些内容

  • glEnableVertexAttribArray和glDisableVertexAttribArray的调用
  • 通过glVertexAttribPointer设置的顶点属性配置
  • 通过glVertexAttribPointer调用与顶点属性关联的VBO

引用