我有一个Sphere类,它生成VBO来创建给定的输入半径和一些更多的参数。
每个Sphere共享相同的内存布局(假设顶点indice 0=顶点,1=颜色)。
我可能弄错了,但如果一个人正确理解,状态就是VAO储存的东西。但是我不知道VAO是提醒哪个VBO是绑定的还是使用当前绑定的VBO。但我认为它在修改VBO绑定时使用了VBO绑定(因此它意味着为每个Sphere呈现重新配置VAO )
问题#1
所有的球体都可以储存在VAO上吗?为多个VBO共享一个VAO。
问题2
我们能独立于VBO之外建立VAO吗?我想说的是,甚至在创建VBO之前,没有VBO绑定,例如,在静态函数中,甚至在创建球之前。
问题#3
这个问题可能没有意义,而且是特定案例,但是我应该对每个球使用一个VAO和一个VBO,还是为所有的球共享一个VAO (如果可能的话)?
发布于 2019-08-20 13:46:15
使用separate attribute format API,可以很容易地独立于任何特定的源缓冲区对象设置VAO。顶点格式信息(组件类型、计数等)都可以是没有缓冲区对象的glVertexAttribFormat。您甚至可以设置属性索引和缓冲区绑定点之间的关系,以便从单个缓冲区绑定中读取交错属性。所有这些都没有绑定缓冲区对象。
现在,在数据的末尾,当呈现(通过glBindVertexBuffer(s))时,您必须将缓冲区对象附加到VAO。VAO将存储最后一次设置的缓冲区。但实际上你应该忽略这一点。对待一个VAO就好像它只是顶点格式的状态一样,缓冲区绑定是您在使用它呈现之前所做的事情。
是的,让一个VAO和多个潜在缓冲区以这种顶点格式读取(或者更好的是,只有一个缓冲区中包含多个网格数据,它们都共享相同的顶点格式,并且网格选择是通过glDrawElementsBaseVertex完成的)是正确的方法。
说到这里,你也应该记住,所有的球都是相同的网格。它们可能出现在不同的位置,不同的大小,但这只是一个提供一个单位球的不同转换的问题。使用多个球面网格的唯一原因是,如果需要不同的球面分辨率(更多的多边形和更少的多边形)。
https://stackoverflow.com/questions/57574878
复制相似问题