Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

В чем различие между attribute от uniform?

#opengl #glsl


Читаем:


  Атрибуты (attribute) — это свойство вершины. У вершины могут быть
  различные атрибуты. Например, координаты положения в пространстве,
  координаты вектора нормали, цвет. Кроме того, вы можете передавать в
  вершинный шейдер какие-либо свои атрибуты. Важно понять, что атрибут —
  это свойство вершины, и поэтому он должен быть задан для каждой
  вершины. Атрибуты передаются в только вершинный шейдер. Атрибуты
  доступны вершинному шейдеру только для чтения и не могут быть
  перезаписаны.
  
  Юниформы (uniform) — это внешние данные, которые могут быть
  использованы для расчетов, но не могут быть перезаписаны. Униформы
  могут быть переданы как в вершинный, так и во фрагментный шейдеры.
  Униформы никак не связаны с конкретной вершиной и являются глобальными
  константами. Например, в качестве униформ можно передать в шейдер
  координаты источника света и координаты глаза (камеры).


Для первых:

Атрибуты доступны вершинному шейдеру только для чтения и не могут быть перезаписаны.

Для вторых:

Юниформы (uniform) — это внешние данные, которые могут быть использованы для расчетов,
но не могут быть перезаписаны.

Вывод: 

и те и другие можно читать но нельзя перезаписать.

Вопрос:

Чем они различаются?
    


Ответы

Ответ 1



Еще добавлю примеры: Для uniform это глобальные, вроде параметров освещения, текстур модели, каких-либо коэффициентов. Они видны во всех шейдерах, собранных в программу Для attributes это цвет, нормаль, uv, позиция, тангент и т.д.

Ответ 2



Униформ - это константа переданная программистом в шейдер, где она будет использоваться как константа. Атрибут же - это константа вершины. Атрибут будет использован для расчёта свойств вершины, например, для вычисления текстурной координаты вершины, потом эти рассчитанные данные будут интерполированы для использования во фрагментном шейдере. У каждой вершины свои атрибуты, которые используются в вершинном шейдере, а униформы - это просто константы, которые используются в обоих шейдерах. А как раз вариинг - это рассчитанное значение для вершины, которое во фрагментном шейдере будет интерполировано в зависимости от расстояния до вершин. Программист передаёт данные для вершин в атрибутах - координаты, текстурные координаты, нормаль, цвет, да вообще на самом деле что угодно ещё. В шейдере это будет выглядеть как одна переменная, например, цвет, но - в реальности для каждой вершины в атрибут будут заноситься значения именно для этой вершины, и будет вызываться вершинный шейдер. Если смотреть на вершинный шейдер как на функцию/метод, то атрибуты - это параметры этой функции, а сама функция вызывается видеокартой для каждой вершины. Задачей программиста же является загрузить в видеокарту атрибуты для каждой вершины. То есть имеем, например, 20 вершин, значит надо передать 20 координат, 20 вершиных координат, 20 нормалей и пр. (всё, что нужно для конкретного шейдера). Видеокарта получает эти массивы. В начале отрисовки происходит "обсчёт" вершин. Для каждой вершины из массивов берутся соответствующие значения атрибутов и подставляются в вершинный вертекс, он выполняется, и производит вычисления для конкретной вершины основываясь на именно её атрибутах.

Комментариев нет:

Отправить комментарий