从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不合适,请帮助我。
由于
答案 0 :(得分:1)
glBufferData
中指定的缓冲区大小是字节中数据的大小。所以你说每个缓冲区都是numVerts * 4
个字节大(我希望所有那些cube...Verts
个数字都相等,否则这只是错误和混乱的约束),但是你告诉glVertexAttribPointer
你得到numVerts * 3
(或numVerts * 4
)32位浮点数,因而得到numVerts * 3 (or 4) * 4
个字节的顶点数据。因此glDrawArrays
将读取实际数据,可能会导致某些访问冲突或其他未定义或错误的行为。