И вершинный, и фрагментный шейдеры могут получать состояние OpenGL через встроенные uniform-переменные. Эти переменные приведены в разделе 4.3.
Приложения могут определять свои uniform-переменные для вершинного шейдера и использовать функции OpenGL API для установки их значений (см. раздел 7.7). Существует ограничение на максимальное количество uniform-переменных, зависящее от реализации. Общее количество и встроенных, и определенных разработчиком uniform-переменных не может быть больше установленного максимума, подсчитывается оно в компонентах размера float: например, vec2 состоит из двух компонентов, vec3 - из трех и т. д. Это максимальное значение можно получить из результата выполнения функции gl Get, передав константу GL_MAX_VER-T.EX_UN IF 0RM_C OHPON ENTS_ARB.
4.1.3. Выходные переменные
Из материала предыдущих глав становится понятно, как результаты вычислений из вершинного шейдера попадают в OpenGL для дальнейшей обработки, в том числе для сборки примитивов и растеризации. В языке шейдеров OpenGL определено несколько встроенных переменных, в которые вершинный шейдер может записывать вычисленные значения. Встроенные переменные, обсуждаемые в этом разделе, доступны для записи только вершинному шейдеру.
Переменная g 1 __Pos i ti on хранит координаты вершины после их обработки шейдером. Хорошо сформированный шейдер обновляет значение этой переменной при каждом новом выполнении. Компилятор в некоторых случаях может порождать ошибку, предупреждая разработчика о том, что шейдер не обновляет переменную gl _Posi ti on или читает из нее значение до первого обновления, но не все такие ситуации компилятор может выявить. Если шейдер не устанавливает значение переменной gl _Posi ti on, результат его выполнения получается неопределенным.
Встроенная переменная gl_Poi ntSi ze хранит размер (диаметр) точки примитива, измеряемый в пикселах. С помощью этого значения вершинный шейдер может, к примеру, вычислить размер экрана относительно расстояния до точки. Более подробное описание gl_Po1 ntSize приведено в разделе 4.5.2, Если включено произвольное отсечение, оно выполняется внутри OpenGL после выполнения вершинного шейдера. Чтобы отсечение правильно работало совместно с вершинным шейдером, шейдер должен вычислить еще и координаты вершины относительно определенных произвольных плоскостей отсечения, а затем записать результат вычисления в переменную gl_Cl i pVertex. Приложение должно самостоятельно контролировать, записываются ли эти значения шейдером и определены ли все плоскости отсечения в одной и той же системе координат. Произвольное отсечение такими определенными плоскостями работает только при линейном преобразовании. Более подробное описание gl С11 pVertex приведено в разделе4.5.3.
Каждая из этих переменных находится в глобальной области видимости, она доступна для записи в любой момент выполнения вершинного шейдера. Из них можно читать значения, которые были ранее в них записаны, но нельзя читать значение из неинициализированной переменной, так: как это вызовет неопределенное поведение. Только последнее записанное значение используется для последующих операций.