只绘制最后的 VAO



我想为程序中的每个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 中"关联"的缓冲区准备好接收数据。

最新更新