Основы
вектора можно получить доступ либо с помощью индексации (как в массиве), либо по именованным полям (как в структуре). Значения цвета можно получить так: первое значение - добавляя . г к имени вектора, второе - добавляя .g, третье - добавляя . Ь, четвертое - добавляя .а. Значения координат доступны по именам .х, .у, .Z, .w, а текстурные значения - по именам .s, -t, .р, .q. Можно получить сразу несколько компонентов, указав их имена подряд, например .ху.
В число базовых типов входят также табличные (матричные) типы для чисел с плавающей запятой. Тип данных rnat2 обозначает таблицу 2x2 из чисел с плавающей запятой, mat3 - таблицу 3x3, mat4 - таблицу 4x4. Это удобный тип для выполнения линейных преобразований, используемых в ЗБ-графике. В матрице можно выбрать столбцы с помощью индексации, как для массива, и получить вектор, с которым можно работать, как описано ранее.
Для того чтобы шейдеры могли легко работать с текстурной памятью, был создан набор базовых типов - дискретизаторов. Дискретизатор - это специальный тип переменной, применяемый для доступа к конкретной текстурной карте. Переменная типа samplerlD используется для доступа к одномерной текстурной карте, переменная типа samp! er2D - для доступа к двухмерной текстурной карте и т. д. Текстуры глубины и кубические текстуры этим механизмом также поддерживаются.
Для управления входными и выходными данными тендеров существуют особые спецификаторы. Спецификаторы attribute, uni form и varying определяют вид переменной. В attribute-переменных хранятся часто изменяющиеся значения. Они служат для передачи данных из приложения вершинному шейдеру. Uniform-переменные хранят редко изменяющиеся значения и служат для передачи данных из приложения любому шейдеру. Varying-переменные передают интерполированные значения от вершинного шейдера фрагментному.
Шейдеры, написанные на языке тендеров OpenGL, используют встроенные переменные, которые начинаются с зарезервированного префикса д1_, для доступа к состояниям OpenGL и постоянной функциональности OpenGL. Например, и вершинные, и фрагментные шейдеры могут использовать встроенные переменные, содержащие состояния текущего контекста рендеринга. Например, это переменная gl_Model Vi ewMatri х для получения текущей матрицы модели-вида, gl JJ ghtSource[i ] - для получения текущих параметров i -го источника света, glFog. col or - для доступа к текущему цвету дымки. Вершинный шейдер должен занести нужное значение в переменную gl Posi ti on, чтобы передать данные для стандартной обработки между вершинным и фрагментным тендерами, то есть для сборки примитивов, отсечения, отбраковки и растеризации. Фрагментный шейдер обычно устанавливает другие переменные, gl_FragCol or и gl_FragDepth, или одну из них. Они содержат значения вычисленных цвета и глубины фрагмента и используются в окончательных операциях стандартной обработки - проверке прозрачности, отсечении по шаблону, проверке глубины, - перед тем как попасть в буфер кадров.