【问题标题】:OpenGL VAO: a shared instancing VBO among non-sharedOpenGL VAO:非共享之间的共享实例化 VBO
【发布时间】:2020-08-18 08:22:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: performance opengl instance vbo vao


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 2019-02-21
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多