Opengl 使用glVertexAttribPointer绑定不存在属性的索引时的混淆

Opengl 使用glVertexAttribPointer绑定不存在属性的索引时的混淆,opengl,shader,vertex-buffer,vertex-attributes,vertex-array-object,Opengl,Shader,Vertex Buffer,Vertex Attributes,Vertex Array Object,当使用glVertexAttribPointer绑定属性索引时,当关联程序在所述索引处不包含属性时会发生什么情况 是行为未定义,还是属性被完全忽略 我已经广泛地搜索了文档,没有找到关于程序和动态属性绑定之间链接的更多信息。程序与顶点数组对象没有关联。顶点属性索引是绑定点。如果程序不“需要”绑定点,则不会导致任何问题 […]如果该索引处有一个属性,但它的类型不同于先前使用glvertexattributepointer[…]指定的属性,该怎么办 ,第349页: 当顶点着色器属性变量的值来源于当前

当使用glVertexAttribPointer绑定属性索引时,当关联程序在所述索引处不包含属性时会发生什么情况

是行为未定义,还是属性被完全忽略


我已经广泛地搜索了文档,没有找到关于程序和动态属性绑定之间链接的更多信息。

程序与顶点数组对象没有关联。顶点属性索引是绑定点。如果程序不“需要”绑定点,则不会导致任何问题


[…]如果该索引处有一个属性,但它的类型不同于先前使用
glvertexattributepointer
[…]指定的属性,该怎么办

,第349页:

当顶点着色器属性变量的值来源于当前常规属性值时,必须使用与该变量的数据类型兼容的命令指定该属性

这意味着,如果属性的数据类型为浮点,则必须按指定顶点属性数据的数组。如果数据类型是整数,则必须使用(重点是
I
)。
如果忽略这一点,则顶点数组缓冲区中的数据将被误解

,第361页:

当顶点通过
drawArray
DrawElements
或下面描述的其他
Draw*
命令传输到GL时,每个通用属性将扩展为四个组件。如果size为1,则属性的x分量由数组指定;y、z和w分量分别隐式设置为0、0和1。如果大小为2,则属性的x和y分量由数组指定;z和w分量分别隐式设置为0和1。如果大小为3,则指定x、y和z,并且w隐式设置为1。如果大小为4,则指定所有组件

因此,允许顶点数据的元组大小和着色器程序中顶点属性的数据类型的元组大小(例如,
float
vec2
vec3
,…)不同。
如果程序中顶点属性的元组大小更大,则2md的数据将分别扩展0,第3个组件的数据将分别扩展1。

如果程序中顶点属性的元组大小较小,则顶点数组中的附加组件“未使用”

会发生什么?没有什么。与代码中有一个名为
a
的数组,并且有更多关于从
b
而不是
a
读取的代码相同。程序与顶点数组对象没有关联。顶点属性索引是绑定点。如果程序不“需要”绑定点,这不会导致任何问题。我明白了。如果在该索引处有一个属性,但它的类型与之前使用GLVERTEXATTRIBCOPERT指定的类型不同,该怎么办?这会导致未定义的行为吗?如果调用GLVertexAttributePointer中指定的类型参数与顶点属性的类型不匹配怎么办?@invertedPanda始终转换为
float
GLVertexAttributeInter
用于
int
。类型指定缓冲区中的数据,与着色器中的类型无关。