单个VBO和多个IBO

时间:2017-04-26 13:13:01

标签: c++ opengl vbo vao

我在从一个顶点缓冲区渲染多个对象时遇到问题。 我有一个包含所有顶点和多个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()调用它们

1 个答案:

答案 0 :(得分:0)

您从未将VBO附加到您使用的任何VAO。每个vao必须连接两个缓冲区。但是,如果VBO和IBO如何附加到VAO(如果你不使用VAO那么管道),那就有点混乱了。

不同之处在于,当您将#include <stdio.h> void functn (int x); int functn(int x, int result){ result = (x-1)+2; if (x <= 0){ return 0; } else{ return result; } } int main (){ int x, y; printf ("Enter the value of x: "); scanf ("%d", &x); y = f(x); printf ("%d", y); return 0; } 与IBO(glBindBuffer目标)一起使用时,它会执行它的含义 - 将缓冲区设置为管道缓冲区或VAO。但是,如果将ELEMENT_ARRAY_BUFFER与VBO(glBindBuffer目标)一起使用,它只会设置内部变量的类型,并指示与VBO相关的下一个命令将使用该缓冲区。 当你调用ARRAY_BUFFER时会发生实际绑定,它会隐式使用最后绑定的VBO。

请记住,使用您的方法,您应该在IBO中分别调整正确的索引或使用具有正确偏移的glVertexAttribPointer函数(如果使用原始网格索引)或使用正确的偏移量到顶点数据中您创建的每个VAO。

一般情况下,您应该尽量减少状态变化,让许多IBO或VAO不会帮助您解决这个问题。在一个大的顶点/索引数组中尽可能多地使用数据并使用glDrawElementsBaseVertex函数来渲染不同的&#34;部分&#34;你的大缓冲区。