【问题标题】:Can I set VAO before VBO in OpenGL?我可以在 OpenGL 中的 VBO 之前设置 VAO 吗?
【发布时间】:2019-12-25 17:51:26
【问题描述】:

我有一个 Sphere 类,它生成用于创建给定输入半径和更多参数的 VBO。

每个 Sphere VBO 共享相同的内存布局(假设顶点索引 0 = 顶点,1 = 颜色)。

我可能会弄错,但如果理解正确,状态就是 VAO 存储的内容。但是不知道VAO是提醒绑定了哪个VBO还是使用当前绑定的VBO。但我认为它在修改它时使用了 VBO 绑定(因此这意味着为每个 Sphere 渲染重新配置 VAO)

问题 #1

是否可以在 VAO 上存储所有球体?为多个 VBO 共享一个 VAO。

问题 #2

我们可以独立于 VBO 设置 VAO 吗?我想说,甚至在创建 VBO 并且没有绑定 VBO 之前,例如在创建球体之前的静态函数中。

问题 #3

这个问题可能没有意义并且是针对具体情况的,但是我应该为每个球体使用一个 VAO 和一个 VBO,还是为所有球体共享一个 VAO(如果可能的话)?

【问题讨论】:

    标签: opengl vbo vao


    【解决方案1】:

    使用separate attribute format API,可以轻松地设置独立于任何特定源缓冲区对象集的 VAO。顶点格式信息(组件类型、计数等)都可以是established via glVertexAttribFormat,没有缓冲区对象。您甚至可以设置属性索引和缓冲区绑定点之间的关系,以便您可以从单个缓冲区绑定中读取交错的属性。所有这些都没有绑定缓冲区对象。

    现在在数据的末尾,您必须在渲染时将缓冲区对象附加到 VAO(通过glBindVertexBuffer(s))。 VAO 将存储上次设置的缓冲区。但你应该基本上忽略这一点。将 VAO 视为只是顶点格式状态,缓冲区绑定是您在使用它进行渲染之前所做的事情。

    是的,有一个 VAO 和多个潜在缓冲区,可以使用该顶点格式读取(或者更好的是,只有一个缓冲区包含多个网格数据,它们都共享相同的顶点格式,网格选择通过 @987654323 完成@) 是正确的方法。


    话虽如此,您还应该记住所有球体都是相同的网格。它们可能以不同的大小出现在不同的位置,但这只是提供单位球体的不同变换的问题。使用多个球体网格的唯一原因是您需要不同的球体分辨率(更多多边形与更少)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多