0

在了解了 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);
4

1 回答 1

1

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

我不确定你想在这里做什么。它看起来cubeIndex应该是用于索引渲染的元素数组。但是您似乎尝试将索引用作顶点属性。但是您应该将其用作GL_EMEMENT_ARRAY_BUFFER(就像您已经做的那样)与glDrawElements()(您不做的事情)结合使用。您cubeVBO应该是 a GL_ARRAY_BUFFER,并且应该将其用作顶点属性。

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

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

于 2014-02-16T18:11:11.293 回答