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