在学习了 VBO 之后,一位 friend 告诉我尝试使用 VAO 将立方体索引与顶点链接起来。我遵循了我能找到的每一个教程,但都无济于事。看起来缓冲区绑定(bind)正确,一切正常,直到我尝试绘制它们。
这就是我生成 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);
最佳答案
您的代码没有意义。您永远不会将任何内容绑定(bind)到 GL_ARRAY_BUFFER
,因此您的 glVertexAttribPointer()
调用将指向无效的 VBO - 解释当您尝试绘制那个东西时发生的崩溃。
我不确定你想在这里做什么。看起来 cubeIndex
应该是用于索引渲染的元素数组。但是您似乎尝试将索引用作顶点属性。但是您应该将其用作 GL_EMEMENT_ARRAY_BUFFER
(正如您已经在做的那样)与 glDrawElements()
(您不做的)一起使用。您的 cubeVBO
应该是一个 GL_ARRAY_BUFFER
,您应该将其用作顶点属性。
数组的大小也看起来很奇怪。当绘制一个有 6 个边且每个边有 2 个三角形的立方体时,36 个 Uint 作为索引缓冲区确实有意义。但是顶点数据的 21 个 float (每个 vector 有 3 个分量)只有 7 个顶点 - 对于立方体来说很奇怪。
请看Vertex Specification和 Vertex Rendering OpenGL wiki 中的页面,或查看一些教程 - 您到目前为止发布的代码让我认为您没有掌握基本概念。
关于C++/OpenGL - VAO 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21814711/