我在从一个顶点缓冲区渲染多个对象时遇到了问题。我有一个包含所有顶点和多个IBO的VBO。我的想法是为n个VBO创建n个VBO,并为每个VBO绑定VBO和其中一个VBO。我真的不知道怎么解决这个问题。
// all indices
std::vector<std::vector<unsigned int>> allIndices;
// gen buffers for ibos
glGenBuffers(allIndices.size(),ibos);
// gen vaos
glGenVertexArray(allIndices.size(),vaos);
// vbo for vertices
glGenBuffers(1,&vbo);
glBindBuffer(GL_ARRAY_BUFFER,vbo);
glBufferData(GL_ARRAY_BUFFER,...);
// bind VAOn + IBOn + VBO
for(unsigned int x = 0; x < allIndices.size(); x++) {
glBindVertexArray(vao[x]);
// bind current ibo
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo[x]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,...);
//
glBindBuffer(GL_ARRAY_BUFFER,vbo);
// how to bind this buffer to the vao without uploading the data once more?
glBindVertexArray(0);
}我的第二个想法是连接所有索引并使用glDrawRangeElements()调用它们。
发布于 2017-05-01 13:46:50
你从来没有把你的VBO附加到你使用的任何VAO上。每个vao必须连接两个缓冲区。然而,对于VBO和IBO如何附加到VAO (如果不使用VAO,还可以连接到管道),有一点混乱。
不同之处在于,当您将glBindBuffer与IBO (ELEMENT_ARRAY_BUFFER目标)一起使用时,它所做的就是将缓冲区设置为管道或VAO中的索引缓冲区。但是,如果您将glBindBuffer与VBO (ARRAY_BUFFER目标)一起使用,则它仅设置某种内部变量,并指示与VBO相关的下一个命令将使用该缓冲区。实际的绑定发生在你调用glVertexAttribPointer的时候,它隐式地使用最后一个绑定的VBO。
请记住,在你的方法中,你应该在你的IBO中分别调整正确的索引,或者使用带有正确偏移的glDrawElementsBaseVertex函数(在你使用原始网格索引的情况下),或者为你创建的每个VAO使用正确的顶点数据偏移。
通常,您应该最小化状态更改,而拥有许多IBO或VAO对此没有帮助。最好在一个大的顶点/索引数组中有尽可能多的数据,并使用glDrawElementsBaseVertex函数来渲染大缓冲区的不同“部分”。
https://stackoverflow.com/questions/43635303
复制相似问题