2013-05-04 84 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没有