OpenGL中VAO的属性列表存储VBO对象还是VBO内部的数据?
OpenGL VAO属性列表存储问题解答
核心结论
VAO的属性列表既不存储VBO内部的实际顶点数据,也不存储完整的VBO对象本身,仅存储两部分内容:对应VBO的ID(引用标识)、以及从该VBO中读取对应顶点属性的配置参数。
具体逻辑说明
VAO本质是 OpenGL 中的状态集合容器,设计目的就是避免每次绘制时重复配置顶点属性的步骤,它本身不承担任何实际数据的存储职责,所有顶点数据始终仅存于VBO中。
当你调用glVertexAttribPointer配置顶点属性时,OpenGL会做以下操作:
- 读取当前绑定到
GL_ARRAY_BUFFER目标的VBO的ID - 将这个VBO ID,和你传入的属性参数(步长、偏移量、数据类型、是否归一化、属性索引等)共同存入当前绑定的VAO的对应属性槽位
配置完成后,GL_ARRAY_BUFFER目标的后续绑定变更不会影响已经写入VAO的属性配置,因为VAO已经独立保存了需要关联的VBO的ID。
常见误区澄清
误区1:VAO会复制VBO中的实际顶点数据
顶点数据全程仅在VBO中存储一份,VAO仅记录数据的读取规则和对应VBO的标识。如果你修改了VBO中的数据,使用同一个VAO执行绘制时,读取到的就是修改后的数据,不需要重新配置VAO。
误区2:VAO存储了完整的VBO对象实体
VAO仅存储VBO的ID引用,如果你主动调用glDeleteBuffers删除了关联的VBO,即便VAO本身没有被删除,后续使用该VAO绘制时也会出现报错,因为VAO保存的VBO引用已经失效。
内容的提问来源于stack exchange,提问作者OpenGLUser
相关产品推荐
相关产品推荐

