FP10をターゲットにしていて、ColorTransformで試したような単純なフィルターが必要な場合は、PixelBlenderカーネルを作成して、2つの色の引数(1つはソース用、もう1つは宛先用)を取り、ピクセルをソースカラーと一致させることができます。そしてそれらを目的地と交換します。このようなもの:
//I release this under the MIT License. Use it to your heart's content.
<languageVersion : 1.0;>
kernel ReplaceColor
< namespace : "PIPEEP";
vendor : "PiPeep";
version : 1;
description : "Replace color";
>
{
input image4 src;
output pixel4 dst;
parameter pixel4 sColor
<
minValue:pixel4(0.);
maxValue:pixel4(255.);
>;
parameter pixel4 dColor;
parameter float tolerance;
void
evaluatePixel()
{
dst = sampleNearest(src,outCoord());
pixel4 sColorAdjusted = abs((sColor/pixel4(255.)) - dst);
if(sColorAdjusted.r < tolerance && sColorAdjusted.g < tolerance && sColorAdjusted.b < tolerance && sColorAdjusted.a < tolerance) {
dst = dColor;
}
}
}
彼がPixelBlenderIDEを嫌う理由を覚えています
編集:これはアンチエイリアシングではうまく機能しないことを覚えておいてください。ただし、stage.quality = "low"を使用している場合は、問題ありません。
as3での使用を追加するには、これを試してください(http://scriptplayground.com/tutorials/as/Flash-CS4-and-Pixel-Bender-Overview/から盗まれたため、数行のコードを変更する必要があります)。
コードの最初の部分は、後で使用するいくつかの変数を定義しています。新しく見える可能性があるのは、ShaderとShaderFilterの2つだけです。これらはFlashPlayer10の新機能であり、ピクセルベンダーフィルターデータの処理を担当するクラスです。
var loader:URLLoader;
var shader:Shader;
var shaderFilter:ShaderFilter;
var image:MovieClip;
var timer:Timer;
var timerInt:uint = 40;
コードの次のステップは、前のステップで追加した画像をステージにロードすることです。
image = new SampleImage(); image.y =
20; image.x = 25;
addChild(image);
作成される最初の2つの方法は、pbjファイルをロードし、フィルター作成プロセスを初期化するためのものです。
function startEffect() { loader = new
URLLoader(); loader.dataFormat =
URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE,
loadComplete); loader.load(new
URLRequest("sample.pbj")); }
function loadComplete(e:Event):void {
shader = new Shader(loader.data);
initFilter(); }
initFilter()
pbjファイルが正常にロードされると次の関数が呼び出されるため、フィルターを作成できます。このフィルターは、画像のr、g、bカラー値を設定します。これにより、基本的に画像の細部が吹き飛ばされます。たとえば、「shader.data.red.value
」は、コードに赤のレベルを設定するためのfloat変数である「parameterfloat red」があることに気付いた場合、最初に記述されたピクセルベンダーコードを参照しています。この場合、値は20に設定されています。このプロセスは他の2色に対して繰り返され、その後、画像インスタンスに渡されます。
この関数の最後の部分は、画像が通常の外観に戻るまでこのフィルターを適用するために実行されるタイマーを設定します
function initFilter() {
shader.data.red.value = [20];
shader.data.green.value = [20];
shader.data.blue.value = [20];
shaderFilter = new
ShaderFilter(shader); image.filters =
[shaderFilter];
timer = new Timer(timerInt, 0);
timer.addEventListener(TimerEvent.TIMER,
timerHit); timer.start(); }
最後の関数は、フィルターを適用するプロセスを繰り返しますが、最初に現在のフィルター値を取得し、各パスの値から0.1を減算します。このプロセスは、画像が完全になくなるまで、画像からフィルター強度をゆっくりと取り除きます。このtimerHit()
関数は、関数で作成されたタイマーから呼び出されinitFilter()
ます。
function timerHit(e:TimerEvent):void
{
if(shader.data.red.value == 1)
{
timer.stop();
return;
}
var r:uint = shader.data.red.value - 0.1;
var g:uint = shader.data.green.value - 0.1;
var b:uint = shader.data.blue.value - 0.1;
shader.data.red.value = [r];
shader.data.green.value = [g];
shader.data.blue.value = [b];
shaderFilter = new ShaderFilter(shader);
image.filters = [shaderFilter];
}
コードの最後のステップは、プロセスを開始することです。このアプリケーションでは、startEffect()
関数を呼び出すことによって実行されます。これを実行します。
startEffect();
目を出血させてすみません!それが私の最長の答えだと思います!