2015-04-18 3 views
2

Я разрабатываю приложение 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, или это контекстное глобальное состояние, и мне нужно сбросить его после каждого вызова ничьей?

ответ

3

Хорошо, я нашел хорошую статью об этом: opengl.org

вершинный шейдер может прочитать атрибут, который в настоящее время не включен (через glEnableVertexAttribArray). Значение, которое оно получает, определяется специальным контекстным состоянием, которое составляет не часть ВАО.

Поскольку атрибут определяется контекстным состоянием, он является постоянным по сравнению с курсом одиночного вызова. Каждый индекс атрибута имеет отдельное значение . Предупреждение: каждый раз, когда вы выдаете команду рисования с включенным массивом , соответствующие значения атрибута контекста становятся неопределенными. Итак, если вы хотите, например, использовать индекс атрибута non-array 3 после использования массива в индексе 3, вам необходимо повторно указать , сбросив его до известного значения.

Начальное значение для них - с плавающей запятой (0.0, 0.0, 0.0, 1.0).

4

Текущее значение атрибута: не часть состояния VAO. Ярчайший заявление в спецификации, что подтверждает это в описании glGetVertexAttrib() (курсив):

Обратите внимание, что все запросы за исключением возвращаемых значений CURRENT_VERTEX_ATTRIB, хранящихся в настоящее время связаны вершины массива объектов

, где CURRENT_VERTEX_ATTRIB - это значение, которое вы установили с помощью glVertexAttrib4f().

Это означает, что значения являются глобальным контекстным состоянием.

Смежные вопросы