2012-02-11 54 views
0

我一直在關注列出的教程hereOpenGL基本IBO/VBO不工作

我想提請使用索引緩衝區對象,一個頂點緩衝區對象,我自己的頂點和片段着色器,和我自己的頂點結構一個三角形。

我的問題是,當我繪製時什麼也沒有顯示出來。我不確定我做錯了什麼。我的着色器工作正常,我測試了它們而沒有使用ibo/vbo,它們都很好。

這裏是我的代碼:

GLuint vao[1], vbo_vertex[1], index_buffer[1]; 

typedef struct{ 
    GLfloat x,y,z;  // Vertex. 
    GLfloat r,g,b; // Colors. 
} spicyVertex; 

void initializeBuffers(){ 

    spicyVertex* simple_triangle = new spicyVertex[3]; 
    // V0 - bottom 
    simple_triangle[0].x = 0.0f; 
    simple_triangle[0].y = -0.5f; 
    simple_triangle[0].z = 0.0f; 
    simple_triangle[0].r = 1.0f; 
    simple_triangle[0].g = 0.0f; 
    simple_triangle[0].b = 0.0f; 

    // V1 - top right 
    simple_triangle[0].x = 0.5f; 
    simple_triangle[0].y = 0.5f; 
    simple_triangle[0].z = 0.0f; 
    simple_triangle[0].r = 1.0f; 
    simple_triangle[0].g = 0.0f; 
    simple_triangle[0].b = 0.0f; 

    // V2 - top left 
    simple_triangle[0].x = -0.5f; 
    simple_triangle[0].y = 0.5f; 
    simple_triangle[0].z = 0.0f; 
    simple_triangle[0].r = 1.0f; 
    simple_triangle[0].g = 0.0f; 
    simple_triangle[0].b = 0.0f; 

    // Setup the vertex buffer data. 
    glGenBuffers(1, &vbo_vertex[0]); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]); 
    glBufferData(GL_ARRAY_BUFFER, 3*sizeof(spicyVertex), simple_triangle, GL_STATIC_DRAW); 


    // Index setup 
    GLushort *indices = new GLushort[3]; 
    indices[0]=0; 
    indices[1]=1; 
    indices[2]=2; 
    glGenBuffers(1, &index_buffer[0]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*sizeof(GLushort), indices, GL_STATIC_DRAW); 

    // By this point all of our data should be on the graphics device. 


    // VAO setup. 
    glGenVertexArrays(1, &vao[0]); 
    glBindVertexArray(vao[0]); 

    // Bind the vertex buffer and setup pointers for the VAO. 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(0)); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3)); 
    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 
    glDisableVertexAttribArray(2); 
    glDisableVertexAttribArray(3); 

    // Bind the index buffeer for the VAO. 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]); 

    // Cleanup. 
    delete [] simple_triangle; 
    delete [] indices; 
    glBindVertexArray(0); 
    glDisableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER,0); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 
} 

void Draw_indexed_Vao(){ 
    glBindVertexArray(vao[0]);  // select first VAO 
    glDrawRangeElements(GL_TRIANGLES,0, 3, 3, GL_UNSIGNED_SHORT, NULL); 
    glBindVertexArray(0); 
} 

static void display(void){ 
    glUseProgramObjectARB(programObj); 

    Draw_indexed_Vao(); 
} 

我沒有執行任何視圖轉換,當我用繪畫的一切更基本的方式顯示了在鏡頭前就好權。我真的認爲這是我聲明這些緩衝區的方式。

EDIT 1:應用是雙緩衝。

編輯2:解決。 3個頂點V0,V1和V2都在修改相同的數組元素。如在,我沒有使用simple_triangle[0],simple_triangle[1],simple_triangle[2],但我只與simple_triangle[0]一起工作。再次感謝您捕捉我愚蠢的錯誤。

+3

你的意思是V1和V2是simple_triangle [1]和simple_triangle [2]嗎? – loganfsmyth 2012-02-11 03:48:22

+0

嘎!這解決了它,非常感謝你。小錯誤可能會被忽略,並造成很大的麻煩。 – viperld002 2012-02-11 07:00:08

回答

1

添加實際答案。

V1和V2都修改simple_triangle[0]所以只有永遠一個頂點。

0

您可能需要調用glFlush(),以推動你繪製到屏幕上的緩衝區的內容。此外,根據您是否使用雙緩衝,所需的呼叫可能是glutSwapBuffers()(如果您使用GLUT)或其他交換呼叫。

+0

我已經使用了glFlush()並沒有取得任何成功,而且我一直在交換整個時間。 – viperld002 2012-02-11 06:56:49

+0

啊,好吧,只是沒有在提供的代碼中看到它。看起來像loganfsmyth發現了問題。真高興你做到了 :) – kevintodisco 2012-02-11 07:09:12

0

你可能想改變

'GL 頂點 AttribPointer(1,3,GL_FLOAT,GL_FALSE,的sizeof(spicyVertex),BUFFER_OFFSET(的sizeof(spicyVertex)* 3));'

'GL 顏色 AttribPointer(1,3,GL_FLOAT,GL_FALSE,的sizeof(spicyVertex),BUFFER_OFFSET(的sizeof(spicyVertex)* 3));'

但我不是100%確定。