#opengl #glsl
Читаем:
Атрибуты (attribute) — это свойство вершины. У вершины могут быть
различные атрибуты. Например, координаты положения в пространстве,
координаты вектора нормали, цвет. Кроме того, вы можете передавать в
вершинный шейдер какие-либо свои атрибуты. Важно понять, что атрибут —
это свойство вершины, и поэтому он должен быть задан для каждой
вершины. Атрибуты передаются в только вершинный шейдер. Атрибуты
доступны вершинному шейдеру только для чтения и не могут быть
перезаписаны.
Юниформы (uniform) — это внешние данные, которые могут быть
использованы для расчетов, но не могут быть перезаписаны. Униформы
могут быть переданы как в вершинный, так и во фрагментный шейдеры.
Униформы никак не связаны с конкретной вершиной и являются глобальными
константами. Например, в качестве униформ можно передать в шейдер
координаты источника света и координаты глаза (камеры).
Для первых:
Атрибуты доступны вершинному шейдеру только для чтения и не могут быть перезаписаны.
Для вторых:
Юниформы (uniform) — это внешние данные, которые могут быть использованы для расчетов,
но не могут быть перезаписаны.
Вывод:
и те и другие можно читать но нельзя перезаписать.
Вопрос:
Чем они различаются?
Ответы
Ответ 1
Еще добавлю примеры:
Для uniform это глобальные, вроде параметров освещения, текстур модели, каких-либо
коэффициентов. Они видны во всех шейдерах, собранных в программу
Для attributes это цвет, нормаль, uv, позиция, тангент и т.д.
Ответ 2
Униформ - это константа переданная программистом в шейдер, где она будет использоваться
как константа.
Атрибут же - это константа вершины. Атрибут будет использован для расчёта свойств
вершины, например, для вычисления текстурной координаты вершины, потом эти рассчитанные
данные будут интерполированы для использования во фрагментном шейдере.
У каждой вершины свои атрибуты, которые используются в вершинном шейдере, а униформы
- это просто константы, которые используются в обоих шейдерах. А как раз вариинг -
это рассчитанное значение для вершины, которое во фрагментном шейдере будет интерполировано
в зависимости от расстояния до вершин.
Программист передаёт данные для вершин в атрибутах - координаты, текстурные координаты,
нормаль, цвет, да вообще на самом деле что угодно ещё. В шейдере это будет выглядеть
как одна переменная, например, цвет, но - в реальности для каждой вершины в атрибут
будут заноситься значения именно для этой вершины, и будет вызываться вершинный шейдер.
Если смотреть на вершинный шейдер как на функцию/метод, то атрибуты - это параметры
этой функции, а сама функция вызывается видеокартой для каждой вершины.
Задачей программиста же является загрузить в видеокарту атрибуты для каждой вершины.
То есть имеем, например, 20 вершин, значит надо передать 20 координат, 20 вершиных
координат, 20 нормалей и пр. (всё, что нужно для конкретного шейдера). Видеокарта получает
эти массивы. В начале отрисовки происходит "обсчёт" вершин. Для каждой вершины из массивов
берутся соответствующие значения атрибутов и подставляются в вершинный вертекс, он
выполняется, и производит вычисления для конкретной вершины основываясь на именно её
атрибутах.