Performance OpenGL VAO:非共享对象之间的共享实例VBO

Performance OpenGL VAO:非共享对象之间的共享实例VBO,performance,opengl,instance,vbo,vao,Performance,Opengl,Instance,Vbo,Vao,我有不同VBO的不同网格,有些可能有法线,有些没有,等等。每个网格也有它的VAO,所有VBO都被绑定 然后我用实例绘制所有网格。我计划使用mat4的共享全局VBO来存储每帧动态计算的变换。此外,每个VAO还需要指向此共享VBO。此外,每个网格实例的数量可能会有所不同 但是我想我们想要减少上传到GPU的数据量,这就是为什么我想要在一个连续的内存中积累所有矩阵,并在一个glBufferSubData命令中发送它 不同批次的不同实例化网格希望使用共享VBO的不同段从中读取矩阵。所以我也需要更新每一帧的

我有不同VBO的不同网格,有些可能有法线,有些没有,等等。每个网格也有它的VAO,所有VBO都被绑定

然后我用实例绘制所有网格。我计划使用mat4的共享全局VBO来存储每帧动态计算的变换。此外,每个VAO还需要指向此共享VBO。此外,每个网格实例的数量可能会有所不同

但是我想我们想要减少上传到GPU的数据量,这就是为什么我想要在一个连续的内存中积累所有矩阵,并在一个glBufferSubData命令中发送它

不同批次的不同实例化网格希望使用共享VBO的不同段从中读取矩阵。所以我也需要更新每一帧的VAOs


问题是:我应该如何以更好的方式执行此操作?这样的架构真的很好吗?我想我应该为每个VAO上的共享VBO使用glBindVertexBuffer,所以我更新了段的偏移量和大小,VAO是轻量级的,但它真的是标准解决方案吗

您不应该关心VAO的更新。事实上,每个网格不应该有一个VAO;每个顶点有一个VAO格式(即:由
glVertexAttribFormat
glEnable/DisableVertexAttrib
设置的内容),并尝试使所有网格使用相同的顶点格式。设置缓冲区绑定状态比设置顶点格式状态便宜得多

因此,您应该为顶点格式绑定一个VAO,然后使用
glBindVertexBuffer
对使用该格式的所有对象进行迭代,并根据需要使用它们各自的数据