Первая версия реализации языка шейдеров OpenGL выполняла в основном трехмерный рендеринг. Дополнительные возможности обработки изображений планируются в следующей версии. Однако и в существующей версии уже есть некоторые операции обработки изображения, которые можно использовать в шейдерах.

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

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

Во фрагментном шейдере можно обрабатывать как фрагменты, созданные gl Bitmap или gl DrawPi xel s, так и значения, полученные из текстурной карты. Операции работы с изображением можно разделить на две основные категории: один пиксел за раз и несколько пикселов за раз. Операции, относящиеся к первой категории, можно реализовать во фрагментном шейдере на языке шейдеров OpenGL довольно просто. Из varying-переменной gl_Co1or шейдер получает цвет фрагментов, созданных gl Bitmap или gl DrawPi xel s. Операции первой категории тоже можно выполнять, но для этого сначала нужно сохранить изображение в текстурной памяти, к которой затем выполняется несколько обращений из шейдера.

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

6.1. Геометрические преобразования зображения

В стандартном OpenGL определена только одна операция над геометрическими размерами изображения: пиксельное масштабирование. Эта операция масштабирует изображение перед отображением на экране.

Для того чтобы повернуть изображение, предлагалось загрузить его в текстурную память, наложить как текстуру на прямоугольник и затем поворачивать прямоугольник. Эти операции требуют обращения к текстурному модулю, но все равно скорость работы на современном оборудовании для большинства приложений является приемлемой. На языке шейдеров OpenGL даже можно задавать одни и те же координаты прямоугольника при рисовании изображения, чтобы вершинный шейдер выполнял масштабирование, преобразование, поворот прямоугольника. Деформировать изображение можно, накладывая его на многоугольник сложной формы вместо простого прямоугольника. Аппаратная поддержка этих операций позволяет получать высококачественные результаты.


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