Пикселный процессор — это то место, где запускаются пикселные шейдеры. Они могут выполнять следующие операции:

  • Вычисление текстурных координат и цветов на пиксел
  • Применение текстуры
  • Расчет тумана
  • Вычисление нормалей, если вам нужно пикселное освещение

Вводные данные пикселного процессора — интерполированные значения, вычисленные на предыдущем этапе, такие как координаты вершин, цвета, нормали и т.д…

В вершинном шейдере эти значения вычислены для каждой вершины. Здесь мы имеем дело с пикселами внутри примитивов, отсюда потребность в интерполированных данных.

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

Пикселный процессор оперирует отдельными пикселами, то есть он не имеет представления о соседних пикселах.
Пикселный шейдер, как и вершинный, имеет доступ к OpenGL, поэтому он может получить доступ, например, к цвету дыма, установленному в OpenGL.

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

Пикселный шейдер может вернуть 2 значения:

  • Чтобы «отказатся» от пиксела, можно не вернуть ничего
  • Вычисленные либо gl_FragColor(итоговый цвет пиксела), либо gl_FragData(если работаем с несколькими пикселами)

Глубина тоже может быть рассчитана здесь, хотя это не необходимо, т.к. она уже рассчитана на предыдущей стадии.

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