C++/OpenGL - VAO Problems

C++/OpenGL - VAO Problems

本文关键字:VAO Problems OpenGL C++      更新时间:2023-10-16

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

您的代码没有意义。您从未将任何东西绑定到GL_ARRAY_BUFFER,因此glVertexAttribPointer()调用将指向无效的VBO——这解释了当您尝试绘制该对象时发生的崩溃。

我不知道你在这里想干什么。看起来cubeIndex应该是用于索引渲染的元素数组。但您似乎试图将索引用作顶点属性。但您应该将其作为GL_EMEMENT_ARRAY_BUFFER(正如您已经做的那样)与glDrawElements()(您没有做的事情)一起使用。cubeVBO应该是GL_ARRAY_BUFFER,并且应该将其用作顶点属性。

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

请查看OpenGL wiki中的"顶点规范"answers"顶点渲染"页面,或者查看一些教程——到目前为止,您发布的代码让我认为您没有掌握基本概念。