我可以在OpenGL中将VAO设置在VBO之前吗?

我可以在OpenGL中将VAO设置在VBO之前吗?,opengl,vbo,vao,Opengl,Vbo,Vao,我有一个球体类,它生成VBO来创建给定的输入半径和一些其他参数 每个球体VBO共享相同的内存布局(假设顶点标记0=顶点,1=颜色) 我可能弄错了,但如果理解正确,状态就是VAO存储。但我不知道VAO是否会提醒绑定了哪个VBO或使用了当前绑定的VBO。但我认为它在修改时使用VBO边界(因此它意味着为每个球体渲染重新配置VAO) 问题1 是否可以将所有球体存储在VAO上?为多个VBO共享一个VAO 问题2 我们能否独立于VBO设置VAO?我想说,在创建VBO之前,没有VBO绑定,例如在创建球体之前的

我有一个球体类,它生成VBO来创建给定的输入半径和一些其他参数

每个球体VBO共享相同的内存布局(假设顶点标记0=顶点,1=颜色)

我可能弄错了,但如果理解正确,状态就是VAO存储。但我不知道VAO是否会提醒绑定了哪个VBO或使用了当前绑定的VBO。但我认为它在修改时使用VBO边界(因此它意味着为每个球体渲染重新配置VAO)

问题1

是否可以将所有球体存储在VAO上?为多个VBO共享一个VAO

问题2

我们能否独立于VBO设置VAO?我想说,在创建VBO之前,没有VBO绑定,例如在创建球体之前的静态函数中

问题#3

这个问题可能没有意义,并且是特定于具体情况的,但是我应该为每个球体使用一个VAO和一个VBO,还是为所有球体共享一个VAO(如果可能的话)?

使用API,很容易设置独立于任何特定源缓冲区对象集的VAO。顶点格式信息(组件类型、计数等)都可以不使用缓冲区对象。您甚至可以设置属性索引和缓冲区绑定点之间的关系,以便可以从单个缓冲区绑定读取交错属性。所有这些都没有绑定缓冲区对象

现在,在数据结束时,当需要渲染时,必须将缓冲区对象附加到VAO(通过
glBindVertexBuffer)
)。VAO将存储上次设置的缓冲区。但你基本上应该忽略这一点。将VAO视为只是顶点格式状态,缓冲区绑定是在使用它进行渲染之前要执行的操作

是的,有一个VAO和多个潜在的缓冲区,这些缓冲区以该顶点格式读取(或者更好的是,只有一个缓冲区,其中包含多个网格数据,所有这些数据共享相同的顶点格式,网格选择通过)是正确的方法


尽管如此,您还应该记住,所有球体都是相同的网格。它们可能以不同的大小出现在不同的位置,但这只是提供单位球体的不同变换的问题。使用多个球体网格的唯一原因是,如果需要不同的球体分辨率(多边形越多,多边形越少)