Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 顶点缓冲区对象(VBO)中的OutOfMemoryError问题_Android_Opengl Es 2.0_Vbo - Fatal编程技术网

Android 顶点缓冲区对象(VBO)中的OutOfMemoryError问题

Android 顶点缓冲区对象(VBO)中的OutOfMemoryError问题,android,opengl-es-2.0,vbo,Android,Opengl Es 2.0,Vbo,在从VAO移动到VBO进行渲染时,我遇到了这个问题。我正在使用Android平台和JNI的OpenGLAPI。 这是我的代码片段 // 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 u

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

// 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的不当之处,请帮助我


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

无需每次重新创建缓冲区。重用它们。是的,这就是为什么我只是把它放在初始化中(请参阅我说过我把它放在构造函数中的注释行)。你看到其他错误了吗?嗨,所有的立方体顶点数都相等。但我无法理解您在这里的解释“因此numVerts*3(或4)*4字节的顶点数据。因此glDrawArrays将读取实际数据,可能导致一些访问冲突或其他未定义或错误的行为。”您能更清楚地解释一下吗?thanks@deduu使用
glBufferData
调用,将
numVerts*4
字节复制到缓冲区中。然后调用
glvertexattributepointer
时,您会说顶点位置由3个浮点数组成,因此
3*4=12
字节。然后,当您使用
glDrawArrays
绘制
numVerts
顶点时,它会尝试从仅包含
numVerts*4
字节的缓冲区中读取
numVerts*3*4
字节。