我正在开发一个 OpenGL 应用程序,并试图使 ShaderPrograms 和 VAO 相互独立。说独立我的意思是 ShaderProgram 和 VAO 都可以有不同的属性集。
在创建新的 ShaderProgram 时,我将已知属性列表显式绑定到预定义位置,即使着色器不使用它们。
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 中,还是上下文全局状态,我需要在每次绘制调用后重置它?