我对Pixel Bender没有经验,并且着色语言对我来说似乎是胡言乱语,所以我想知道是否有人可以帮我重写以下as3代码以充当Pixel Bender过滤器/着色器。它的工作方式是我想将16777215种颜色转换成我在调色板阵列中定义的4种色调(首先是最亮的颜色,最后是最暗的颜色)。结果令人满意,但性能不好,这就是我想制作过滤器的原因。这是代码:( sbitmap是我库中的图像)
var display:Bitmap = new Bitmap(new sbitmap());
var palette:Vector.<uint> = new <uint>[0x485B61, 0x4B8E74, 0xA6E76D, 0xD1FE85];
var data:BitmapData = display.bitmapData;
addChild(display);
const inc:int = int(0xFFFFFF/4)+1;
for(var i:int = 0; i < data.height; i++)
{
for(var j:int = 0; j < data.width; j++)
{
var color:uint = data.getPixel(j, i);
var pIndex:int = 0;
for(var k:int = 0; k < 0xFFFFFF; k += inc)
{
if(color >= k && color < k + inc)
{
data.setPixel(j, i, palette[pIndex]);
break;
}
pIndex++;
}
}
}
答案 0 :(得分:2)
Pixel Blender语言并不那么难。下面非常简单的代码完成了您要做的事情:
<languageVersion : 1.0;>
kernel untitled
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
>
{
input image4 src;
output pixel4 dst;
void
evaluatePixel()
{
float4 px = sampleNearest(src,outCoord());
dst = px;
if(px.r < 0.25) {
dst = float4(0.25, 0.25, 0.25, 1.0);
} else if(px.r < 0.5) {
dst = float4(0.5, 0.5, 0.5, 1.0);
} else if(px.r < 0.75) {
dst = float4(0.75, 0.75, 0.75, 1.0);
} else {
dst = float4(1.0, 1.0, 1.0, 1.0);
}
}
}
请注意,RGBA值是浮点数(0.0到1.0)。像素是四个浮点数的数组。您可以将px [0],px [1],px [2],px [3]写为px.r,px.g,px.b,px.a。
有关详细信息,请参阅Pixel Blender参考: http://www.adobe.com/content/dam/Adobe/en/devnet/pixelbender/pdfs/pixelbender_reference.pdf
答案 1 :(得分:2)
<languageVersion : 1.0;>
kernel test
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
>
{
input image4 src;
output pixel4 dst;
void
evaluatePixel()
{
pixel4 k1=pixel4(0.282,0.71,0.38,1);
pixel4 k2=pixel4(0.294,0.557,0.455,1);
pixel4 k3=pixel4(0.65,0.91,0.475,1);
pixel4 k4=pixel4(0.82,0.99,0.52,1);
pixel4 s;
s = sampleNearest(src,outCoord());
if (s.r<0.25) dst=k1; else
if (s.r<0.5) dst=k2; else
if (s.r<0.75) dst=k3; else dst=k4;
}
}
捕捉。您使用的算法仅基于红色分量,因此过滤器仅检查“.r”表示基于1的浮点值。