【发布时间】:2015-06-18 00:42:23
【问题描述】:
我很难理解状态的确切含义。我已阅读有关顶点数组对象 (VAO) 和顶点缓冲区对象 (VBO) 以及上下文创建的信息。到目前为止,我已经了解上下文是与您创建的 OpenGL 实例相关联的所有内容的状态。
我还了解到,VAO 是对您创建的 OpenGL 分配的名称的引用,而 VBO 是这些 VAO 的数据。然而,在the OpenGL red book 中,它说当你创建一个 VBO 时,OpenGL 会为 VBO 分配一个状态,你显然必须绑定到 VAO。
我不明白的是对象和上下文之间的关系。如果上下文应该是 OpenGL 实例的状态,为什么它会创建分配给顶点缓冲区对象的附加状态?每当您调用某个更改上下文状态的函数时,它实际上会更改 VBO 而不是上下文的实际默认状态。
我是否正确理解了这一点,或者我在这里混淆了什么?
【问题讨论】:
-
我在理解这些对象和状态之间的关系方面找到了一个定义,迄今为止最好的定义(IN PARTS):顶点数组对象(又名 VAO)是一种特殊类型的对象,它封装了所有与顶点处理器相关联的数据。它不包含实际数据,而是保存对顶点缓冲区、索引缓冲区和顶点本身的布局规范的引用。
-
优点是一旦你为一个网格设置了 VAO,你可以通过简单地绑定 VAO 来引入整个网格状态。之后,您可以渲染网格对象,而无需担心其所有状态。 VAO 会为您记住它。如果您的应用程序需要处理顶点布局略有不同的网格,VAO 也会处理它。只需确保在创建 VAO 时设置正确的布局并忘记它。从现在开始,它会“粘”在 VAO 上,并在使用该 VAO 时激活。
-
如果使用得当,VAO 还可以代表 GPU 驱动程序的优化机会。如果 VAO 设置一次并多次使用,则驱动程序可以利用知道索引缓冲区和顶点缓冲区之间的映射以及缓冲区中的顶点布局。显然,这取决于您使用的特定驱动程序,并且不能保证所有驱动程序的行为都相同。无论如何,请记住,最好设置一次 VAO,然后一遍又一遍地重复使用它。
标签: opengl