C++ OpenGL绘制多个对象的正确方法?

C++ OpenGL绘制多个对象的正确方法?,c++,opengl,glm-math,vertex-buffer,vao,C++,Opengl,Glm Math,Vertex Buffer,Vao,我试图理解如何正确地绘制多个对象,为此,我想一个接一个地绘制一个立方体。问题是我显然没有弄好,因为只画了第一张脸。我有24个顶点结构(每个面4个顶点)和36个索引(每个面6个,每个三角形3个)。请随时纠正我的任何问题 更新 //array of vertex -- this is only the first face Vertex vertices[24] = { // vertex 0 {glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3(

我试图理解如何正确地绘制多个对象,为此,我想一个接一个地绘制一个立方体。问题是我显然没有弄好,因为只画了第一张脸。我有24个顶点结构(每个面4个顶点)和36个索引(每个面6个,每个三角形3个)。请随时纠正我的任何问题


更新

//array of vertex -- this is only the first face

Vertex vertices[24] = {
    // vertex 0
    {glm::vec3(-1.0f, -1.0f, 1.0f),  glm::vec3( 1.0f, 0.0f, 0.0f), glm::vec2(0.0f,0.0f), glm::vec3(0.0,0.0,0.0), glm::vec3(0.0,0.0,0.0)},
    // vertex 1
    {glm::vec3( 1.0f, -1.0f, 1.0f),  glm::vec3( 1.0f, 1.0f, 0.0f), glm::vec2(1.0f,0.0f), glm::vec3(0.0,0.0,0.0), glm::vec3(0.0,0.0,0.0)}, 
    // vertex 2
    {glm::vec3( 1.0f,  1.0f, 1.0f),  glm::vec3( 0.0f, 0.0f, 1.0f), glm::vec2(1.0f,1.0f), glm::vec3(0.0,0.0,0.0), glm::vec3(0.0,0.0,0.0)},
    // vertex 3
    {glm::vec3(-1.0f,  1.0f, 1.0f),  glm::vec3( 0.0f, 1.0f, 0.0f), glm::vec2(0.0f,1.0f), glm::vec3(0.0,0.0,0.0), glm::vec3(0.0,0.0,0.0)},

unsigned int indices[36] = {
    0, 2, 1, // front
    2, 0, 3,
    8, 10,9, // face dx
    10,8,11,
    12,14,13,// face sx
    14,12,15,
    4, 6, 5, // back face
    6, 4, 7,
    20,22,21,// bottom face
    22,20,23,
    16,18,17,// top face
    18,16,19
};

// creation and population of buffers
// i am only putting here two because it's the same process for all six faces
// face 1
glGenVertexArrays(1,&global.vao0);   
glGenBuffers(1,&global.vb0);
glBindVertexArray(global.vao0);
glBindBuffer(GL_ARRAY_BUFFER,global.vb0);
glGenBuffers(1,&global.ib0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,global.ib0);    
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*4, &vertices[0], GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*6, &indices[0], GL_STATIC_DRAW);

//face 2
glGenVertexArrays(1,&global.vao1);    
glGenBuffers(1,&global.vb1);
glBindVertexArray(global.vao1);
glBindBuffer(GL_ARRAY_BUFFER,global.vb1);
glGenBuffers(1,&global.ib1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,global.ib1);    
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*4, &vertices[4], GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*6, &indices[6], GL_STATIC_DRAW);
然后我去画它们

//my vertex struct has 5 attributes of course, but don't mind those because that's not the point
//drawing face 1
glBindVertexArray(global.vao0);
glBindBuffer(GL_ARRAY_BUFFER,global.vb0);    
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, global.ib0);    
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
    reinterpret_cast<GLvoid*>(offsetof(struct Vertex, position)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, color)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, textcoord)));
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, normal)));
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, tangent)));
global.t0.Bind(GL_TEXTURE0); // texture representing this face
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);
glDisableVertexAttribArray(4);

//drawing face 2
glBindVertexArray(global.vao1);
glBindBuffer(GL_ARRAY_BUFFER,global.vb1);    
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, global.ib1);    
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
    reinterpret_cast<GLvoid*>(offsetof(struct Vertex, position)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, color)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, textcoord)));
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, normal)));
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
     reinterpret_cast<GLvoid*>(offsetof(struct Vertex, tangent)));
