好的,首先讲一点背景故事。
从 OpenGL 4.3/ARB_vertex_attrib_binding 开始(又名:其中glVertexBindingDivisor
来自,所以这是相关的),VAO在概念上分为两部分:描述单个属性数据价值的顶点格式数组,以及描述如何获取数据数组(缓冲区对象)的缓冲区绑定点数组、偏移量、步幅和除数)。顶点格式指定其数据来自哪个缓冲区绑定点,以便多个属性可以从同一个数组中获取数据(即:交错)。
当VAO被分成这两个部分时,旧的API被根据新系统重新定义。所以如果你打电话glVertexAttribPointer
使用属性索引,此函数将为给定的格式设置顶点格式数据index
,并且它将设置相同的缓冲区绑定状态(缓冲区对象、字节偏移量等)index
。现在,这是两个独立的 VAO 状态数据数组(顶点格式和缓冲区绑定);该函数只是在两个数组中使用相同的索引。
但由于顶点格式和缓冲区绑定是separate now, glVertexAttribPointer
也相当于说索引处的顶点格式index
从索引处的缓冲区绑定获取其数据index
。这很重要,因为这不是自动的; vertex_attrib_binding 的全部要点是一个索引处的顶点格式可以使用来自不同索引的缓冲区绑定。因此,当您使用旧的 API 时,它会通过链接格式将自身重置为旧的行为index
绑定index
.
现在,这一切与除数有什么关系?嗯,因为我刚才说的那件事确实是它们之间唯一的区别。
glVertexAttribDivisor
是用于设置除数的旧式 API。它需要一个属性索引,但它作用于作为缓冲区绑定点一部分的状态(实例化是每个数组的构造,而不是现在的每个属性的构造)。这意味着该函数假设(在新系统中)属性位于index
从缓冲区绑定点获取数据index
.
而且我刚才说的话有点谎言。它enforces这个“假设”直接setting使用该缓冲区绑定点的顶点格式。也就是说,它执行与最后一步相同的操作glVertexAttribPointer
did.
glVertexBindingDivisor
是现代函数。它没有传递属性索引;它被传递一个缓冲区绑定索引。因此,它不会更改属性的缓冲区绑定索引。
So glVertexAttribDivisor
与此完全等效:
void glVertexAttribDivisor(GLuint index, GLuint divisor)
{
glVertexBindingDivisor(index, divisor);
glVertexAttribBinding(index, index);
}
明显地,glVertexBindingDivisor
不做最后一部分。