我想为程序中的每个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 或初始化缓冲区没有区别。
为什么会这样?
右:创建 VAO 的顺序没有区别。
除此之外,VAO 还存储缓冲区绑定。无需在每次绘制或更新数据时绑定缓冲区。只需绑定 VAO。
如果整个数据适合 GPU 内存,则只能更新一次数据,可能是在 buffer+VAO 创建和绑定时。如果不是,则绑定 VAO 也会使该 VAO 中"关联"的缓冲区准备好接收数据。