3.2,2. Векторы
В языке шейдеров OpenGL есть встроенные типы векторов из чисел с плавающей запятой (float), целых (int) или булевых (bool). Существуют разные типы для двух-, трех- и четырехэлементных векторов:
□ vec2 - вектор из двух чисел с плавающей запятой;
□ v.ec3 - вектор из трех чисел с плавающей запятой;
□ vec4 - вектор из четырех чисел с плавающей запятой;
□ i vec2 - вектор из двух целых;
□ i vec3 - вектор из трех целых;
□ i vec4 - вектор из четырех целых;
□ bvec2 - вектор из двух булевых значений;
□ bvec3 - вектор из трех булевых значений;
□ bvec4 - вектор из четырех булевых значений.
Встроенные векторы очень полезны - в них удобно хранить цвет, координаты вершин и текстур и т. п. Встроенные переменные и функции, использующие эти типы, делают их необходимыми. Для встроенных сложных типов поддерживаются операции над ними, и в графических ускорителях могут быть предусмотрены специальные возможности обработки векторов, например зеркальное отражение векторных выражений в шейдерах.
3,2. Типы данных
Компилятор не способен самостоятельно отличить вектор цвета или координат от вектора с другими значениями. С точки зрения языка все они - лишь векторы чисел с плавающей запятой.
Элементы вектора можно адресовать как по именам (как в структурах), так м по индексам (как в массивах). Например, пусть posi ti on - переменная типа vec3, она трактуется как вектор (лг, у, 2), и к первому элементу вектора можно обратиться position, х.
Существует несколько видов адресации векторов по именам:
□ х, У, z, w - вектор рассматривается как координаты или направление;
□ г, g, Ь, а - вектор рассматривается как значение цвета; О s, t, р, q - вектор рассматривается как координаты текстуры.
При всем этом невозможно явно указать, что обозначает вектор - цвет, координаты или что-нибудь еще. Скорее, эти имена придуманы для удобства и читабельности. При компиляции происходит единственная проверка - достаточно ли вектор велик для того, чтобы вмещать заданный компонент. Если выбрано несколько компонентов сразу (настройка по адресам, обсуждаемая в разделе 3.7.2), проверяется, что все указанные компоненты - из одной группы.