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: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);
}
}
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:
Prześlij komentarz