Вершинный процессор не может заменить графические операции, которым требуются данные о нескольких вершинах или о топологии объектов. Стандартные операции, которые не могут выполняться вершинным и фрагментным процессорами, - это вычисление перспективы и создание графического окна, сборка примитивов, отсечение конусом и плоскостями, отбраковка задних поверхностей, выбор двухстороннего освещения, режим, многоугольников, смещение многоугольников, плоское или мягкое затенение, диапазон глубины.
Вершинные шейдеры можно использовать, чтобы улучшить алгоритм, выполняемый на вершинном процессоре. Они получают входные данные и производят выходные данные (рис. 2.2).
Для управления входными и выходными данными вершинного процессора используются квалификаторы типов, определенные как часть языка шейдеров OpenGL.
Переменные, определенные в вершинном шейдере, рассматриваются как переменные атрибутов. Эти переменные представляют собой данные, которые передаются вершинному процессору от приложения. Поскольку эти типы используются только для передачи данных о вершинах из приложения, их можно использовать лишь как часть вершинного шейдера. Приложения могут задавать значения атрибутов либо между вызовами gl Begi п и gl End, либо вызовом функций работы с вершинными массивами, так что значения могут меняться так же часто, как и текущая вершина, то есть задаваться для каждой вершины отдельно.
Существует два типа переменных атрибутов: встроенные и определенные разработчиком. Стандартные переменные атрибутов в OpenGL включают значения цвета, нормали поверхности, координаты текстуры и координаты вершины. Задать их можно OpenGL-функциями gl Color, gl Normal, gl Vertex и др. Команды OpenGL для обработки массивов вершин также можно использовать, чтобы задать стандартные Open G L-атрибуты вершин вершинному процессору.
При выполнении вершинный шейдер получает заданные значения через встроенные переменные атрибутов с названиями gl _Col or, gl_Normal, gl_Vertex и др.
Описанный способ передачи данных ограничивает возможные данные уже определенным в OpenGL набором. Чтобы обойти это ограничение, был добавлен новый интерфейс, позволяющий приложениям передавать произвольные данные для вершин. В OpenGL API определены общие вершинные атрибуты, на которые ссылаются по номерам от 0 до какого-то определенного конкретной реализацией максимального значения. Команда gl VertexAttri bARB отправляет общие вершинные атрибуты в OpenGL, и ей нужно задавать помер общего атрибута и значение для него.
Рис. 2.2. Входные и выходные данные вершинного процессора Вершинные шейдеры могут получать заданные значения общих атрибутов через определенные разработчиком переменные атрибутов. Для этого в OpenGL была добавлена новая команда gl Bi ndAttri bLocati onARB, которая ассоциирует номер общего вершинного атрибута с именем переменной в вершинном шейдере.
Однообразные (uniform) переменные приложение может использовать для передачи как вершинному, так и фрагментному процессору. Такие переменные обычно используются для передачи относительно редко изменяемых данных. Шейдер может быть исполнен так, чтобы получать входные параметры через uniform-переменные.