This is how my filter effect class looks like now:
package hcmair.starling.effects
{
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import hcmair.utils.ColorUtils;
import starling.rendering.FilterEffect;
import starling.rendering.Program;
public class ColorMaskEffect extends FilterEffect
{
private var _maskColor:uint;
private var _offsets:Vector.<Number>;
public function ColorMaskEffect()
{
_offsets = new Vector.<Number>(4, true);
}
override protected function createProgram():Program
{
var vertexShader:String = STD_VERTEX_SHADER;
var fragmentShader:String =
"tex ft0, v0, fs0 <2d, linear> \n" + // read the pixel
"sub ft1, ft0, ft0 \n" + // fill ft1 with zero
"slt ft0.w, ft1.w, ft0.w \n" + // set the alpha to 1 if greater than zero
"mul oc, fc1, ft0.wwww" // multiply by fc1 to get the final pixel
return Program.fromSource(vertexShader, fragmentShader);
}
override protected function beforeDraw(context:Context3D):void
{
context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 1, _offsets);
super.beforeDraw(context);
}
public function get maskColor():uint { return _maskColor; }
public function set maskColor(value:uint):void
{
_maskColor = value;
_offsets[0] = ColorUtils.red(value);
_offsets[1] = ColorUtils.green(value);
_offsets[2] = ColorUtils.blue(value);
_offsets[3] = 1;
}
}
}