0

我没有使用 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++;
        }
    }
}

这是我得到的结果:http: //fc05.deviantart.net/fs70/f/2012/243/c/6/screen_shot_2012_08_30_at_1_19_10_pm_by_johnjensen-d5d1ms3.png

4

2 回答 2

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

于 2012-08-30T11:48:23.707 回答
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 的浮点值。

于 2012-08-30T11:53:00.197 回答