Ну, в принципе, есть два варианта:
- значение переменной интерполируется по всему примитиву
- значение переменной постоянно для примитива, используя
flat
квалификатор интерполяции. Если примитив не просто точка, это означает, что данные должны поступать только из одной вершин, которая называется вызывающей вершиной. Для GL_LINES
обычно это первая вершина каждой строки.
Ни один из двух режимов не решит вашу проблему в общем случае. Рассмотрим следующий случай двух соединенных ребер AB
и BC
с присоединенными альфа-значениями 1
, 1
и 0
соответственно:
A B C
|------+------|
1 1 0
То, что вам действительно нужно, это резкое переход от непрозрачного к полностью прозрачному, и стандартным решением для этого является фактическое разделение вершин:
A B D C
|-----+++-----|
1 1 0 0
Теперь B
и D
имеют одинаковую позицию, но разные альфа-значения - и это что такое модель вершины в графическом процессоре: набор атрибутов, а не только положение, и если один атрибут отличается, технически это другая вершина.
Для вашего случая использования вы, вероятно, могли бы удалить буфер элемента полностью и всегда сохраняйте две разные вершины в строке.
Есть ли способ проверить оба узла ребра и всегда выбрать более низкое альфа-значение или что-то одинаково полезное.
Не напрямую. Существует несколько нестандартных расширений GL, которые предоставят вам доступ к связанным данным каждой вершины, например AMD_shader_explicit_vertex_parameter
или NV_fragment_shader_barycentric
, но ни одно из них обычно не поддерживается и не поддерживается. это также намного выше версии GL, которую вы, похоже, используете здесь.
Однако для вашего случая использования вы могли бы сделать несколько простых хакерских фрагментов, например:
gl_FragColor.a = step(0.99999, v_color_alpha);
, который в основном устанавливает альфа в 0.0, если он ниже 0.99999, поэтому он удалит большую часть перехода. Обратите внимание, что фрагменты с альфа = 0 могут по-прежнему записываться в буферы глубины и трафарета, поэтому вместо них может потребоваться условное discard
.