如何解决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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。