Создание фильтров в Adobe Pixel Bender

С Pixel Bender можно реализовать любые эффекты. Эта технология помогает в повышении производительности RIA-приложений и является незаменимым инструментом для технических дизайнеров.

Технология Pixel Bender (PB) была разработана в лаборатории Adobe для создания фильтров, предназначенных для обработки видео и изображений. Фильтры PB могут использоваться в Adobe Flash, Adobe Flex, Adobe Photoshop, Adobe After Effects. По своей сути, PB предоставляет возможность программным способом обрабатывать изображения с поддержкой аппаратного ускорения. Он хорош тем, что позволяет обработать каждый пиксел поэтапным обходом изображения.

Pixel Bender Toolkit абсолютно бесплатен, скачать его можно по ссылке labs.adobe.com/technologies/pixelbender. PBT включает в себя интегрированную среду разработки с поддержкой родного си-подобного языка и граф-языка, примеры фильтров, документацию.

Создание фильтров проходит в три этапа:

  1. Разработка алгоритма
  2. Запись алгоритма в PBT
  3. Экспорт в байт-код

Приступаем к написанию фильтров. Запускаем программу. Создаём новый фильтр (File > New Kernel Filter). В редакторе кода появляется код:

<languageVersion : 1.0;>
kernel NewFilter
 <namespace : "Your Namespace";
  vendor : "Your Vendor";
  version : 1;
  description : "your description";
 >
 {
  input image4 src;
  output pixel4 dst;
  void
  evaluatePixel ()
  {
   dst = sampleNearest(src, outCoord());
  }
}

В теге languageVersion требуется указать версию языка. В теге kernel находится описание фильтра: автор, версия, namespace разработчика, характеристики.

input image4 src; 

Данная строчка говорит о том, что входное изображение src имеет тип image4. Тип image4 имеет 4 свойства: a (прозрачность), b (синий канал), g (зелёный канал), r (красный канал).

Т.к. обработанное изображение мы будем выводить по 1-му пикселу, нам следует указать тип и название обработанного пиксела. В данном случае пиксел dst будет иметь тип pixel4.

output pixel4 dst; 

Функция evaluatePixel() будет вызываться для каждого пиксела. Если функция не будет возвращать переменные, следует указать void. Для того чтобы узнать, какой пиксел обрабатывается в данный момент, нужно использовать outCoord(), это переменная типа float2, вектор, у которого два свойства: X и Y. Функция sampleNearest(изображение, координаты); возвращает пиксел (pixel4) в координатах указанного изображения.

В строчке dst = sampleNearest(src, outCoord());, мы присваиваем пиксел, находящийся на изображении src в координатах outCoord().x, outCoord().y. После запуска фильтра (кнопка Run) мы видим, что изображение не изменилось, т.к. мы банально скопировали пикселы. Теперь попробуем изменить эту ситуацию.

Не секрет, что осветлить изображение можно путём повышения значений каналов. В функции evaluatePixel напишем:

dst += sampleNearest(src, outCoord());
dst += sampleNearest(src, outCoord());
dst += sampleNearest(src, outCoord());

Нажимаем кнопку Run и видим, что изображение стало светлее. Теперь попробуем сместить наше изображение на 10 пикселов выше и на 15 пикселов левее. Для этого в evaluatePixel пишем:

dst = sampleNearest(src, outCoord()+float2(15,10));

По правилу свизлинга, который реализован в PB, получится так:

dst = sampleNearest(src,float2(outCoord().x + 15, outCoord().y + 10);

Как вы уже догадались, ось ординат направлена вверх, ось абсцисс - влево.

Теперь попробуем заполнить пикселы в координате x меньше 50 пикселами в координате x=50;

Пишем в функции evaluatePixel:

if(outCoord().x<float(50))
{
 dst = sampleNearest(src,float2(float(50), outCoord().y));
}
else
{
 dst = sampleNearest(src, outCoord());
}

Теперь попробуем создать пучок света на изображении.

Как говорилось выше, чтобы сделать пиксел светлее, нужно увеличить значение его каналов.

Возьмём случайную координату пучка света, допустим, это будет параметр

float2 center = float2(100,100);

Придумаем размер свечения 200. Далее следует делить размер свечения на расстояние от его центра до текущего пиксела.

dst = 200/distance(outCoord(),center) * sampleNearest(src,outCoord());

Допустим, нам требуется сделать пикселы размером 5x5. Цвет этого большого пиксела будем брать из его верхнего левого угла. По мере обхода пикселов мы будем делить каждую координату на размер большого пиксела, тем самым мы узнаём, его номер в двумерном массиве (m, n). Далее нужно умножить m и n на размер большого пиксела для того, чтобы узнать координату верхнего левого угла.

float2 sc = floor(outCoord() / float2(5, 5));
sc *= 5;
dst = sampleNearest(src, sc);

Вывод: с PB можно реализовать любые эффекты. Помогает в повышении производительности RIA-приложений. Незаменимый инструмент для технических дизайнеров. Научившись обрабатывать изображения в Pixel Bender, вы сэкономите большое количество времени в будущем.

(Продолжение следует)

Сергей Flastar ГОНЧАР

Версия для печатиВерсия для печати

Номер: 

15 за 2009 год

Рубрика: 

Графика
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Marvel
Ууууу, какая чёткая статья!

Афтар - зачёд, так держать!))

Аватар пользователя Сергей Flastar Гончар
Сэнкс)