Интерфейс массивов вершин в программируемой среде OpenGL работает точно так же, как и обычно. Когда в OpenGL устанавливается массив вершин, данные о вершинах обрабатываются последовательно, вершина за вершиной, как в методе «вершина за раз». Если вершинный шейдер активен, каждая вершина будет им обрабатываться.
Однако новые возможности программируемости позволяют приложению не ограничиваться обычными атрибутами, определенными в OpenGL. Существует много дополнительных атрибутов вершин, которые, возможно, потребуется передать от приложения вершинному шейдеру.
Легко представить, что приложению может потребоваться указывать, например, тангенс, температуру, давление или еще какую-нибудь величину. Как же позволить приложениям передавать «нетрадиционные» атрибуты и работать с ними в вершинных шейдерах?
Ответ таков: OpenGL предоставляет некоторое количество переменных для передачи атрибутов вершин. Каждая такая переменная имеет индекс (номер) и место для хранения до четырех чисел с плавающей запятой (то есть типа vec4). Реализация, поддерживающая 16 таких переменных, будет присваивать им номера от 0 до 15. Приложение может передавать атрибуты вершины через любые такие переменные с помощью функций
void glVertexAttrib{l|2|3|4}{s)f|d}ARB(GLuint index. TYPE *0
void glVertexAttnb{l|2|3}{s|fjd}vARB(GLuint index, const TYPE*v)
void glVertexAttrib4{b| s| i |f |d|ub|us|ui}vARB(GLuint index, const TYPE* v)
Функции устанавливают атрибуты вершин по индексу index в значение из V. Эта команда имеет до трех суффиксов, которые дифференцируют входные параметры. Первый суффикс может быть 1,2,3 или 4, он показывает, содержит ли v 1,2,3 или 4 компонента. Если второй и третий компоненты не указаны, по умолчанию предполагается значение 0. Если четвертый компонент не указан, по умолчанию предполагается значен ие 1. Второй суффикс определяет тип данных и может обозначать byte (b),short (s), int (i), float (f), double(d), unsigned byte (ub), unsigned short (us) или unsigned int (ui). Третий суффикс необязателен - это буква V, обозначающая, что параметр v является указателем на массив значений этого типа данных.
Приведенный набор команд имеет свои правила для преобразования данных в формат числа с плавающей запятой, то есть во внутреннее представление данных в OpenGL. Числа с плавающей запятой и двойной точности переводятся во внутренние значения OpenGL обычным способом, целые числа преобразуются в числа с плавающей запятой добавлением нулевой дробной части. Таким образом, например, значение 27 для типов byte, int, short, unsigned byte, unsigned int, unsigned short станет значением 27,0 внутри QpenGL.
Другой набор функций позволяет передавать нормализованные значения как атрибуты вершин:
void glVertexAttrib4NubARB(GLuint index. TYPE i/)
void gl VertexAttrib4N{bj sj i|fjd j ub|us|ui}vARBCGLuint index, const TYPE *v)
Функции устанавливают дополнительные атрибуты вершин по индексу index в нормализованное значение из V. В дополнение к N (что указывает на нормализованные данные) в названии может быть два суффикса, что позволяет указывать тип передаваемого аргумента. Первый суффикс указывает тип данных v и может обозначать byte (b), short (s), i nt (i), float (f), double (d), unsigned byte (ub), unsigned short (us) или unsigned int (ui). Второй суффикс v - необязательный и обозначает, что v - указатель на массив значений этого типа данных.