Иногда вершинный шейдер может выдавать больше данных, чем нужно фраг-ментному шейдеру, и в этом нет ничего страшного, кроме возможного уменьшения производительности. Если фрагментный шейдер требует меньше данных, чем приходит из вершинного шейдера, может генерироваться предупреждение. Но все же иногда требуется использовать какой-то общий вершинный шейдер совместно с разными фрагментными шейдерами, которые могут быть специально написаны так, чтобы работать с каким-либо подмножеством выходных данных вершинного шейдера. Таким образом, для приложений, работающих с большим количеством шейдеров, может оказаться более выгодным иметь больше универсальных шейдеров и таким образом снизить цену разработки и поддержки, чем немного выиграть в производительности.
Выходные данные вершинного процессора (специальные выходные переменные, а также встроенные и определенные разработчиком varying-переменные) отправляются на следующие этапы обработки, точно такие же, как в OpenGL 1.5: сборка примитивов, отсечение усеченным конусом и пользовательское, режим многоугольников, режим затенения, отбраковка.
2.3.2. Фрагментный процессор
Фрагментный процессор - это программируемый модуль, который выполняет операции над фрагментами и другими связанными с ними данными. Фрагментный процессор может выполнять следующие стандартные графические операции:
□ операции над интерполированными значениями;
□ доступ к текстурам;
□ наложение текстур;
□ создание эффекта д ымки;
□ наложение цветов.
Этот процессор способен выполнять и множество других вычислений. Шейдеры, предназначенные для запуска на этом процессоре, называются фрагмент -ными шейдерами. Фрагментные шейдеры представляют собой алгоритмы, которые выполняются на фрагментном процессоре и производят выходные данные, основываясь на переданных им входных данных. Фрагментный шейдер не может изменить координаты х и у фрагмента. Фрагментные шейдеры, которым нужно выполнять некоторые операции из приведенного списка, должны производить все вычисления. Например, невозможно вычислять стандартным способом дымку и в то же время иметь фрагментный шейдер, который будет выполнять доступ к текстурам и наложение текстур. Фрагментный шейдер должен выполнять все три операции. Фрагментный процессор не заменяет графические операции, требующие сведений о нескольких фрагментах сразу. Чтобы поддержать параллельность на этапе обработки фрагментов, фрагментные шейдеры должны работать только с одним фрагментом, в этот момент соседние фрагменты недоступны. Реализация может иметь несколько фрагментных процессоров, работающих одновременно.
Фрагментный процессор может быть использован для выполнения операций над каждым из фрагментов, полученных в результате рендеринга точек, линий, многоугольников, пиксельных прямоугольников, растровых изображений. Если изображения сначала загружены в текстурную память, фрагментный процессор можно использовать также для обработки пикселов, в процессе которой требуется доступ и к самому пикселу, и к соседним с ним пикселам. При рисовании прямоугольника с включенным текстурированием фрагментный процессор может читать данные об изображении из текстурной памяти и накладывать их на прямоугольник, выполняя при этом обычные операции: