Я разрабатываю приложение OpenGL, и я пытаюсь сделать ShaderPrograms и VAO независимыми друг от друга. Говоря независимо, я имею в виду, что и ShaderProgram, и VAO могут иметь разные атрибуты.VertexArrayObject, как я могу установить значение атрибута «по умолчанию»?
При создании новой 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.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, или это контекстное глобальное состояние, и мне нужно сбросить его после каждого вызова ничьей?