OpenGL学习笔记-03-VBO/VAO
2026/6/26 1:36:11 网站建设 项目流程

VBO

  • 全称:顶点缓冲对象(Vertex Buffer Object)
  • 本质:就是一个管理GPU显存的对象
  • 作用:用来管理在GPU上开辟的显存,这块显存通常用来存储顶点
  • 类比:一个装着你三角形顶点的箱子

VAO

  • 全称:顶点数组对象(Vertex Array Object)
  • 本质:就是一个“配置清单”,告诉GPU,现在用的是哪一段VBO,这一段VBO里的数据是怎么排布的
  • 作用:让我不用每画一个三角形,都要重新走一遍所有的绑定流程
  • 类比:箱子上的说明书

生活化的类比

概念类比解释
原始数据你要寄的一堆商品(衣服、书本、电子产品)CPU内存里的顶点数组
VBO你把这些商品统一装进一个快递大箱子,然后交给快递公司把数据从CPU上传到GPU显存
VAO你在箱子外贴一张发货清单:“第一件是衣服,第二件是书本,第三件是电子产品”告诉GPU“每3个数是一个顶点的位置,每2个数是纹理坐标”
glDrawArrays你对快递员说:“按这张清单处理1号到3号商品”命令GPU开始画
  • 如果没有VAO(说明书):每次画的时候,你都要重新跟GPU说一遍“位置在偏移0、颜色在偏移12、步长是32”——就像每次都要重新写发货清单,快递员会被搞疯。
  • 有了VAO:你提前把说明书写好,以后每次只需要说“按说明书A来处理”,快递员就知道怎么做了。

代码层面的示例

// 第一步:准备原始数据(你要寄的商品)floatvertices[]={// 位置 // 颜色-0.5f,-0.5f,1.0f,0.0f,0.0f,0.5f,-0.5f,0.0f,1.0f,0.0f,0.0f,0.5f,0.0f,0.0f,1.0f};// 第二步:创建VBO(把商品装箱,寄给GPU)unsignedintVBO;glGenBuffers(1,&VBO);// 申请一个快递箱子glBindBuffer(GL_ARRAY_BUFFER,VBO);// 打开这个箱子glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);// 把数据装进去// 第三步:创建VAO(写说明书,告诉GPU怎么读)unsignedintVAO;glGenVertexArrays(1,&VAO);// 申请一张说明书glBindVertexArray(VAO);// 开始写说明书// 说明书内容:位置数据在偏移0的位置,每5个数一组glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,5*sizeof(float),(void*)0);glEnableVertexAttribArray(0);// 说明书内容:颜色数据在偏移3个float的位置,每5个数一组glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,5*sizeof(float),(void*)(3*sizeof(float)));glEnableVertexAttribArray(1);// 第四步:画图(快递员按说明书处理)glBindVertexArray(VAO);// 把说明书递给快递员glDrawArrays(GL_TRIANGLES,0,3);// 开始处理前3个顶点

两者的关系

  • VBO是必须的,VAO是可选的(但强烈建议使用)

    • 只有VBO,没有VAO:每次画之前都要调用glVertexAttribPointer重新配置一遍(麻烦,但能跑)
    • 有了VAO:配置一次,后面只需glBindVertexArray就能切换不同模型的数据格式

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询