当使用glVertexAttribPointer绑定属性索引时,如果关联程序在所述索引处不包含属性会发生什么?
行为是未定义的,还是属性被完全忽略了?
我已经对文档进行了广泛的搜索,还没有找到有关程序和动态属性绑定之间的链接的很多信息。
程序未与顶点数组对象关联。顶点属性索引是绑定点。如果程序不需要“绑定点”,则不会引起任何问题。
[...]如果该索引处有一个属性,但与先前使用
glVertexAttribPointer
[...]指定的属性类型不同,该怎么办?OpenGL 4.6 API Core Profile Specification - 10.2.1 Current Generic Attributes,第349页:
当顶点着色器属性变量的值来自当前的通用属性值时,必须通过与该变量的数据类型兼容的命令来指定属性。
这意味着如果属性的数据类型为浮点数,则必须通过
glVertexAttribPointer
指定顶点属性数据的数组。如果数据类型是整数,则必须使用glVertexAttribPointer
(将焦点放在glVertexAttribIPointer
上)。如果忽略这一点,那么顶点数组缓冲区中的数据将被错误地解释。
glVertexAttribIPointer
,第361页:
[当顶点通过
分量由数组指定;否则,该值为0。 y,z和w分量分别隐式设置为0、0和1。如果size为2,则属性的[[x和y分量由数组指定; z和w分量分别隐式设置为0和1。如果size为3,则指定x,y和z,并且w隐式设置为1。如果size为4,则指定所有分量。因此,着色器程序中顶点数据的元组大小和顶点属性的数据类型的元组大小(例如I
,OpenGL 4.6 API Core Profile Specification - 10.3.5 Transferring Array Elements或下面描述的其他DrawArrays
命令传输到GL时,每个通用属性都扩展为四个分量。如果size为1,则该属性的xDrawElements
,Draw*
,float
,...)可以不同。如果程序中顶点属性的元组大小较大,则对于2md和3rd分别将数据扩展为0,对于第4个分量将数据扩展为1。如果程序中顶点属性的元组大小较小,则“不使用”顶点数组中的其他组件。