Существует несколько видов адресации векторов по именам:
□ х, У, z, w ■ вектор рассматривается как координаты иди направление;
□ г, д, Ь, а - вектор рассматривается как значение цвета; О s, t, р, q -■ вектор рассматривается как координаты текстуры.
При всем этом невозможно явно указать, что обозначает вектор - цвет, координаты или что-нибудь еще. Скорее, эти имена придуманы для удобства и читабельности. При компиляции происходит единственная проверка - достаточно ли вектор велик для того, чтобы вмещать заданный компонент. Если выбрано несколько компонентов сразу (настройка по адресам, обсуждаемая в разделе 3.7.2), проверяется, что все указанные компоненты - из одной группы.
К элементам вектора можно обращаться и по индексу. Например, positi on[2] возвращает третий элемент вектора posi ti on. В качестве индекса можно подставлять значение переменной, что позволяет организовать цикл по компонентам вектора. Операция умножения векторов существует и осуществляется так же, как линейное умножение обычных матриц. Настройка по адресам, индексирование и другие операции будут подробно рассматриваться в разделе 3.7.
3.2.3. Матрицы
В языке существуют также встроенные типы матриц из чисел с плавающей запятой - размером 2x2, 3x3 и 4x4:
□ nat2 - матрица из чисел с плавающей запятой размером 2x2;
□ mat3 - матрица из чисел с плавающей запятой размером 3x3;
□ mat4 - матрица из чисел с плавающей запятой размером 4x4.
В переменных этих типов можно хранить данные для линейных преобразований или какие-либо другие. При выполнении операций над этими типами они всегда рассматриваются как математические матрицы, в частности, при перемножении вектора и матрицы выполняются правильные с математической точки зрения вычисления. Представлять матрицы в OpenGL принято по столбцам.
Матрицу можно рассматривать также как массив столбцов-векторов: например, если переменная transform типа mat4, то transform[2] - третий столбец матрицы transform, и его тип будет vec4. Индекс первого столбца 0. Так как transform^] - вектор, а векторы являются и массивами, transform[3J[l] - второй элемент вектора из четвертого столбца матрицы t rans form. Таким образом, мы можем рассматривать t ransform еще и как двухмерный массив. Следует лишь учитывать, что первый индекс выбирает столбец, а не строку, а уже второй индекс выбирает строку.
3.2.4. Дискретизаторы
Чтобы получить нужную текстуру, нужно указать ее и/или ее текстурный модуль. В стандарте OpenGL не определено, как и в каком виде будут реализованы текстурные модули или другие способы организации хранения текстур. Вместо этого OpenGL предоставляет некий абстрактный «черный ящик» для доступа к текстуре. Такие «черные ящики» называются дискретизаторами (семплерами).
Типы доступных дискретизаторов:
□ samp! erlD - предоставляет доступ к одномерной текстуре;
□ sampl er2D - предоставляет доступ к двухмерной текстуре;