问题描述
我试图了解如何正确绘制多个对象,并做到这一点,我想面对面绘制一个立方体。问题是我显然做得不好,因为只画了第一张脸。我有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);