2013-07-21 137 views
0

我目前學習使用openGL和LWJGL。當試圖設置一些頂點緩衝區對象時,我收到錯誤信息:VBO的openGL

Invalid memory access of location 0x0 rip=0x10f95f42f 

這是我的代碼。

public class Test { 

public Test(){ 
    try { 
     Display.setDisplayMode(new DisplayMode(768, 512)); 
     Display.setTitle("This is a title!"); 
     Display.create(); 
    } catch (LWJGLException e) { 
     e.printStackTrace(); 
    } 

    //Initialize openGL 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(1, 1, 1, 1, 1, -1); 
    glMatrixMode(GL_MODELVIEW); 

    final int vertexAmount = 3; 
    final int vertexSize = 2; 
    final int colorSize = 3; 

    FloatBuffer vertexData = BufferUtils.createFloatBuffer(vertexAmount * vertexSize); 
    vertexData.put(new float[]{-0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f}); 
    vertexData.flip(); 

    FloatBuffer colorData = BufferUtils.createFloatBuffer(vertexAmount * colorSize); 
    colorData.put(new float[]{1, 0, 0, 0, 1, 0, 0, 0, 1}); 
    colorData.flip(); 

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

    int vboColorHandle = glGenBuffers(); 
    glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle); 
    glBufferData(GL_ARRAY_BUFFER, colorData, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    while(!Display.isCloseRequested()){ 
     glClear(GL_COLOR_BUFFER_BIT); 

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

     glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle); 
     glVertexPointer(colorSize, GL_FLOAT, 0, 0L); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glEnableClientState(GL_COLOR_ARRAY); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 
     glDisableClientState(GL_COLOR_ARRAY); 
     glDisableClientState(GL_VERTEX_ARRAY); 

     Display.update(); 
     Display.sync(60); 
    } 

    glDeleteBuffers(vboVertexHandle); 
    glDeleteBuffers(vboColorHandle); 

    Display.destroy(); 

} 

public static void main(String[] args){ 

    Test test = new Test(); 

} 

} 
+0

我嘗試在綁定之前移動glEnableClientState調用,並將第二個glVertexPointer更改爲glColorPointer。 –

+0

@Robert爲什麼不作爲回答發佈? –

+0

@AndreasHaferburg因爲那些是兩個錯誤,我發現通過代碼可能會或可能不會涉及到他遇到的問題。當我看到問題時,我也即將離開,所以我寫下了一個非常簡短的答案,但沒有解釋爲什麼可能是他的問題。我想我現在會寫出一個完整的答案...... –

回答

1

您的問題可能是你沒有給過任何數據,使GL_COLOR_ARRAY。我注意到,在你的while循環,你的代碼塊:

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

glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle); 
glVertexPointer(colorSize, GL_FLOAT, 0, 0L); 

通知的最後一行怎麼也glVertexPointer?這應該是glColorPointer,以指定綁定緩衝區中的數據爲GL_COLOR_ARRAY,而不是GL_VERTEX_ARRAY

我不認爲這真的有差別,但我總是喜歡啓用/禁用的東西之前,我設置它們的數據,因此,如果上述方法不工作,嘗試第一glBindBuffer前兩個glEnableClientState呼叫轉移到在while循環中調用並查看是否改變了任何東西。

+0

這是應該是GL_COLOR_ARRAY的GL_VERTEX_ARRAY,它似乎是這裏的錯誤。 –