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

调用glGetBufferSubData()未获取到数据,是否使用方式有误?

问题分析与解决

你遇到的问题确实是glGetBufferSubData的调用方式有误,咱们一步步拆解问题:

1. 核心错误:glGetBufferSubData的第一个参数传错了

glGetBufferSubData的第一个参数不是缓冲区对象ID,而是缓冲区绑定目标(比如GL_ARRAY_BUFFER)。你现在直接传了bufferObject[0],这不符合OpenGL API的要求,导致无法正确读取目标缓冲区的数据。

2. 次要问题:内存分配不足

你只分配了单个Vector3的内存:

Vector3 *data = new Vector3();

但你要读取的是numVertices * sizeof(Vector3)大小的数据,如果numVertices > 1,这会直接导致内存越界,后续操作可能出现未定义行为。

修正后的代码示例

glBindVertexArray(arrayObject);
glGenBuffers(1, &bufferObject[0]);
glBindBuffer(GL_ARRAY_BUFFER, bufferObject[0]);
glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(Vector3), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);

// 修正点1:分配足够的内存存储所有顶点数据
Vector3 *data = new Vector3[numVertices];
// 修正点2:第一个参数传入缓冲区绑定目标GL_ARRAY_BUFFER
glGetBufferSubData(GL_ARRAY_BUFFER, 0, numVertices * sizeof(Vector3), data);

// 记得使用完后释放数组内存,避免泄漏
// delete[] data;

额外注意事项

  • 确保调用glGetBufferSubData时,目标缓冲区(GL_ARRAY_BUFFER)已经绑定了你要读取的bufferObject[0](你的代码里这部分是正确的,无需修改)。
  • 如果后续不再使用data,一定要用delete[]释放数组内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Hasan Al-Baghdadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:12