调用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
相关产品推荐
相关产品推荐

