我想为程序中的每个3D对象创建一个VAO。
我创建了两个VAO:
//in some method 1
glGenVertexArrays(1, &vao1);
//in some method 2
glGenVertexArrays(1, &vao2);
然后对于earch VAO我创建2个VBO:
glBindVertexArray(vao1);
glGenBuffers(2, vbos1);
glBindVertexArray(0);
//and the same for vao2, vbos2
然后我将数据发送到gpu:
glBindVertexArray(vao1);
glBindBuffer(GL_ARRAY_BUFFER, vbos1[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions1), positions1, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos1[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices1), indices1, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindVertexArray(0);
//and the same for vao2, vbos2, indices2
然后我为vao2做同样的事情。
现在只绘制了vao2。 如果我切换
glGenVertexArrays(1, &vao2);
glGenVertexArrays(1, &vao1);
然后只绘制vao1。
我通过以下方式绘制vaos:
glBindVertexArray(vao1);
glDrawElements(GL_TRIANGLES, indices1, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
//in another method
glBindVertexArray(vao2);
glDrawElements(GL_TRIANGLES, indices2, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
我绘制它们的顺序,将数据发送到gpu或初始化缓冲区没有区别。
为什么会这样?
答案 0 :(得分:0)
正确:创建VAO的顺序没有区别。
除其他外,VAO存储缓冲区绑定。每次绘制或更新数据时都不需要绑定缓冲区。绑定VAO。
如果整个数据适合GPU内存,您只能更新数据一次,可能是在buffer + VAO创建和绑定时。如果没有,那么绑定VAO也会使该VAO中的“关联”缓冲区准备好接收数据。