2017-04-26 104 views
0

我从一个顶点缓冲区渲染多个对象时出现问题。 我有一个包含所有顶点和多个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打电话给他们()

+0

使用corect标签。这不是C. – Olaf

+0

“*如何将此缓冲区绑定到vao而无需再次上传数据?*”您从未将此缓冲区添加到VAO中以开始。将数据上传到缓冲区与使用顶点数据的缓冲区无关(除了将顶点数据传递给缓冲区)。 –

回答

0

你永远不会附加您的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函数渲染大缓冲区的不同“部分”。