Opengl 仅绘制最后一个VAO

Opengl 仅绘制最后一个VAO,opengl,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 v

我想为程序中的每个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做同样的事情

现在只抽真空。 如果我换了

glGenVertexArrays(1, &vao2);
glGenVertexArrays(1, &vao1);
然后仅绘制vao1

我通过以下方式绘制VAO:

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中关联的缓冲区准备好接收数据。

您跳过了第二个VAO源代码,如果存在错误怎么办?另外,你在哪里渲染我没有看到任何与之相关的调用。。。还有vao1,2是如何声明的?在a中编辑。这个问题只是想知道我的理论是否正确。我只是想知道它是否会对vao的生成顺序产生影响。@ArwedMett ok您添加的渲染内容在我看来是正确的。。。但你仍然没有包括vao?,vbo?声明如果声明错误,它们可能会重叠。还缺少vao2、vbo2代码块,它们是副本,所以请确保没有副本输入错误,这就是我要求它们的原因。。。。他们很难被他们的作者发现,因为记忆和视觉。您的问题描述表明声明错误。。。。