【问题标题】:Should the same VAO be used with multiple programs?是否应该将同一个 VAO 用于多个程序?
【发布时间】:2012-11-08 17:54:17
【问题描述】:

假设我们将顶点属性位置绑定到两个程序上的相同值。这两个程序用同一个顶点数组对象绘制是否正确?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    定义“正确”。

    如果两个程序对象使用兼容的属性位置,那么它们使用相同的属性位置。 VAO 依赖于属性位置,因此与其中一个一起工作的 VAO 将与另一个一起工作。所以这会起作用。

    一般来说,您是否真正利用这一点是性能问题。避免更改顶点数组状态通常是一个好主意,但目前尚不清楚这相对于其他状态更改有多重要。无论如何,您都在更改程序,因此在更改程序时不更改 VAO 最坏的情况不会变慢,并且可以显着提高性能。

    但是,尚不清楚您应该做多少工作来最小化顶点数组状态的变化。如果您可以将模型打包到具有相同格式的相同缓冲区对象中,则可以使用 glDrawArraysglDrawElementsBaseVertex 等函数在不更改 VAO 的情况下渲染所有模型。

    【讨论】:

    【解决方案2】:

    我尝试使用具有不同着色器的相同 VAO,我可以看到视觉伪影。 (属性的 ID 确实匹配) 解决方案是为每个程序使用一个新的 VAO。

    【讨论】:

    • 这意味着你要么有另一个错误,要么你的 OpenGL 实现被破坏了。只要程序使用相同的属性位置,存储在 VAO 中的顶点设置状态与程序状态完全正交。
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 2015-02-03
    • 2014-11-16
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2011-07-16
    • 2016-11-26
    相关资源
    最近更新 更多