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