如何从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
相关产品推荐
相关产品推荐

