Существует два типа переменных атрибутов: встроенные и определенные разработчиком. Стандартные переменные атрибутов в OpenGL включают значения цвета, нормали поверхности, координаты текстуры и координаты вершины. Задать их можно OpenGL-функциями gl Color, gl Normal, gl Vertex и др. Команды OpenGL для обработки массивов вершин также можно использовать, чтобы задать стандартные OpenGL-атрибуты вершин вершинному процессору.
При выполнении вершинный шейдер получает заданные значения через встроенные переменные атрибутов с названиями gl_Color, glJJorrnal, gl_Vertex и др.
Описанный способ передачи данных ограничивает возможные данные уже определенным в OpenGL набором. Чтобы обойти это ограничение, был добавлен новый интерфейс, позволяющий приложениям передавать произвольные данные для вершин. В OpenGL API определены общие вершинные атрибуты, на которые ссылаются по номерам от 0 до какого-то определенного конкретной реализацией максимального значения. Команда gl VertexAttri bARB отправляет общие вершинные атрибуты в OpenGL, и ей нужно задавать помер общего атрибута и значение для него.
Основы
------Непосредственно от приложения
---Косвенно от приложения юшяи От вершинного процессора Рис. 2.2. Входные \л выходные данные вершинного процессора Вершинные шейдеры могут получать заданные значения общих атрибутов через определенные разработчиком переменные атрибутов. Для этого в OpenGL была добавлена новая команда gl BlndAttrl bLocat i onARB, которая ассоциирует номер общего вершинного атрибута с именем переменной в вершинном шейдере.
Однообразные (uniform) переменные приложение может использовать для передачи как вершинному, так и фрагментному процессору. Такие переменные обычно используются для передачи относительно редко изменяемых данных. Шеидер может быть исполнен так, чтобы получать входные параметры через uniform-переменные.
Приложение задает начальные значения uniform-переменным, а пользователь манипулирует ими через графический интерфейс, чтобы достичь разнообразия эффектов в одном шейдере. Но эти начальные значения не могут задаваться между вызовами gl Begin и gl End, так что менять их можно не чаще, чем один раз для каждого примитива.