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

问题描述

我试图了解如何正确绘制多个对象,并做到这一点,我想面对面绘制一个立方体。问题是我显然做得不好,因为只画了第一张脸。我有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,glm::vec3(0.0,0.0,0.0),0.0)},// vertex 1
    {glm::vec3( 1.0f,1.0f,glm::vec2(1.0f,// vertex 2
    {glm::vec3( 1.0f,glm::vec3( 0.0f,// vertex 3
    {glm::vec3(-1.0f,unsigned int indices[36] = {
    0,2,1,// front
    2,3,8,10,9,// face dx
    10,11,12,14,13,// face sx
    14,15,4,6,5,// back face
    6,7,20,22,21,// bottom face
    22,23,16,18,17,// top face
    18,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,&vertices[4],&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,GL_FLOAT,GL_FALSE,sizeof(Vertex),reinterpret_cast<GLvoid*>(offsetof(struct Vertex,position)));
glEnabLevertexAttribArray(1);
glVertexAttribPointer(1,color)));
glEnabLevertexAttribArray(2);
glVertexAttribPointer(2,textcoord)));
glEnabLevertexAttribArray(3);
glVertexAttribPointer(3,normal)));
glEnabLevertexAttribArray(4);
glVertexAttribPointer(4,tangent)));
global.t0.Bind(GL_TEXTURE0); // texture representing this face
glDrawElements(GL_TRIANGLES,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,tangent)));
global.t1.Bind(GL_TEXTURE0); // different texture to see if i'm drawing it correctly
glDrawElements(GL_TRIANGLES,0);
glBindVertexArray(0);
gldisabLevertexAttribArray(0);
gldisabLevertexAttribArray(1);
gldisabLevertexAttribArray(2);
gldisabLevertexAttribArray(3);
gldisabLevertexAttribArray(4);

... same thing for other faces

我在做什么错了?

解决方法

global.vb1包含4个顶点。但是,global.ib1中包含的索引是8、10、9、10、8、11。您期望什么?缓冲区中只有4个顶点。因此索引必须在[0,3]范围内。

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

glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(unsigned int)*6,&indices[6],GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,global.ib1); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER,&indices[0],GL_STATIC_DRAW);