OpenG学习笔记-03-VBO/VAO

📅 2026/6/25 13:33:35
OpenG学习笔记-03-VBO/VAO
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把商品装箱寄给GPUunsignedintVBO;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就能切换不同模型的数据格式