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

问题描述 投票:0回答:1

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

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

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

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

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

performance opengl instance vbo vao
1个回答
2
投票

你不应该关注VAO的更新。事实上,你根本不应该为每个网格设置一个 VAO,而是为每个网格设置一个 VAO。顶点格式 (也就是:由 glVertexAttribFormatglEnable/DisableVertexAttrib),并尝试让你所有的网格都使用相同的顶点格式。设置缓冲区绑定状态比设置顶点格式状态要便宜得多,所以我们的想法应该是为一个顶点格式绑定一个VAO,然后迭代所有使用该格式的对象。

所以我们的想法应该是,你为一个顶点格式绑定一个 VAO,然后在所有使用该格式的对象中迭代,使用 glBindVertexBuffer 根据其个人数据的需要。

© www.soinside.com 2019 - 2024. All rights reserved.