【问题标题】:OutOfMemoryError issue in Vertex buffer Object (VBO)顶点缓冲区对象 (VBO) 中的 OutOfMemoryError 问题
【发布时间】:2013-05-17 06:10:51
【问题描述】:

从 VAO 转移到 VBO 进行渲染时,我在这里遇到了问题。我正在使用 Android 平台并使用 JNI 的 OpenGL API。 这是我的 sn-p 代码

// Initialize in constructor
GLuint buffer[3];
glGenBuffers(3, buffer);

// In onDrawFrame(), I create draw function.
// My object data will be dynamically updated during runtime so I used GL_DYNAMIC_DRAW.

glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
glBufferData(GL_ARRAY_BUFFER, genData.cubeNumVerts * 4, genData.vertex, GL_DYNAMIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, buffer[1]);
glBufferData(GL_ARRAY_BUFFER, genData.cubeColorVerts *4, genData.colors, GL_DYNAMIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, buffer[2]);
glBufferData(GL_ARRAY_BUFFER, genData.cubeNormalVerts * 4, genData.normals, GL_DYNAMIC_DRAW);


  if(genData.vertex == 0 || genData.normals == 0 || genData.colors == 0) LOG("Error: failed to allocate a memory");


  glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
  glEnableVertexAttribArray(vertexHandle);
  glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0,0);

  glBindBuffer(GL_ARRAY_BUFFER, buffer[2]);
  glEnableVertexAttribArray(normalHandle);
  glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0,0);

  glBindBuffer(GL_ARRAY_BUFFER, buffer[1]);
  glEnableVertexAttribArray(mColorHandle);
  glVertexAttribPointer(mColorHandle, 4, GL_FLOAT, GL_FALSE, 0,0);

  glDrawArrays(GL_TRIANGLES, 0, genData.cubeNumVerts);

  glDeleteBuffers(3, buffer);

通过使用这个 sn-p 代码,我在渲染时遇到了 OutofMemoryError。我无法弄清楚可能导致此错误的原因。如果有人注意到从这个 sn-p 代码中使用 VBO 的不当之处,请帮助我。

谢谢

【问题讨论】:

  • 无需每次都重新创建缓冲区。重复使用它们。
  • 是的,这就是为什么我把它放在初始化时(参见我说我把它放在构造函数中的注释行)。你看到其他错误了吗?

标签: android opengl-es-2.0 vbo


【解决方案1】:

glBufferData 中指定的缓冲区大小是以字节 为单位的数据大小。所以你说每个缓冲区都是numVerts * 4 字节大(我希望所有那些cube...Verts 数字都是相等的,否则这只会导致错误和混乱),但是你告诉glVertexAttribPointer 你得到numVerts * 3(或numVerts * 4 分别为 32 位浮点数,因此是 numVerts * 3 (or 4) * 4 字节的顶点数据。所以glDrawArrays 将读取实际数据,可能会导致一些访问冲突或其他未定义或错误的行为。

【讨论】:

  • 嗨,所有立方体的顶点数都是相等的。但我无法理解您在这里的解释“因此 numVerts * 3(或 4)* 4 个字节的顶点数据。因此 glDrawArrays 将读取实际数据,可能导致某些访问冲突或其他未定义或错误的行为。”你能解释得更清楚吗?谢谢
  • @deduu 使用您的glBufferData 调用您将numVerts*4 字节复制到缓冲区中。然后在调用glVertexAttribPointer 时,您说顶点位置由3 个浮点数组成,因此是3*4 = 12 字节。然后,当您使用glDrawArrays 绘制numVerts 顶点时,它会尝试从仅包含numVerts*4 字节的缓冲区中读取numVerts*3*4 字节。
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2012-01-23
相关资源
最近更新 更多