piątek, 23 maja 2008

Adobe Flex 4 i Pixel Bender

Aby programować pod Flash Player 10 trzeba ściągnąć najnowszą wersję Flex 4 SDK
Rozpakowujemy to archiwum do katalogu D:\Flex4\. Następnie dodajemy do zmiennej środowiskowej PATH ścieżkę D:\Flex4\bin\ gdzie mamy kompilator mxmlc.exe.
Trzeba jeszcze sprawdzić w pliku D:\flex4\frameworks\flex-config.xml czy mamy dobrze ustawione parametry do kompilacji pod Flash Player 10. Trzeba tylko do kompilacji używać takiego zapisu:

mxmlc.exe --target-player=10 PixelBender.as


Są 2 sposoby pisania kodu pod dla bajtkodu Pixel Bender. Pierwszy z nich polega na pobraniu czy wysłaniu pliku *.pbj do pliku SWF, a drugi polega na osadzeniu pliku *.pbj w pliku SWF

Zaczniemy od drugiego sposobu. Załadujemy grafikę i jak bajtkod shadera w plik SWF.

Oto kod shadera sepia3.pbk

<languageVersion: 1.0;>
kernel sepia
< namespace : "AIF";
vendor : "Adobe Systems";
version : 2;
description : "a variable sepia filter"; >
{

input image4 src;
output float4 dst;
void
evaluatePixel()
{
float4 rgbaColor;
float4 yiqaColor;
float4x4 YIQMatrix = float4x4(
0.299, 0.596, 0.212, 0.000,
0.587, -0.275, -0.523, 0.000,
0.114, -0.321, 0.311, 0.000,
0.000, 0.000, 0.000, 1.000
);
float4x4 inverseYIQ = float4x4(
1.0, 1.0, 1.0, 0.0,
0.956, -0.272, -1.10, 0.0,
0.621, -0.647, 1.70, 0.0,
0.0, 0.0, 0.0, 1.0
);

rgbaColor = sampleNearest(src, outCoord());
yiqaColor = YIQMatrix * rgbaColor;
yiqaColor.y = 0.2;
yiqaColor.z = 0.0;
dst = inverseYIQ * yiqaColor;
}
}


Po kompilacji mamy w postaci bajtkodu plik sepia2.pbj. Pozostaje tylko napisać kod ActionScriptu 3 w pliku Osadzony.as.


package {
import flash.display.Bitmap;
import flash.display.Shader;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.ShaderFilter;

[SWF(width="550",height="400",frameRate="24")]

public class Osadzony extends Sprite
{

[Embed(source="rose.jpg")]
private var Obraz:Class;

[Embed(source="sepia2.pbj", mimeType="application/octet-stream")]
private var Sepia:Class;

private var img:Bitmap;
private var shader:Shader;
private var filter:ShaderFilter;

public function Osadzony(){

img = new Obraz() as Bitmap;
img.x = stage.stageWidth/2 - img.width/2;
img.y = stage.stageHeight/2 - img.height/2;
addChild(img);

shader = new Shader(new Sepia());
filter = new ShaderFilter(shader);
img.filters = [filter];

}
}
}

Teraz napiszemy kod w pliku LoadedShader.as do sytuacji w której załadujemy lokalnie plik bajtkodu z Pixel Binder.


package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.filters.*;
import flash.utils.*;
[SWF(width="550",height="400",frameRate="24")]
public class LoadedShader extends Sprite
{
[Embed(source="rose.jpg")]
private var Obraz:Class;
private var fr:FileReference;
private var shader:Shader;
private var shaderFilter:ShaderFilter;
private var loader:Loader;
private var img:Bitmap;

public function LoadedShader():void
{
fr = new FileReference();
fr.addEventListener(Event.SELECT, onSelect);
fr.addEventListener(Event.COMPLETE, onComplete);
var spr:Sprite = new Sprite();
addChild(spr);
img = new Obraz() as Bitmap;
img.x = stage.stageWidth/2 - img.width/2;
img.y = stage.stageHeight/2 - img.height/2;
spr.addChild(img);
spr.addEventListener(MouseEvent.CLICK, loaderClick);
}

private function loaderClick(e:Event):void
{
fr.browse();
}

private function onSelect(e:Event):void
{
fr.load();
}

private function onComplete(e:Event):void
{
shader = new Shader(fr.data);
shaderFilter = new ShaderFilter();
shaderFilter.shader = shader;
img.filters = [shaderFilter];
}
}
}
Jest jeszcze inny "sposób", który pokazuje jak plik shadera i grafikę załadować z zewnątrz (do testowania na serwerze). W pliku OuterPixelBender.as mamy taki kod ActionScript


package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.filters.*;
import flash.utils.*;

public class OuterPixelBender extends Sprite
{

private var shader:Shader;
private var shaderFilter:ShaderFilter;
private var loader:Loader;

public function OuterPixelBender():void
{
var shaderLoader:URLLoader = new URLLoader();
shaderLoader.dataFormat = URLLoaderDataFormat.BINARY;
shaderLoader.addEventListener(Event.COMPLETE, shaderLoaded);
shaderLoader.load(new URLRequest("sepia2.pbj"));
loader = new Loader();
loader.load(new URLRequest("rose.jpg"));
addChild(loader);

}

private function shaderLoaded(e:Event):void
{
var shaderLoader:URLLoader = e.target as URLLoader;
try
{
shader = new Shader();
shader.byteCode = shaderLoader.data;
shaderFilter = new ShaderFilter();
shaderFilter.shader = shader;
loader.filters = [shaderFilter];

}catch (e:Error)
{
throw(e);
}
}
}
}


A tak na marginesie to zauważyłem, że mało kto pisze że, można już używać Adobe Flex 4 SDK i stąd taki przewrotny tytuł posta.

Brak komentarzy: