首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单个VBO和多个VBO

单个VBO和多个VBO
EN

Stack Overflow用户
提问于 2017-04-26 21:13:01
回答 1查看 332关注 0票数 0

我在从一个顶点缓冲区渲染多个对象时遇到了问题。我有一个包含所有顶点和多个IBO的VBO。我的想法是为n个VBO创建n个VBO,并为每个VBO绑定VBO和其中一个VBO。我真的不知道怎么解决这个问题。

代码语言:javascript
复制
// 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()调用它们。

EN

回答 1

Stack Overflow用户

发布于 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函数来渲染大缓冲区的不同“部分”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43635303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档