2013-05-04 104 views
0

幫助查找錯誤。
我想這是綁定的錯誤。在「顯示」我用VBO - 一切正常。
但是,當我使用VAO - 我得到黑屏。VAO綁定問題

void createVAO(GLuint *_vId, GLuint *_cId, GLuint *_tId, GLuint *_vao) { 
glGenVertexArrays(1, _vao); 
glBindVertexArray(*_vao); 

glEnableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, *_vId); 
glVertexPointer(3, GL_FLOAT, 0, 0); 

glBindVertexArray(0); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } 


void createVBO(GLuint *_vId, GLuint *_cId, GLuint *_tId) { 
glGenBuffers(1, _vId); 
glBindBuffer(GL_ARRAY_BUFFER, *_vId); 
glBufferData(GL_ARRAY_BUFFER, sizeof(XYZ) * cubeVerticesCount, cubePositions, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); } 


void display() { 
glClear(GL_COLOR_BUFFER_BIT); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0, 0, -800); 
glRotatef(rotate.angle_x, 1, 0, 0); 
glRotatef(rotate.angle_y, 0, 1, 0); 
glScalef(zoom,zoom,zoom); 

// VAO - dont work 
glColor3f(1.0f,1.0f,1.0f); 
glBindVertexArray(vao); 
glDrawElements(GL_POINTS, 0, GL_UNSIGNED_INT, NULL); 
glBindVertexArray(0); 

// VBO - work 
//glEnableClientState(GL_VERTEX_ARRAY); 
//glBindBuffer(GL_ARRAY_BUFFER, vId); 
//glVertexPointer(3, GL_FLOAT, 0, 0); 
//glDrawArrays(GL_POINTS, 0, cubeVerticesCount); 
//glDisableClientState(GL_VERTEX_ARRAY); 

calculateFPS(); 
glutSwapBuffers(); } 

完整的源代碼。 http://codepad.org/I87AxDl4

對不起很多不必要的代碼。

回答

1

VAO沒有index buffer in itGL_ELEMENT_ARRAY_BUFFER部分的VAO的狀態。所以當你綁定一個VAO時,綁定到GL_ELEMENT_ARRAY_BUFFER的什麼將改爲到那個VAO的元素數組緩衝區。

在綁定您的VAO之後(但在解除綁定之前),您需要綁定createVAO中的元素緩衝區。

+0

我有沒有正確認識?我還需要創建一個索引數組,並綁定它? – ObiSan 2013-05-04 14:30:51

+0

@ObiSan:這就是'glDrawElements' *做的事情*:它[使用一系列索引](http://www.opengl.org/wiki/Vertex_Specification)。因此,如果要使用一系列索引進行繪製,則需要使用一系列索引進行繪製。如果你不想用一系列索引來繪製,你爲什麼要用'glDrawElements'? – 2013-05-04 14:32:35

+0

找到一個很好的教程,但不要仔細閱讀。謝謝。 – ObiSan 2013-05-04 15:00:59

1

你正在使用glDrawElements沒有VAO

任何GL_ELEMENT_ARRAY_BUFFER你可能想使用glDrawArrays,以同樣的方式你// VBO - work沒有