2013-05-17 71 views
0

从VAO移动到VBO进行渲染时,我遇到了问题。我正在使用Android平台并使用来自JNI的OpenGL API。 这里是我的代码片段顶点缓冲区对象(VBO)中的OutOfMemoryError问题

// 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不合适,请帮助我。

由于

+1

无需每次重新创建缓冲区。重新使用它们。 – Trax

+0

是的,这就是为什么我只是把它放在初始化(见我说我把它放在构造函数中的注释行)。你看到其他错误吗? – deduu

回答

1

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

+0

嗨, 所有立方体verts数相等。但我无法理解你的解释 “,因此numVerts * 3(或4)* 4字节的顶点数据,所以glDrawArrays将读取实际数据,可能导致一些访问冲突或其他未定义或错误的行为。 你能解释得更清楚吗? 谢谢 – deduu

+0

@deduu用你的'glBufferData'调用你将'numVerts * 4'个字节复制到缓冲区中。然后当调用'glVertexAttribPointer'时,你说顶点位置由3个浮点数组成,因此'3 * 4 = 12'个字节。当你用'glDrawArrays'绘制'numVerts'顶点时,它会尝试从只包含'numVerts * 4'个字节的缓冲区读取'numVerts * 3 * 4'个字节。 –

+0

啊,我明白了..谢谢克里斯。现在它可以工作。 – deduu