float bool int pixel1 image1 float2 bool2 int2 pixel2 image2 float3 bool3 int3 pixel3 image3 float4 bool4 int4 pixel4 image4
« Мультимедиа-программирование вместе с Red 5 server. Часть 10 | Работаем в online-офисе вместе с Manymoon.com » |
Adobe Pixel Bender. Новый уровень в обработке изображений для flash
Компания adobe целенаправленно работает над превращением flash, изначально позиционировавшегося как средство быстрого создания анимации и баннеров, в платформу для создания “больших и серьезных” приложений. Так у всех на слуху такие технологии как flex и air, ориентированные, прежде всего, на создание бизнес-приложений с развитым пользовательским интерфейсом (кнопки, списки, поля и таблицы с данными). Помимо этого flex и air предлагают удобные средства общения приложения с веб-сервером и исполняющимся на нем приложением, что делает их отличным выбором для создания новых или миграции старых бизнес-приложений в веб-среду. Это все очень перспективно и можно только порадоваться за успешную деятельность adobe. Однако, акцент на flex и air вовсе не означает того, что adobe замедлила темпы развития flash как средства создания тех самых пресловутых баннеров и анимации. И эта работа не сводится к повышению удобства работы в среде flash ide, появлению новых инструментов анимации или улучшению интеграции flash cs и photoshop cs. Что более важно, adobe активировала работу над повышением быстродействия среды исполнения flash, в основном, за счет появления аппаратной поддержки рендеринга. Именно благодаря этому стал реальным быстрый прогресс 3d-движков, написанных на actionscript3. И, хотя flash 3d-движки были и раньше, но тогда они были слишком медленные и представляли в основном теоретический интерес. А теперь производительности flash player 10 хватает для того, чтобы “без тормозов” показывать настоящее 3d во flash-играх. Также adobe представила несколько интересных продуктов находящиеся на стыке flash и других языков и технологий. К примеру, проект alchemy (http://labs.adobe.com/wiki/index.php/Alchemy:FAQ) ставит целью дать возможность компилировать программы, написанных на языке “c”, в байт-код для последующего исполнения в среде flashplayer. Естественно, что поддержки “c++” нет, равно как и не все библиотеки и стандартные функции языка “c” могут быть подвергнуты такому преобразованию. Автор этой статьи не смог удержаться от того, чтобы не запустить у себя на компьютере старый добрый DOOM, адаптированный и портированный под flashplayer (http://www.newgrounds.com/portal/view/470460) – работает и очень быстро. Не меньший интерес представляет и технология Adobe Pixel Bender – тема сегодняшнего материала.Трудно найти сейчас человека имеющего хоть какое-то отношение к IT-индустрии или просто домашнего пользователя, который не слышал об шейдерах. Даже не зная в деталях, что это и как оно устроены, мы знаем что шейдеры – это что нужно для современных 3d-игрушек. И, покупая для домашнего компьютера видеокарту, мы интересуемся тем, какую версию directx и какую версию шейдеров она поддерживает. Не вдаваясь в детали, шейдеры – это написанные на достаточно высокоуровневом языке программирования небольшие программки, которые говорят, что нужно делать с изображением перед тем как его показать на экране. Так, простейшая программа-шейдер, может изменить цветовую гамму изображения, реализовать красочный эффект взрыва, тумана, отражения и “почти как настоящую” воду. В зависимости от того над каким именно объектом оперирует программа-шейдер, различаются пиксельные, вершинные, геометрические и параллаксные шейдеры. Из названия понятно, что пиксельные шейдеры принимают на вход пиксель изображения перед его выводом на экран и по какому-то правилу на основе исходного цвета пикселя, его координат и глубины рассчитывают для пикселя новый цвет. Вершинный шейдер получает на вход координаты вершин треугольников и модифицирует их. Геометрический шейдер оперирует не над отдельными вершинами, а над геометрическими примитивами (треугольниками) и , в том числе, умеет создавать для этих примитивов новые вершины. Параллаксные шейдеры служат для реализации эффекта параллакса, когда изображение объекта меняется в зависимости от его расстояния до наблюдателя и расположения точки зрения. Именно на эффекте параллакса основано объемное (бинокулярное) зрение у человека. Когда-то на заре появления шейдеров в видеокарте существовали отдельные блоки, рассчитывающие шейдеры только определенных видов. Сейчас же используется унифицированная архитектура, когда один шейдерный блок видеокарты может просчитать любой вид шейдера. Теперь можно подвести важный итог: шейдеры позволяют написать небольшую программу, которая будет очень быстро выполняться на видеокарте (GPU). И происходит это за счет того, что шейдеры предполагают массированные однотипные вычисления. И это будет гораздо эффективнее, чем считать такие же эффекты на процессоре (пусть и более универсальном, но проигрывающем по скорости, если нужно просчитать большое число несложных и однотипных алгоритмов). С помощью шейдеров можно создавать красочные и фотореалистичные изображения, применяя к картинке различные эффекты. Поэтому появление поддержки шейдеров во flash можно только приветствовать, что и произошло с выпуском flash player 10. Причем сделано это было с “умной” аппаратной поддержкой, когда шейдер выполняется или на GPU или на CPU в зависимости от возможностей вашего компьютера, в том числе с поддержкой многоядерных процессоров.
Итак, Adobe Pixel Bender – это язык и технология для написания шейдерных программ и является, в какой-то мере, наследником другого известного “графического” языка программирования, а именно GLSL (OpenGL Shading Language). Созданные вами шейдерные программы могут быть внедрены или в Adobe Photoshop или Adobe After Effects, для последующего их применения к изображению как фильтр. Еще можно загрузить шейдер в flash-приложение (тот же баннер) и применить шейдерный эффект на тамошнюю картинку. Для удобной разработки этих самых шейдерных программ компания Adobe создала интегрированную среду разработки Adobe pixel bender toolkit. Конечно, не стоит рассчитывать на то, что flashplayer (pixel bender) умеет работать со всеми четырьмя видами шейдеров. Так в нашем распоряжении есть только самые простые “плоские” шейдеры – пиксельные, но и с их помощью можно много добиться (примеры можно посмотреть на сайтах http://www.adobe.com/cfusion/exchange/index.cfm?event=productHome&exc=26) или http://mrdoob.com/blog/post/586.
Теперь нужно разобраться с базовой терминологией pixel bender, т.е. я расскажу о том, что такое Kernel и Processing Graph. Воспринимайте Kernel как обычную функцию, получающую на вход один или несколько пикселей с одного или нескольких входных изображений, и затем выполняющую над этими пикселями какой-то расчет. В конце Kernel возвращает пиксель, который и нужно отрисовать на экране. Однако для создания по настоящему сложных эффектов этого не достаточно – гораздо лучше написать несколько kernel-программ, а затем объединить их в единое целое. Т.е. описать, как результаты работы одних Kernel-ов поступят как входные данные для других Kernel-ов, создав, таким образом, граф обработки изображения. В сегодняшней статье я не собираюсь углубляться в детали kernel-языка, равно как и в детали языка описания Processing Graph. Вся эта информация очень подробно изложена в справочной документации идущей вместе с Pixel Bender Toolkit.
Теперь перейдем к практике, и попробуем сделать своими руками небольшой эффект накладываемый на загруженную во flash-картинку. Для начала Pixel Bender Toolkit нужно скачать по следующей ссылке http://labs.adobe.com/technologies/pixelbender/ (продукт полностью бесплатен).
Программа для Pixel Bender сохраняется как файл с расширением “pbk”, затем эти файлы могут быть либо непосредственно загружены в среду Adobe Photoshop CS или Adobe After Effects CS. Либо вы можете выполнить компиляцию kernel-программы в файл “pbj”, который может быть загружен и выполнен средой исполнения flashplayer. Тут есть важный момент: если мы создаем приложение именно для выполнения в среде flashplayer, то нам будет доступна не вся функциональность языка Pixel Bender Kernel. А также будет полностью отсутствовать поддержка языка Graph Language (подробный перечень этих ограничений также можно найти в справке идущей вместе Pixel Bender Toolkit). Теперь я приведу заготовки программы на Pixel Bender Kernel. Эту заготовку вы можете получить в любой момент времени, если выберите пункт меню “File -> New Kernel”:
<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());
}
}
float4 vec4; float4 red=vec4.rrrr float3 rgb_only=vec4.rgb
returnType name([arguments]){
statements
}
dst = sampleNearest(src, outCoord());
pixel4 sample( image4 im, float2 v )
pixel4 sampleLinear( image4 im, float2 v )
pixel4 sampleNearest( image4 im, float2 v )
void evaluatePixel(){
dst = pixel4(0,0,1,1);
}
void evaluatePixel(){
if (outCoord().x < 200.0 && outCoord().y < 200.0)
dst = sampleNearest(src,outCoord());
else
dst = pixel4(1,0,0,1);
}
оперирует над двумя изображениями одновременно. Для того, чтобы его проверить, вам нужно выбрать в меню “File” пункт “Load Image 2”:
input image4 src1; input image4 src2; output pixel4 dst; void evaluatePixel(){ if (outCoord().x < 300.0 && outCoord().y < 300.0) dst = sampleNearest(src1,outCoord()); else dst = sampleNearest(src2,outCoord()); }
dst = 2.0*sampleNearest(src1,outCoord());
// или наоборот сделать его более темным:
dst = sampleNearest(src1,outCoord()) / 2.0;
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.filters.*;
[SWF(width="600", height="400", backgroundColor="#aa0000", framerate="30")]
public class Main extends Sprite {
[Embed(source='/lisa.png')]
private var fotoClass:Class;
private var fotoImage:Bitmap = new fotoClass ()
private var urlLoader:URLLoader = null;
public function Main():void {
addChild (fotoImage);
var urlRequest: URLRequest = new URLRequest("shader.pbj");
urlLoader= new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener( Event.COMPLETE, applyFilter );
urlLoader.load( urlRequest );
}
private function applyFilter( event:Event ):void{
urlLoader.removeEventListener( Event.COMPLETE, applyFilter );
var shader:Shader = new Shader( event.target.data );
var shaderFilter:ShaderFilter = new ShaderFilter( shader );
fotoImage.filters = [ shaderFilter ];
}
}
}
Как видите, здесь нет ничего сложного: для того, чтобы присоединить шейдер к любому “видимому” компоненту нужно поместить его внутрь свойства filters. Естественно, что перед этим необходимо загрузить файл с шейдером (за это отвечают классы URLRequest и URL), а затем нужно сконструировать объект Shader на основании загруженного из файла массива байтов. Более того, мы можем применить шейдер не только к статическому изображению, но и видео-файлу, показываемому с помощью компонента Video, ведь и у компонента Video есть свойство filters.
Сегодняшняя статья не ставит своей целью детально рассказывать о языке Pixel Bender Kernel, также я не хочу приводить большое число различных шейдерных программ. Главной своей целью я считаю кратно познакомить как можно более широкое число читателей с перспективной технологией, которую уже можно и нужно использовать прямо сейчас.
« Мультимедиа-программирование вместе с Red 5 server. Часть 10 | Работаем в online-офисе вместе с Manymoon.com » |