}
16.6.15. Сложение
В этом режиме происходит сложение исходного и вспомогательного изображений. Так как в результате может получиться значение, большее 1,0, происходит отсечение. Если изображения поменять местами, результат не изменится:
result = blend + base:
16.6.16. Вычитание
В этом режиме вспомогательное изображение вычитается из основного. Если значение получается меньше 0, происходит отсечение: result = base - blend:
16.6.17. Разность
Результат применения этого режима - абсолютное значение разности между Ы end и base. Черный цвет результата означает, что изначальные значения одинаковы, а белый цвет - что они противоположны. Еще один вариант использования этого режима - сравнение изображений, так как полная их идентичность даст полностью черный цвет. А совершенно белое вспомогательное изображение может использоваться для инвертирования исходного изображения. Этот режим является коммутативным:
result = abs(Ыend - base);
16.6.18. Инверсная разность
В этом режиме выполняется операция, обратная разности. Белое и черное значения blend дают те же значения, что и для режима разности (белый цвет инвертирует, а черный не влияет на результат), но цвета между белым и черным становятся светлее, а не темнее. Эта операция является коммутативной:
result = white - abs(white - base - blend):
16.6.19. Исключение
Этот режим похож на разность, но результат получается более мягким, немного менее контрастным. Это нечто среднее между разностью и инверсной разностью. Этот режим также является коммутативным:
result = base + blend - (2.0 * base * blend);
16.6.20. Прозрачность
Значение прозрачности в диапазоне [0, 1] также можно использовать для определения участия основного изображения в формировании результата. Значение result из любой приведенной ранее формулы можно впоследствии изменить таким образом:
finalColor = mix(base. result, opacity):
16.7. Свертка Свёртка - это общая операция обработки изображения, которая может использоваться для фильтрации изображения. Это происходит с помощью вычисления суммы исходного изображения и меньшего изображения, называемого ядром свёртки или свёрточным фильтром. В зависимости от выбора значений в ядре операция свертки может выполнять размывку, увеличение резкости, уменьшение шума, выделение краев и другие полезные операции.
Набор функций для работы с изображениями в OpenGL 1.5 включает в себя функции для свёртки, но реализация этой функциональности всегда ограничивает размер ядра (обычно это 3 х 3) и точность промежуточных операций. Гибкость языка шейдеров OpenGL позволяет задавать ядро практически любого размера и точность, соответствующую операциям над числами с плавающей запятой. Более того, операция свёртки может быть написана в шейдере OpenGL таким образом, чтобы выполнялось минимальное количество умножений (например, нулевые значения ядра вообще исключаются из вычислений).
Здесь, однако, есть несколько препятствий. Эта операция кажется обычной для реализации во фрагментном шейдере, но фрагментный шейдер не может получать данные о соседних фрагментах. Решением проблемы может быть сохранение основного изображения в текстурной памяти и обращение из фрагментного шейдера к текстуре. Чтобы хорошо выполнить рендеринг изображения, можно взять основное изображение в виде прямоугольника, размер которого равен размеру экрана, и включить текстурирование. В этом процессе вполне может участвовать фрагментный шейдер, и в этом случае можно получить доступ к любому значению ядра и вычислять результат для каждого пиксела.