0

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

// 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);

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

谢谢

4

1 回答 1

1

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

于 2013-05-17T15:57:30.300 回答