【问题标题】:Single VBO and multiple IBOs单个 VBO 和多个 IBO
【发布时间】:2017-09-23 22:07:33
【问题描述】:

我在从一个顶点缓冲区渲染多个对象时遇到问题。 我有一个包含所有顶点和多个 IBO 的 VBO。 我的想法是为 n 个 IBO 创建 n 个 VAO,并为每个 VAO 绑定 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);
}

我的第二个想法是连接所有索引并使用 glDrawRangeElements() 调用它们

【问题讨论】:

  • "如何在不再次上传数据的情况下将此缓冲区绑定到 vao?" 您从一开始就没有将此缓冲区附加到 VAO。将数据上传到缓冲区与将该缓冲区用于顶点数据没有任何关系(除了将顶点数据传递给它之外)。

标签: c++ opengl vbo vao


【解决方案1】:

您从未将您的 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 函数来渲染大缓冲区的不同“部分”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2023-04-07
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多