sobota, 24 maja 2008

Blending Mode

Ponieważ japońscy programiści zajmują się ustalaniem jak można przerzucić obliczenia na shadery i wykorzystać ShaderJob do symulowania wielowątkowej pracy. To chciałbym pokazać kolejne możliwości Pixel Bender. Taka możliwością jest stosowanie trybów mieszania.

W Pixel Bender Toolkit jest kod shadera crossfade.pbk

<languageVersion : 1.0;>
kernel Crossfade
< namespace : "AIF";
vendor : "Adobe Systems";
version : 2;
description : "Crossfade between two images"; >
{

parameter float intensity;
input image4 frontImage;
input image4 backImage;
output pixel4 dst;
void evaluatePixel()
{
float4 frontPixel = sampleNearest(frontImage, outCoord());
float4 backPixel = sampleNearest(backImage, outCoord());
dst = mix(frontPixel, backPixel, intensity);
}
}
Funkcję mix można przedstawić jako odpowiednik takiego działania:
dst = (1.0 - intensity) * frontPixel + intensity * backPixel

A jaki napisać kod ActionScript 3 do obsługi trybów mieszania z bajtkodu crossfade.pbj?
Na przykład taki kod ActionScript 3 jak ten w pliku Crossfade.as

package{
import flash.display.MovieClip;
import flash.display.Shader;
import flash.events.Event;
import mx.core.BitmapAsset;
import flash.display.StageScaleMode;
[SWF(width="500", height="500")]
public class Crossfade extends MovieClip{

[Embed(source = 'front.jpg')]
[Bindable]
private var _frontImage:Class;

[Embed(source = 'back.jpg')]
[Bindable]
private var _backImage:Class;

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

private var _shader:Shader;
private var _frontAsset:BitmapAsset;
private var _backAsset:BitmapAsset;


public function Crossfade()
{
super();
_frontAsset = new _frontImage() as BitmapAsset;
_backAsset = new _backImage() as BitmapAsset;
stage.scaleMode = StageScaleMode.NO_SCALE;

_shader = new Shader(new CrossShader());
_shader.data.frontImage.input = _frontAsset.bitmapData;
_shader.data.backImage.input = _backAsset.bitmapData;
_shader.data.intensity.value = [0.72];
addEventListener(Event.ENTER_FRAME, drawShader);
}


private function drawShader(e:Event):void
{
graphics.clear();
graphics.beginShaderFill(_shader);
graphics.drawRect(0, 0, 500, 500);
graphics.endFill();
}
}
}


Jak widać możliwości są całkiem spore.

Brak komentarzy: