4.2. Фрагментный процессор
Фрагментный процессор выполняет фрагментные шейдеры и замещает стандартные операции текстурирования, наложения цветов и создания дымки. В частности, следующие операции над фрагментами замещаются:
□ не применяются текстурные функции;
□ не накладываются текстуры;
□ не накладываются цвета;
□ не накладывается дымка.
Как обычно выполняются прочие операции:
□ детализация текстур;
□ альтернативная детализация текстур;
□ сжатая детализация текстур;
□ расчет параметров текстуры (они не изменяются, даже если доступ к текстуре происходит из фрагментного шейдера);
□ определение состояния текстуры;
□ детализация текстурного объекта;
□ применение режимов сравнения текстур.
Основные функции, выполняемые фрагментный процессором, описаны в разделе 2.3.2. Данные поступают во фрагментный шейдер через встроенные или определенные разработчиком varying-переменные, uniform-переменные, специальные входные переменные или текстурные карты (см. рис. 2.3), Результаты вычислений извлекаются из фрагментного процессора с помощью специальных переменных выхода фрагментного шейдера. Встроенные константы, описанные в разделе 4.4, тоже доступны из фрагментного шейдера.
Поведение фрагментного шейдера, как и вершинного, не определено, если буфер кадров работает не в режиме RGBA, а в режиме индексированного цвета.
4.2.1. Varying-переменные
К некоторым встроенным varying-переменным можно обратиться из фрагментного шейдера. Переменные gl_Co1 ог и gl JSecondaryColor здесь те же, что и встроенные attribute-переменные в вершинном шейдере. Никакой неоднозначности здесь нет, так как те переменные доступ ны только из вершинного шейдера, а эти - только из фрагментного:
varying vec4 gl_Co1or;
varying vec4 glJJecondaryColor:
varying vec4 gl_TexCoord[gl_MaxTextureCoords]:
varying float gi_FogFragCoord: Значения gl Color и gl_SecondaryColor будут вычислены автоматически из значений gl_FrontCol or, gl_BackCol or, gl_FrontSecondaryColor и gl_BackSecondary Color при определении принадлежности примитива передней или задней грани (см. раздел 4.5.1). Если вершинный шейдер не задействован и выполняются стандартные операции, в gl_FogP ragCoord будет содержаться либо г-координата фрагмента в пространстве координат обзора, либо интерполированное значение координаты дымки, в зависимости от того, установлен ли GL_FRAGMENT_DEPTH или GL_F0G_C00RDINATE. Массив g1_TexCoord[] будет содержать значения, записанные вершинным шейдером, а если вершинный шейдер отсутствует, то массив будет содержать результаты стандартных операций над вершинами - текстурные координаты. Автоматически деление текстурных координат по q-компоненте не производится.
Если вершинный шейдер отсутствует, а фрагментный шейдер есть, нужно учитывать некоторые тонкости; к примеру, если обработка фрагментов происходит после обычной растеризации пиксельного прямоугольника или растрового изображения, а фрагментный шейдер использует не встроенные varying-переменяые, результаты обращения к таким переменным не определены. Б данном случае заполненными оказываются только встроенные varying-переменные, в которых содержатся данные о положении используемого растра.