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

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

Состояние OpenGL доступно и для вершинных, и для фрагментных шейдеров через встроенные uniform-переменные, имена которых начинаются с зарезервированного префикса gl_ (см. раздел 4.1.2). Список uniform-переменных, из которых можно получать параметры состояния OpenGL, приведен в разделе 4.3.

Определенные разработчиком uniform-переменные можно определять и использовать во фрагментных шейдерах точно так же, как и в вершинных. Существуют OpenGL API-функции для доступа к таким переменным (см. раздел 7.7).

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

4.2.3. Переменные для входных данных

Фрагментному шейдеру переменная gl _F га g.Coord доступна только для чтения, она содержит относительные оконные координаты фрагментах, у, z и 1/ж. Эти значения - результат интерполяции примитивов после обработки вершин, используются они для формирования фрагментов. Z-компонент после вычисления смещений многоугольников содержит значение глубины. Эта встроенная переменная нужна для реализации операций вычисления оконных координат, например прозрачности экранного окна (применение di scard к любому фрагменту с нечетными gl_FragCoord.x или gl_FragCoord.y, но не с обеими сразу).

Фрагментный шейдер может работать также с переменной .gl_FrontFaci ng, которая обозначает принадлежность фрагмента к передней (true) или задней (false) грани. Если имитируется двухстороннее освещение, вершинный шейдер вычисляет два значения цвета,, и в зависимости от gl_FrontFaci ng будет выбран один из этих цветов. Эти данные могут быть полезны также при задании разных способов затенения для передней или задней грани. Принадлежность фрагмента какому-либо виду грани зависит от примитива, из которого формируется фрагмент. Все фрагменты, созданные из примитивов, не являющихся многоугольниками, треугольниками или четырехугольниками, считаются расположенными на передней грани. Для всех других фрагментов (в том числе и созданных из точечных изображений или просто из отрезков) сначала проверяется знак координат примитива в оконном пространстве координат. В дальнейшем знак может быть изменен на противоположный в зависимости от того, каким был последний вызов gl FrontFace. Если знак положительный, фрагменты принадлежат передней грани; отрицательный - задней.

Переменные для входных данных находятся в глобальной области видимости, но могут быть доступны только из фрагментного шейдера. Объявлены они таким образом:

vec4 gl_FragCoord:

bool gl_FrontFacing:

4.2.4. Переменные для выходных данных

Фрагментный шейдер должен вычислять значения для буфера кадров. Над выходными данными из фрагментного шейдера выполняется несколько окончательных операций, данные для которых берутся из встроенных переменных gl FragColor и gl_FragDepth. Эти встроенные переменные для фрагментного шейдера находятся в глобальной области видимости, и шейдер может записывать в них значения сколько угодно раз - все равно используется только последнее из них.


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