在OpenGL的4文档说:
GL_CURRENT_VERTEX_ATTRIB
params 返回四个值,代表索引指定的通用顶点属性的当前值。通用顶点属性 0 的唯一性在于它没有当前状态,因此如果 index 为 0 将产生错误。所有其他通用顶点属性的初始值为 (0,0,0,1)。
在实践中“如果索引为 0 将产生错误”是什么意思?
假设我有一个具有以下布局的顶点着色器:
layout (location = 0) in vec3 pos;
我想设置一个通用(常量)顶点属性。我可以使用索引等于 0 的 glVertexAttrib3f 吗?
glVertexAttrib3f(0, 1, 0, 0);
后来我想这样检查当前的顶点属性:
glGetVertexAttribfv(0, GL_CURRENT_VERTEX_ATTRIB, data);
这是正确的吗 ?
相对于核心 OpenGL 3.2 或更高版本,文档中的文本不正确。在 OpenGL 的核心配置文件中,属性 0 具有状态并且可以查询该状态。
在高达 4.5(以及 3.0 之前的所有 GL 版本)的兼容性配置文件中,属性 0 没有状态。4.5 更改了兼容性配置文件以赋予属性 0 状态。事实上,规范特别指出了这一变化:
这是兼容性配置文件的行为变化,以提高与核心配置文件和 OpenGL ES 的互操作性。
说了这么多,你真的应该假装通用属性值不存在。由于它们很少使用,因此它们的性能特征是未知的。它们的值有些短暂;如果你设置一个值,渲染一些东西,然后渲染一些使用该属性的数组的东西,你之前设置的值将不会被保留,需要你再次设置它。这与大多数 OpenGL 状态非常不同。