Можете ли вы сказать, включен ли атрибут вершины в вершинном шейдере?

Мне было интересно, есть ли способ узнать, включен ли атрибут вершины из вершинного шейдера? Я знаю, что если атрибут вершины отключен, все значения будут рассматриваться как 0,0, поэтому я мог бы выполнить следующий тест:

if (attribute == 0)
{
    // Do something different to normal.
}
else
{
    // Use the attribute.
}

Но это имеет очевидную проблему для случая, когда атрибут включен, а значение просто установлено на 0 (он будет рассматриваться как отключенный)!

Другим решением было бы просто использовать юниформ-переменную, которая указывает, использовать ли атрибут или нет, но мне интересно, есть ли что-нибудь встроенное в GLSL, что делает это?


person James Bedford    schedule 22.02.2012    source источник


Ответы (2)


Нет, нет.

Передайте булеву форму самостоятельно, чтобы подражать ей.

person Bahbar    schedule 22.02.2012
comment
Спасибо! Вот с чем я пошел. Было бы неплохо, если бы в будущем это стало функцией GLSL! - person James Bedford; 23.02.2012

К вашему сведению:

Я знаю, что если атрибут вершины отключен, все значения будут рассматриваться как 0,0, поэтому я мог бы выполнить следующий тест:

Это неправда. Если атрибут отключен, его значение берется из обычного состояния OpenGL. А именно, состояние, заданное функциями glVertexAttrib. Таким образом, совершенно законно отправлять такие «постоянные атрибуты» в шейдеры.

Вот почему в API нет возможности для шейдера определить, «отключен» ли атрибут. Атрибут «отключен» может по-прежнему иметь значимые данные.

person Nicol Bolas    schedule 22.02.2012
comment
@OP Таким образом, ваше решение для проверки конкретного неактивного значения может быть адаптировано для использования значения, отличного от 0, которое не является реальным значением атрибута, которое могло бы иметь место в противном случае, просто установив glVertexAttrib для этого значения. Таким образом, вам не нужно дополнительное логическое значение. - person Christian Rau; 23.02.2012
comment
Ой! Устанавливает ли функция glVertexAttrib значение, которое будет использоваться для каждой вершины? Так, например, если бы я назвал glVertexAttrib1f(3, -1.0f), то все атрибуты вершины в местоположении 3 были бы установлены на -1.0f? - person James Bedford; 23.02.2012
comment
@ДжеймсБедфорд: Да. Если массив этого атрибута не включен. - person Nicol Bolas; 23.02.2012