You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从VAO关联的VBO中获取存储的顶点float数组?

如何从VAO关联的VBO中获取存储的顶点float数组?

嘿,我来帮你捋捋问题出在哪——你现在的核心错误是完全误解了glGetVertexAttribPointer的返回值,咱们一步步拆解:

首先,你误以为glGetVertexAttribPointer返回的是VBO的ID,但实际上它返回的是该顶点属性在关联VBO中的字节偏移量!比如你当初调用glVertexAttribPointer(0, ..., 0)的时候,最后一个参数传的就是偏移量0,所以这个函数返回0是完全正常的,它根本不是VBO的ID,你把它当成VBO ID去执行glBindBuffer当然会出错。

那为什么OpenGL不让我们直接从VAO反向查到对应的VBO呢?因为VAO的设计初衷只是保存顶点属性的配置状态,它并没有提供API让你反向查询关联的VBO ID——你得自己在创建VBO的时候就把它的ID存下来,比如用一个变量、一个自定义类来统一管理VAO、对应的VBO、顶点数量这些资源信息。

给你修正后的正确代码,假设你当初创建VBO时已经保存了vboId这个变量:

float[] b = new float[vertexCount];
// 绑定VAO这步其实可以省略,因为我们直接操作目标VBO就行
glBindVertexArray(vaoId);
// 直接绑定你自己保存的VBO ID,不是那个错误的pointer值!
glBindBuffer(GL_ARRAY_BUFFER, vboId);
// 现在再获取数据就没问题了
glGetBufferSubData(GL_ARRAY_BUFFER, 0, b);

// 好习惯:用完记得解绑缓冲区和VAO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

再补充两个关键点:

  • 你能正常绘制说明VAO和VBO的配置完全没问题,只是读取数据的逻辑踩了API的坑
  • 永远不要依赖OpenGL去反向查询你自己创建的对象ID,自己主动管理这些资源才是最靠谱的做法——比如封装一个VertexBuffer类,把VAO、VBO、顶点数、属性配置都打包进去,用的时候直接调用就行

备注:内容来源于stack exchange,提问作者Maaa aango

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:22:59