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 | unsigned int 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 | unsigned int VAO; |
创建着色器对象
1 | fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); |
一个顶点数组对象会储存这些内容
- glEnableVertexAttribArray和glDisableVertexAttribArray的调用
- 通过glVertexAttribPointer设置的顶点属性配置
- 通过glVertexAttribPointer调用与顶点属性关联的VBO
引用
- https://blog.csdn.net/weixin_44142774/article/details/117190674?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-117190674-blog-103956589.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-117190674-blog-103956589.pc_relevant_aa&utm_relevant_index=1
- https://blog.csdn.net/qq_32974399/article/details/103956589
- https://zhuanlan.zhihu.com/p/158630154