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

OpenGL VAO: a shared instancing VBO among non-shared

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

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

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

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

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

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

因此,您的想法应该是为一种顶点格式绑定一个 VAO,然后遍历所有使用该格式的对象,根据需要使用 glBindVertexBuffer 处理它们各自的数据。