C++ 带bind的VAO问题

C++ 带bind的VAO问题,c++,opengl,vbo,C++,Opengl,Vbo,帮助查找错误 我想装订是不对的。在“显示”中,我使用了VBO-所有工作正常。 但是当我使用VAO时,我得到了黑屏 void createVAO(GLuint *_vId, GLuint *_cId, GLuint *_tId, GLuint *_vao) { glGenVertexArrays(1, _vao); glBindVertexArray(*_vao); glEnableClientState( GL_VERTEX_ARRAY ); glBindBuffer(GL_ARRAY_BUF

帮助查找错误
我想装订是不对的。在“显示”中,我使用了VBO-所有工作正常。
但是当我使用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(); }
完整的源代码。

很抱歉,有很多不必要的代码。

VAO没有密码<代码>总账元素数组缓冲区是VAO状态的一部分。因此,当您绑定VAO时,绑定到
GL\u ELEMENT\u ARRAY\u BUFFER
的内容将更改为该VAO的ELEMENT ARRAY BUFFER


您需要在绑定VAO后(但在解除绑定之前)在
createVAO中绑定元素缓冲区。

您正在使用
glpaurements
而VAO中没有任何
GL\u元素数组\u缓冲区


您可能想使用
glDrawArrays
,就像您的
//VBO-work
一样

我理解正确吗?我还需要创建一个索引数组,并将其绑定?@ObiSan:glpaurements
就是这么做的:它。因此,如果要使用索引数组进行绘制,则需要使用索引数组进行绘制。如果您不想使用索引数组进行绘制,为什么要使用
gldrawerelements
?找到了一个很好的教程,但不要仔细阅读。非常感谢。