1

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

行为是未定义的,还是完全忽略了该属性?

我已经对文档进行了相当广泛的搜索,但无法找到有关程序和动态属性绑定之间链接的大量信息。

4

1 回答 1

2

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


[...] 如果该索引处有一个属性,但它的类型与之前使用glVertexAttribPointer[...]

OpenGL 4.6 API 核心配置文件规范 - 10.2.1 当前通用属性,第 349 页:

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

这意味着如果属性的数据类型是浮点数,那么您必须通过glVertexAttribPointer. 如果数据类型是完整的,则您必须使用glVertexAttribIPointer(关注I)。
如果忽略这一点,那么顶点数组缓冲区中的数据将被误解。

OpenGL 4.6 API 核心配置文件规范 - 10.3.5 传输数组元素,第 361 页:

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

所以顶点数据的元组大小和着色器程序中顶点属性的数据类型的元组大小(例如float, vec2, vec3, ...)是允许不同的。
如果程序中顶点属性的元组大小较大,则数据为第 2md 和第 3 个分别扩展 0 为第 4 个分量为 1。
如果程序中顶点属性的元组大小较小,则顶点数组中的附加组件“未使用”。

于 2019-10-05T10:09:14.300 回答