讲道义的毛豆 · 一次SQL注入导致的"越权" - ...· 3 月前 · |
打盹的单车 · mysql查询获取数字1到12数字_mob6 ...· 4 月前 · |
乐观的枕头 · MyBatis-Plus分页插件的配置和使用 ...· 5 月前 · |
有胆有识的炒饭 · python – ...· 8 月前 · |
谦逊的墨镜 · XmlSerializer ...· 10 月前 · |
创建VAOs时,VAOs是否只跟踪VBO索引(通过 glBindVertexBuffer ),还是还将哪些VBO名称绑定到这些索引?如果我在VAO创建期间指定了一个使用 glVertexAttribBinding 的绑定索引,那么我是否可以在抽签调用之前将不同的VBO绑定到索引0,并让它使用该VBO的内容,还是在创建VAO时总是使用绑定到索引0的任何VBO?
我之所以问这个问题,是因为我在调用
glVertexAttribFormat
和
glVertexAttribBinding
之前发现了许多调用
glBindVertexBuffer
的例子,如果VAO只跟踪索引(因为绑定索引是在
glVertexAttribBinding
中给出的),就不应该需要调用
glBindVertexBuffer
。
您可能知道,这是OpenGL 4.3中引入的相当新的功能。按照我阅读规范的方式,属性和缓冲区之间的映射现在有了一个间接的级别:
您可以将它看作两个表,一个定义从属性索引到绑定索引的映射,另一个定义绑定索引到缓冲区名称的映射。这两个表都是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的内容。
在调用
glVertexAttribFormat
和glVertexAttribBinding
之前,我发现了许多调用glBindVertexBuffer
的例子,如果VAO只跟踪索引,就不需要调用glBindVertexBuffer
。
VAO跟踪所有这些调用设置的状态,因此使用它们作为设置VAO的一部分是有意义的。首先,跟踪VAO中的整个顶点设置状态是拥有VAOs的主要目的。它允许您在初始化期间设置一次状态,然后在抽签调用之前只需要对
glBindVertexArray()
进行一次调用就可以再次设置整个状态。
答案是,它们不存储顶点名称,只存储索引。如果将不同的VBO绑定到不同VAO中的相同索引,则必须在使用第一个VAO的任何glDraw调用之前重新绑定第一个VBO。
至少在我的Macbook Pro上有:
渲染器: NVidia GeForce GT 650 m OpenGL引擎
版本: 4.1 NVIDIA-10.0.43 310.41.05f01
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券