C++ 使用GLD元素绘制三维网格时的奇怪行为

C++ 使用GLD元素绘制三维网格时的奇怪行为,c++,opengl,3d,glsl,C++,Opengl,3d,Glsl,因此,让我解释一下我写了什么代码,以及问题是如何产生的 我制作了一个简单的OpenGL应用程序,它读取一个.obj文件并进行渲染 我读取了文件并将顶点和索引数据放在两个向量中:std::vector vertexts和std::vector index。Vertex是我构建的结构: struct Vertex{ glm::vec3 Position; glm::vec3 Normal; } 现在假设我读了一个.obj,并用它的数据填充了上面的向量。之后,在渲染网格之前,使用以下

因此,让我解释一下我写了什么代码,以及问题是如何产生的

我制作了一个简单的OpenGL应用程序,它读取一个.obj文件并进行渲染

我读取了文件并将顶点和索引数据放在两个向量中:
std::vector vertexts
std::vector index
。Vertex是我构建的结构:

struct Vertex{
    glm::vec3 Position;
    glm::vec3 Normal;
}
现在假设我读了一个.obj,并用它的数据填充了上面的向量。之后,在渲染网格之前,使用以下代码设置缓冲区

void Mesh::setupBuffers()
{
    glGenVertexArrays(1,&VAO);
    glGenBuffers(1,&VBO);
    glGenBuffers(1,&EBO);

    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER,VBO);
    glBufferData(GL_ARRAY_BUFFER,vertices.size()*sizeof(MyVertex),&vertices[0],GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,indices.size()*sizeof(GLuint),&indices[0],GL_STATIC_DRAW);

    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(MyVertex),(GLvoid*)0);
    glEnableVertexAttribArray(0);

    glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,sizeof(MyVertex),(GLvoid*)offsetof(MyVertex,Normal));
    glEnableVertexAttribArray(1);

    glBindVertexArray(0);
}
请注意,上面的代码只调用一次,即在我加载一个新的.obj之后

最后,要渲染我使用的网格,请执行以下操作:

void Mesh::Draw()
{
    glBindVertexArray(VAO);
    glDrawElements(GL_TRIANGLES,indices.size(),GL_UNSIGNED_INT,0);
    glBindVertexArray(0);

    GLenum error =  glGetError();
    if(error) std::cout << error << std::endl;
}
void Mesh::Draw()
{
glBindVertexArray(VAO);
glpaurements(GL_三角形,index.size(),GL_UNSIGNED_INT,0);
glBindVertexArray(0);
GLenum error=glGetError();

如果(错误)std::cout您需要为每个网格生成不同的VAO VBO和EBO。 像这样的

calss Mesh{
std::vector<Vertex> vertices;
std::vector<GLuint> indices;
GLuint VAO, VBO, EBO;
}
calss网格{
向量顶点;
std::向量指数;
GLuint VAO、VBO、EBO;
}

谢谢您的回复!我已经这样做了,事实上我的Mesh类正好有这些数据成员。每次我加载新模型时,都会创建一个新的Mesh对象,其中包含您提到的数据成员。
calss Mesh{
std::vector<Vertex> vertices;
std::vector<GLuint> indices;
GLuint VAO, VBO, EBO;
}