2013-05-17 70 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