2012-06-23 34 views
0

我試圖在OpenGL ES 2.0中使用頂點緩衝對象實現一些相對簡單的2D Sprite批處理。然而,我的幾何形狀不正確繪製和一些錯誤,我似乎無法找到導致在儀器的GL ES分析報告:OpenGL批處理:爲什麼我的繪製調用超出了數組緩衝區邊界?

繪製調用超出數組緩衝區邊界

繪製調用訪問的頂點在使用的數組緩衝區範圍之外。這是一個嚴重的錯誤,並可能導致崩潰。

我已經通過一次繪製單個四邊形而不是批次並按預期繪製,測試了具有相同頂點佈局的繪圖。

// This technique doesn't necessarily result in correct layering, 
// but for this game it is unlikely that the same texture will 
// need to be drawn both in front of and behind other images. 
while (!renderQueue.empty()) 
{ 
    vector<GLfloat> batchVertices; 
    GLuint texture = renderQueue.front()->textureName; 

    // find all the draw descriptors with the same texture as the first 
    // item in the vector and batch them together, back to front 
    for (int i = 0; i < renderQueue.size(); i++) 
    { 
     if (renderQueue[i]->textureName == texture) 
     { 
      for (int vertIndex = 0; vertIndex < 24; vertIndex++) 
      { 
       batchVertices.push_back(renderQueue[i]->vertexData[vertIndex]); 
      } 

      // Remove the item as it has been added to the batch to be drawn 
      renderQueue.erase(renderQueue.begin() + i); 
      i--; 
     } 
    } 

    int elements = batchVertices.size(); 
    GLfloat *batchVertArray = new GLfloat[elements]; 
    memcpy(batchVertArray, &batchVertices[0], elements * sizeof(GLfloat)); 

    // Draw the batch 
    bindTexture(texture); 
    glBufferData(GL_ARRAY_BUFFER, elements, batchVertArray, GL_STREAM_DRAW); 
    prepareToDraw(); 
    glDrawArrays(GL_TRIANGLES, 0, elements/BufferStride); 

    delete [] batchVertArray; 
} 

合理相關性的其他信息:renderQueue是DrawDescriptors的向量。 BufferStride是4,因爲我的頂點緩衝區格式是交錯位置2,texcoord2:X,Y,U,V ...

謝謝。

回答

4

glBufferData預計其第二個參數是字節中的數據大小。因此,以你的頂點數據複製到GPU的正確方法應該是:

glBufferData(GL_ARRAY_BUFFER, elements * sizeof(GLfloat), batchVertArray, GL_STREAM_DRAW); 

還要確保調用glBufferData當正確的頂點緩衝區約束。

在性能說明中,分配臨時數組在這裏是絕對不必要的。只需直接使用矢量:

glBufferData(GL_ARRAY_BUFFER, batchVertices.size() * sizeof(GLfloat), &batchVertices[0], GL_STREAM_DRAW); 
+0

完美,這就是我所需要的。在我的代碼中,我使用sizeof(anArray)作爲大小,當我回到這段代碼時,我認爲返回的是元素的數量,而不是以字節爲單位的大小。臨時陣列只是一種安全措施,以確保它不會像只拉第一個元素那樣奇怪。我對C++很陌生,所以我無法確定。 –

相關問題