首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?

OpenGL顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?
EN

Stack Overflow用户
提问于 2014-11-05 21:59:22
回答 2查看 1.3K关注 0票数 3

创建VAOs时,VAOs是否只跟踪VBO索引(通过glBindVertexBuffer),还是还将哪些VBO名称绑定到这些索引?如果我在VAO创建期间指定了一个使用glVertexAttribBinding的绑定索引,那么我是否可以在抽签调用之前将不同的VBO绑定到索引0,并让它使用该VBO的内容,还是在创建VAO时总是使用绑定到索引0的任何VBO?

我之所以问这个问题,是因为我在调用glVertexAttribFormatglVertexAttribBinding之前发现了许多调用glBindVertexBuffer的例子,如果VAO只跟踪索引(因为绑定索引是在glVertexAttribBinding中给出的),就不应该需要调用glBindVertexBuffer

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-19 19:02:01

答案是,它们不存储顶点名称,只存储索引。如果将不同的VBO绑定到不同VAO中的相同索引,则必须在使用第一个VAO的任何glDraw调用之前重新绑定第一个VBO。

至少在我的Macbook Pro上有:

渲染器: NVidia GeForce GT 650 m OpenGL引擎

版本: 4.1 NVIDIA-10.0.43 310.41.05f01

票数 -1
EN

Stack Overflow用户

发布于 2014-11-06 04:25:24

您可能知道,这是OpenGL 4.3中引入的相当新的功能。按照我阅读规范的方式,属性和缓冲区之间的映射现在有了一个间接的级别:

  1. 每个属性都有一个属性,该属性指定它使用哪个绑定索引。
  2. 缓冲区绑定到绑定索引。

您可以将它看作两个表,一个定义从属性索引到绑定索引的映射,另一个定义绑定索引到缓冲区名称的映射。这两个表都是VAO状态的一部分。

我相信这些都可以完全独立地按任何顺序指定。glVertexAttribBinding()在属性索引和绑定索引之间建立了第一个关联。glBindVertexBuffer()建立绑定索引与缓冲区名称之间的关联。

这种理解被规范中的state表所证实。表23.4在GL4.4规范标题为“顶点阵列对象状态”的表23.4中列出:

  • VERTEX_ATTRIB_BINDING可以用glGetVertexAttribiv()查询,它是给定属性索引的绑定索引的值。
  • VERTEX_BINDING_BUFFER可以使用glGetIntegeri_v()查询,它是给定绑定索引的缓冲区名称的值。

在此基础上,回答你的具体问题:

创建VAOs时,VAOs是否只跟踪VBO索引(通过glBindVertexBuffer),还是还将哪些VBO名称绑定到这些索引?

他们都会追踪。

是否可以在抽签调用之前将不同的VBO绑定到索引0,并让它使用该VBO的内容?

是的,如果将不同的VBO绑定到绑定索引0,则绑定索引0的所有属性都将使用该VBO的内容。

在调用glVertexAttribFormatglVertexAttribBinding之前,我发现了许多调用glBindVertexBuffer的例子,如果VAO只跟踪索引,就不需要调用glBindVertexBuffer

VAO跟踪所有这些调用设置的状态,因此使用它们作为设置VAO的一部分是有意义的。首先,跟踪VAO中的整个顶点设置状态是拥有VAOs的主要目的。它允许您在初始化期间设置一次状态,然后在抽签调用之前只需要对glBindVertexArray()进行一次调用就可以再次设置整个状态。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26767939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档