4,2. Фрагментный процессор
Фрагментный процессор выполняет фрагментные шейдеры и замещает стандартные операции текстурирования, наложения цветов и создания дымки. В частности, следующие операции над фрагментами замещаются:
□ не применяются текстурные функции;
□ не накладываются текстуры;
□ не накладываются цвета;
□ не накладывается дымка.
Как обычно выполняются прочие операции:
□ детализация текстур;
□ альтернативная детализация текстур;
□ сжатая детализация текстур;
□ расчет параметров текстуры (они не изменяются, даже если доступ к текстуре происходит из фрагментного шейдера);
□ определение состояния текстуры;
Программируемая часть операций OpenGL
□ детализация текстурного объекта;
□ применение режимов сравнения текстур.
Основные функции, выполняемые фрагментным процессором, описаны в разделе 2.3.2. Данные поступают во фрагментный шейдер через встроенные или определенные разработчиком varying-переменные, uniform-переменные, специальные входные переменные или текстурные карты (см. рис. 2.3). Результаты вычислений извлекаются из фрагментного процессора с помощью специальных переменных выхода фрагментного шейдера. Встроенные константы, описанные в разделе 4.4, тоже доступны из фрагментного шейдера.
Поведение фрагментного шейдера, как и вершинного, не определено, если буфер кадров работает не в режиме RGBA, а в режиме индексированного цвета.
4.2.1. Varying-переменные К некоторым встроенным varying-переменным можно обратиться из фрагментного шейдера. Переменные gl_Co1 or и gl JSecondaryColor здесь те же, что и встроенные attribute-переменные в вершинном шейдере. Никакой неоднозначности здесь нет, так как те переменные доступны только из вершинного шейдера, а эти - только из фрагментного:
varying vec4 gl_Color;
varying vec4 glJ>econdaryColor:
varying vec4 gl_TexCoord[gl_MaxTextureCoords]:
varying float gl_FogFragCoord:
Значения gl_Col or и gl_SecondaryCol or будут вычислены автоматически из значений gl_FrontColor, gl_BackColor, gl_FrontSecondaryColor и gl_BackSecondary Color при определении принадлежности примитива передней или задней грани (см. раздел 4.5.1). Если вершинный шейдер не задействован и выполняются стандартные операции, в gl_FogFragCoord будет содержаться либо z-координата фрагмента в пространстве координат обзора, либо интерполированное значение координаты дымки, в зависимости от того, установлен ли GL_FRAGMENT_DEPTH или GL_F0G_C00RDINATE. Массив gl_TexCoord[] будет содержать значения, записанные вершинным шейдером, а если вершинный шейдер отсутствует, то массив будет содержать результаты стандартных операций над вершинами - текстурные координаты. Автоматически деление текстурных координат по ^-компоненте не производится.