单个VBO和多个IBO
问题描述:
我从一个顶点缓冲区渲染多个对象时出现问题。 我有一个包含所有顶点和多个IBO的VBO。 我的想法是为n个IBO创建n个VAO,并为每个这个VAO绑定VBO和一个IBO。不要真正知道如何解决这个问题。单个VBO和多个IBO
// 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);
}
我的第二个想法是concatinate所有指数,并与glDrawRangeElements打电话给他们()
答
你永远不会附加您的VBO你使用任何VAO。每个vao都必须连接两个缓冲区。但是,如何将VBO和IBO连接到VAO(以及如果不使用VAO,则使用管道)有点混乱。
不同之处在于,当您使用glBindBuffer
与IBO(ELEMENT_ARRAY_BUFFER
目标)它意味着什么 - 将缓冲区设置为管道或VAO中的索引缓冲区。但是,如果在VBO(ARRAY_BUFFER
目标)中使用glBindBuffer
,它只设置内部变量的排序并指示与VBO相关的下一个命令将使用该缓冲区。 实际绑定发生在您拨打glVertexAttribPointer
时,它会隐式使用上次绑定的VBO。请记住,使用你的方法,你应该在你的IBO中分别进行调整或使用glDrawElementsBaseVertex
函数的正确索引(如果使用原始网格索引),或者在每个VAO的顶点数据中使用正确的偏移量创建。
一般来说,你应该尽量减少状态变化,并有许多企业家们或VAOs不会帮助你与此有关。最好在一个大顶点/索引数组中使用尽可能多的数据,并使用glDrawElementsBaseVertex
函数渲染大缓冲区的不同“部分”。
使用corect标签。这不是C. – Olaf
“*如何将此缓冲区绑定到vao而无需再次上传数据?*”您从未将此缓冲区添加到VAO中以开始。将数据上传到缓冲区与使用顶点数据的缓冲区无关(除了将顶点数据传递给缓冲区)。 –