Opengl VertexArrayObject,如何设置;“违约”;属性值?

Opengl VertexArrayObject,如何设置;“违约”;属性值?,opengl,attributes,shader,vao,Opengl,Attributes,Shader,Vao,我正在开发一个OpenGL应用程序,并试图使着色器程序和VAO相互独立。说独立,我的意思是着色器程序和VAO都可以有不同的属性集 在创建新的着色器程序时,我显式地将已知属性列表绑定到预定义的位置,即使着色器不使用它们 BindAttributeLocation(program, StandardAttribute.Position, PositionAttributeName); BindAttributeLocation(program, StandardAttribute.Color

我正在开发一个OpenGL应用程序,并试图使着色器程序和VAO相互独立。说独立,我的意思是着色器程序和VAO都可以有不同的属性集

在创建新的着色器程序时,我显式地将已知属性列表绑定到预定义的位置,即使着色器不使用它们

  BindAttributeLocation(program, StandardAttribute.Position, PositionAttributeName);
  BindAttributeLocation(program, StandardAttribute.Color, ColorAttributeName);
  BindAttributeLocation(program, StandardAttribute.Normal, NormalAttributeName);
  BindAttributeLocation(program, StandardAttribute.TexCoord, TexCoordAttributeName);
  BindAttributeLocation(program, StandardAttribute.Tangent, TangentAttributeName);
和我尝试使用VAO做的事情非常相似,但如果网格不包含属性的数据,我希望设置默认值:

vao.Bind();
if(mesh.Color == null) {
    DisableVertexAttribArray(attribute);
    VertexAttrib4f(attribute, 1, 1, 1, 1);
}
else {
    EnableVertexAttribArray(attribute);
    buffer.Bind();
    BufferData(mesh.Color);
    VertexAttribPointer(attribute, ...);
}

这段代码似乎正在运行(到目前为止),但我不确定这是否是一种正确的方法。VertexAttrib4f在何处存储数据:在VAO中,还是在上下文全局状态下,我需要在每次绘图调用后重置它?

当前属性值不是VAO状态的一部分。规范中确认这一点的最清晰的陈述出现在
glGetVertexAttrib()
的描述中(重点添加):

请注意,除当前顶点属性外的所有查询都返回存储在当前绑定顶点数组对象中的值

其中
CURRENT\u VERTEX\u ATTRIB
是使用
glVertexAttrib4f()
设置的值


这意味着这些值是全局上下文状态。

好的,我找到了关于这方面的好文章:

顶点着色器可以读取当前未启用的属性 (通过GlenableVertexAttributeArray​). 它获取的值由 特殊上下文状态,它不是VAO的一部分

因为该属性是由上下文状态定义的,所以它是常量 单个绘图调用的过程。每个属性索引都有一个单独的 警告:每次使用数组发出绘图命令时 启用时,相应的上下文属性值将变为未定义。 因此,如果您想要,例如,使用非数组属性索引3 在之前使用索引3中的数组之后,需要重复 将其重置为已知值

这些的初始值是浮点值(0.0、0.0、0.0、1.0)​.