2012-10-16 47 views
2

我試圖實現一種方法來繪製一堆使用OpenGL和Java中的vertexBufferObjects的多維數據集,但在調用glDrawArrays命令時遇到問題。glDrawArrays Exception_Access_Violation

本質上,該程序所做的是循環通過x,y,z座標,並從那裏計算以該座標爲中心的立方體的頂點,然後將這些頂點輸入到浮點緩衝區。 (請注意,我只是在一瞬間進入了一個面的頂點數據,以保持代碼的簡潔,同時它完善)

出現的錯誤是:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006056ec90, pid=6424, tid=7696

int verticesPerObject = 12; //number of vertices per square 
int chunkSizeX = 4; //number of cubes in x direction 
int chunkSizeY = 4; //number of cubes in y direction 
int chunkSizeZ = 4; //number of cubes in z direction 
FloatBuffer vertexData = BufferUtils.createFloatBuffer(chunkSizeX * chunkSizeY * chunkSizeZ * verticesPerObject); 

    for (int x = 0; x < chunkSizeX; x++) { 
     for (int y = 0; y < chunkSizeY; y++) { 
      for (int z = 0; z < chunkSizeZ; z++) { 
       vertexData.put(new float[]{ 
         (float)x * blockWidth - blockWidth/2, (float)y * blockHeight - blockHeight/2, (float)z * blockDepth + blockDepth/2, 
         (float)x * blockWidth + blockWidth/2, (float)y * blockHeight - blockHeight/2, (float)z * blockDepth + blockDepth/2, 
         (float)x * blockWidth + blockWidth/2, (float)y * blockHeight + blockHeight/2, (float)z * blockDepth + blockDepth/2, 
         (float)x * blockWidth - blockWidth/2, (float)y * blockHeight + blockHeight/2, (float)z * blockDepth + blockDepth/2 
       }); 
      } 
     } 
    } 

    vertexData.flip(); 

    int vboVertexHandle = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
    glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
    glVertexPointer(verticesPerObject, GL_FLOAT, 0, 0L); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glDrawArrays(GL_QUADS, 0, verticesPerObject); 
    glDisableClientState(GL_VERTEX_ARRAY); 

回答

5

您的來電到glVertexPointer是錯誤的。它的第一個參數不是整體浮點數,而是單個頂點的浮點數(或者說是組件),在你的情況下。3.訪問衝突的原因就是,glVertexPointer調用失敗,然後glDrawArrays使用默認參數,它可以指定每個頂點的4個分量,或者不使用你的緩衝區對象或者使用一些其他未指定的不匹配頂點數據的參數。因此,僅僅通過

glVertexPointer(3, GL_FLOAT, 0, 0L); 

變量名稱替換它verticesPerObject是有點誤導無論如何,因爲它不包含頂點的數量,但花車的數量,但是這是純粹的化妝品,其使用的其他是正確的。

+0

我來這裏不期待這個回答我的問題。非常感謝:D –