C ++ / OpenGL - VAO问题

时间:2014-02-16 17:24:46

标签: c++ opengl vbo vao

在了解了VBO之后,一位朋友告诉我尝试使用VAO将立方体索引与顶点链接起来。我跟着我找到的每一个教程都没有用。看起来缓冲区绑定正确,一切正常,直到我尝试绘制它们。

这就是我生成VAO的方法 -

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

glEnableVertexAttribArray(0);

glGenBuffers(1, &cubeIndex);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIndex);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), cubeIndices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_UNSIGNED_INT, GL_FALSE, sizeof(GLuint)*3, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glEnableVertexAttribArray(1);

glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 21 * sizeof(GLfloat), cubeVertPoints, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);

glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

渲染 -

glEnableClientState(GL_VERTEX_ARRAY);
glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, size);//Runtime exception here if anything larger that '2' is provided?

glBindVertexArray(0);

1 个答案:

答案 0 :(得分:1)

您的代码没有意义。你永远不会将任何东西绑定到GL_ARRAY_BUFFER,所以你的glVertexAttribPointer()调用将指向无效的VBO - 解释当你试图绘制那个东西时的崩溃。

我不确定你在这里要做什么。看起来cubeIndex应该是索引渲染的元素数组。但您似乎尝试使用索引作为顶点属性。但是你应该将GL_EMEMENT_ARRAY_BUFFER(正如你已经做的)与glDrawElements()(你不做的)一起使用。您的cubeVBO应该是GL_ARRAY_BUFFER,您应该将其用作顶点属性。

阵列的大小看起来也很奇怪。 36当绘制一个有6个边和2个三角形的立方体时,Uints确实有意义作为索引缓冲区。但是每个向量有3个分量的顶点数据有21个浮点数只有7个顶点 - 对于一个立方体来说很奇怪。

请查看OpenGL wiki中的Vertex SpecificationVertex Rendering页面,或查看一些教程 - 到目前为止您发布的代码让我觉得您没有掌握基础概念