在了解了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);
答案 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 Specification和Vertex Rendering页面,或查看一些教程 - 到目前为止您发布的代码让我觉得您没有掌握基础概念