В число базовых типов входят также табличные (матричные) типы для чисел с плавающей запятой. Тип данных mat2 обозначает таблицу 2x2 из чисел с плавающей запятой, mat3 - таблицу 3x3, mat4 - таблицу 4x4. Это удобный тип для выполнения линейных преобразований, используемых в ЗБ-графике, В матрице можно выбрать столбцы с помощью индексации, как для массива, и получить вектор, с которым можно работать, как описано ранее.

Для того чтобы шейдеры могли легко работать с текстурной памятью, был создан набор базовых типов - дискретизаторов. Дискретизатор - это специальный тип переменной, применяемый для доступа к конкретной текстурной карте. Переменная типа sampl erlD используется для доступа к одномерной текстурной карте, переменная типа sampl er2D - для доступа к двухмерной текстурной карте и т. д. Текстуры глубины и кубические текстуры этим механизмом также поддерживаются.

Для управления входными и выходными данными шейдеров существуют особые спецификаторы. Спецификаторы attribute, uni form и varying определяют вид переменной. В attribute-переменных хранятся часто изменяющиеся значения. Они служат для передачи данных из приложения вершинному шейдеру. Uniform-переменные хранят редко изменяющиеся значения и служат для передачи данных из приложения любому шейдеру. Varying-переменные передают интерполированные значения от вершинного шейдера фрагментному.

Шейдеры, написанные на языке шейдеров OpenGL, используют встроенные переменные, которые начинаются с зарезервированного префикса д!_, для доступа к состояниям OpenGL и постоянной функциональности OpenGL. Например, и вершинные, и фрагментные шейдеры могут использовать встроенные переменные, содержащие состояния текущего контекста рендеринга. Например, это переменная gl Jtodel Vi ewMatri x для получения текущей матрицы модели-вида, g 1 _Li ghtSourceCi ] - для получения текущих параметров i -го источника света, gl Fog. col or - для доступа к текущему цвету дымки. Вершинный шейдер должен занести нужное значе-ниев переменнуюд1 ^Position, чтобы передать данные для стандартной обработки между вершинным и фрагментным шейдерами, то есть для сборки примитивов, отсечения, отбраковки и растеризации. Фрагментный шейдер обычно устанавливает другие переменные, gl_FragCol or и gl_FragDepth, или одну из них. Они содержат значения вычисленных цвета и глубины фрагмента и используются в окончательных операциях стандартной обработки - проверке прозрачности, отсечении по шаблону, проверке глубины, - перед тем как попасть в буфер кадров.

Язык шейдеров OpenGL предоставляет также множество встроенных функций, чтобы сделать кодирование легким и лучше использовать возможности графических акселераторов для конкретных операций. Язык определяет встроенные функции для различных тригонометрических операций (синус, косинус, тангенс и др.), операций степени (нахождение степени, экспоненты, логарифма, корня квадратного, обратного корня квадратного), общих математических операций (округление до меньшего, округление до большего, определения абсолютного зпачения, дробной части, модуля числа и т. д.), геометрических операций (нахождение длины, расстояния, скалярного произведения, векторного произведения, нормализация и т. д.), операций отношений для векторов (покомпонентное «больше», «меньше», «равно» и т. д.), специализированные функции фрагментного шейдера для вычисления производных и оценки ширины фильтра для сглаживания, функции доступа к текстурной памяти и функции, возвращающие значения шума для текстурных эффектов.


⇐ вернуться назад | | далее ⇒