仅绘制了最后一个VAO

时间:2017-07-11 16:07:07

标签: opengl

我想为程序中的每个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或初始化缓冲区没有区别。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

正确:创建VAO的顺序没有区别。

除其他外,VAO存储缓冲区绑定。每次绘制或更新数据时都不需要绑定缓冲区。绑定VAO。

如果整个数据适合GPU内存,您只能更新数据一次,可能是在buffer + VAO创建和绑定时。如果没有,那么绑定VAO也会使该VAO中的“关联”缓冲区准备好接收数据。