global.t1.Bind(GL_TEXTURE0); // different texture to see if i'm drawing it correctly
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);
glDisableVertexAttribArray(4);

... same thing for other faces
//我的顶点结构当然有5个属性,但不要介意,因为这不是重点
//图纸面1
glBindVertexArray(global.vao0);
glBindBuffer(GL_数组_BUFFER,global.vb0);
glBindBuffer(GL_元素_数组_缓冲区,global.ib0);
GlenableVertexAttributeArray(0);
glVertexAttribute指针(0,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投射(偏移(结构顶点、位置));
GlenableVertexAttributeArray(1);
glVertexAttribute指针(1,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投影(偏移(结构顶点,颜色));
GlenableVertexAttributeArray(2);
glVertexAttribute指针(2,2,GL_浮点,GL_假,sizeof(顶点),
重新解释强制转换(偏移(结构顶点,文本坐标));
GlenableVertexAttributeArray(3);
glVertexAttribute指针(3,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投影(偏移(结构顶点,法线));
GlenableVertexAttributeArray(4);
glVertexAttribute指针(4,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投影(偏移(结构顶点,切线));
global.t0.Bind(GL_TEXTURE0);//表示此面的纹理
gld元素(GL_三角形,6,GL_无符号,0);
glBindVertexArray(0);
glDisableVertexAttributeArray(0);
glDisableVertexAttributeArray(1);
GLDisableVertexAttributeArray(2);
GLDisableVertexAttributeArray(3);
GLDisableVertexAttributeArray(4);
//图纸面2
glBindVertexArray(global.vao1);
glBindBuffer(GL_数组_BUFFER,global.vb1);
glBindBuffer(GL_元素_数组_缓冲区,global.ib1);
GlenableVertexAttributeArray(0);
glVertexAttribute指针(0,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投射(偏移(结构顶点、位置));
GlenableVertexAttributeArray(1);
glVertexAttribute指针(1,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投影(偏移(结构顶点,颜色));
GlenableVertexAttributeArray(2);
glVertexAttribute指针(2,2,GL_浮点,GL_假,sizeof(顶点),
重新解释强制转换(偏移(结构顶点,文本坐标));
GlenableVertexAttributeArray(3);
glVertexAttribute指针(3,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投影(偏移(结构顶点,法线));
GlenableVertexAttributeArray(4);
glVertexAttribute指针(4,3,GL_浮点,GL_假,sizeof(顶点),
重新解释投影(偏移(结构顶点,切线));
global.t1.Bind(GL_TEXTURE0);//不同的纹理,看看我画的是否正确
gld元素(GL_三角形,6,GL_无符号,0);
glBindVertexArray(0);
glDisableVertexAttributeArray(0);
glDisableVertexAttributeArray(1);
GLDisableVertexAttributeArray(2);
GLDisableVertexAttributeArray(3);
GLDisableVertexAttributeArray(4);
... 其他面孔也是如此

我做错了什么?

global.vb1
包含4个顶点。然而,
global.ib1
中包含的指数是8,10,9,10,8,11。你期待什么?缓冲区中只有4个顶点。因此,指数需要在[0,3]范围内

如果将顶点拆分为6个缓冲区,每个缓冲区有4个顶点,则每个缓冲区的相应索引必须为0、1、2、0、2、3:

glBufferData(GL\u元素\数组\缓冲区,sizeof(unsigned int)*6,&索引[6],GL\u静态\绘制)

glBindBuffer(GL_元素_数组_缓冲区,global.ib1);
glBufferData(GL_元素数组缓冲区,sizeof(unsigned int)*6,&索引[0],GL_静态图);

顶点和索引是什么?它们是两个数组。顶点包含我要绘制的立方体的每个顶点,而索引包含我将通过的顶点的索引,以便为每个面逐个绘制三角形。基本上是5个向量的结构我对索引的值感兴趣。特别是在
global.ib1
的索引中,我更新了这个问题,希望
global.vb1
包含4个顶点。然而,
global.ib1
中包含的指数是
8、10、9、10、8、11
。你期待什么?缓冲区中只有4个顶点。因此,指数需要在[0,3]范围内。((我怀疑这一点,所以我询问了
global.ib1
的索引)