Атрибуты вершин бывают стандартные и произвольные. Стандартные атрибуты - те, что предусмотрены OpenGL: первичный и вторичный цвет, нормаль, координаты вершины, координаты текстуры, координаты дымки.

Некоторые атрибуты вершинному шейдеру недоступны, например атрибут индекса, который используется для установки индекса цвета, и флаг видимости грани. Тем не менее приложение может устанавливать флаг видимости грани в OpenGL, используя вершинный шейдер.

Вершинный шейдер получает данные из стандартных атрибутов, обращаясь к ним по специальным встроенным в язык именам. Из фрагментного шейдера эти данные недоступны, поэтому при попытке использовать их имена во фрагмент-ном шейдере компилятор будет порождать ошибку:

//

// Атрибуты вершин П

attribute vec4 gl_Color; attribute vec4 gl_SecondaryColor: attribute vec3 gljtormal: attribute vec4 gl_Vertex: attribute vec4 gl_MtiltiTexCoord0: attribute vec4 gl_MultiTexCoordl: attribute vec4 g1_Mu1tiTexCobrd2:

// … до gl_MultiTexCoordN-l. где N = gl_MaxTextureCoords attribute float gl_FogCoord: Подробнее о передаче атрибутов вершинному шейдеру с помощью API-языка шейдеров OpenGL говорится в разделе 7.6.

И стандартные, и произвольные атрибуты - часть состояния OpenGL. Это означает, что однажды установленные значения сохраняются в дальнейшем. Приложение может установить любой атрибут и рассчитывать, что OpenGL сохранит его (за исключением координат вершины, см. раздел 7.6). Существует, однако, ограничение на количество атрибутов вершины, которые может использовать вершинный шейдер. Обычно разрешенное количество атрибутов меньше, чем общее количество стандартных и произвольных атрибутов. Получить это максимальное количество атрибутов, обычно зависящее от конкретной реализации OpenGL, можно с помощью функции gl Get, задав константу GL_MAX_VERTEX_ATTR1BS_ARB. Тем не менее каждая реализация OpenGL обязана поддерживать не меньше 16 вершинных атрибутов.

Чтобы при установке атрибутов можно было отделить атрибуты одной вершины от атрибутов другой, используют специальный атрибут gl _Vertex. Если приложение устанавливает этот атрибут командой gl Vertex или одной из команд для массива вершин, значит, определение вершины закончилось и все последующие атрибуты будут устанавливаться для следующей. Вызовом функции gl VertexAttri bARB с индексом можно установить произвольный атрибут, который находится по этому индексу.

Эти две команды выполняют одни и те же действия, и каждая обозначает окончание определения вершины.

4.1.2. Uniform-переменные

Шейдер может получить состояние OpenGL через встроенные uniform-переменные, начинающиеся с префикса gl_. Например, к текущей матрице модели-вида можно обратиться по имени gl_Model ViewMatriх. Свойства источника света можно получить из массива, в котором содержатся данные обо всех источниках света, нацример g 1 _Li ghtSource[2]. spotDi recti on. Изменения любого состояния OpenGL, однажды полученного шейдером, в дальнейшем отслеживаются и сразу становятся доступными шейдеру. Это позволяет приложению использовать команды OpenGL для косвенного управления шейдером.


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