【问题标题】:Do I need to rebuild my VAO if I need to change a VBO?如果我需要更改 VBO,是否需要重建 VAO?
【发布时间】:2012-01-11 00:18:12
【问题描述】:

我正在通过构建或修改我给glBufferData 的缓冲区来渲染我的场景。我对顶点数组对象的理解是它们允许我跳过我正在使用的所有 VBO 的手动绑定。当我一直更新缓冲区时,情况仍然如此吗?

我可以绑定我的 VAO,调用 glBufferData 来更新顶点和索引(我目前仅有的两个 VBO),然后渲染吗?

我可以将内存映射与 VBO 一起使用吗?然后我可以绑定VAO,修改缓冲区,然后渲染?

VAO 究竟是做什么的?它的功能仅仅是存储和自动将顶点属性绑定到我的 VBO 的快捷方式吗?它是否拥有数据或绑定的所有权?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    您可能需要对此进行测试,但据我了解,VBO 在生成时会给出 ID,并且 VAO 仅引用每个顶点属性及其使用的 VBO ID。您应该可以致电glBufferDataglBufferSubData。我不确定在绘制调用之前的内存映射是否会起作用,但你当然可以在绑定 VAO 和绘图之间做一些事情。 VAO 不会锁定 VBO 或限制对它们的访问。

    一般来说,VAO 只存储属性及其所有设置(绑定的 VBO、步幅、偏移量等),并在绑定时自动绑定属性。在您调用 glBindVertexArray(0); 之前,所有顶点属性都绑定到绑定的 VAO。

    【讨论】:

    • 所以VAO不影响我绑定了哪个VBO?我需要绑定它们并在它们上调用glBufferData
    • @Robert Rouhani 考虑到您的顶点布局对于大多数绘制都是相同的,我觉得您必须为每个 VBO 存储一组不同的顶点属性非常荒谬。我找了一会儿试图避免这种情况,但没有成功。
    • @TitoneMaurice 占用的空间量应该是最小的(以字节为单位),绑定不同属性的额外 GL 调用不应成为您的瓶颈。您想要的最接近的事情是实例化,在我看来,其他任何事情都是不必要的/过早的优化。
    • @Robert Rouhani Nah,我只是说,你是对的。很难相信看起来好像它们根本没有经常更改,顶点布局不是某种全局状态,或者它们可能绑定到 VBO。难道我做错了什么?因为每次绑定另一个 VBO 时,我都需要每次调用 glVertexAttribPointer 和 glEnableVertexAttribArray 。我认为这是因为顶点布局绑定到 VAO,并且在绑定 VBO 时会发生变化。我不知道在这种情况下为每个 VBO 设置一个 VAO 是否更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多