2012-08-30 64 views
0

我对Pixel Bender没有经验,并且着色语言对我来说看起来像是胡言乱语,所以我想知道是否有人可以帮我重写下面的as3代码来作为Pixel Bender滤镜/着色器。它的工作方式是,我想将16777215种颜色转换为我在调色板阵列中定义的4种色调(最浅的颜色,最暗的颜色)。结果是令人满意的,但表现很差,这就是为什么我要制作一个过滤器。下面的代码:(sbitmap是在我的库中的图像)像素弯曲器4色着色器

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

回答

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; 
} 
} 

捕捉。您使用的算法仅基于红色分量,因此过滤器仅针对基于1的浮点值检查“.r”。

+0

感谢您将我的十六进制值转换为rgb,我忘了!我不断收到一个错误:(第15行):'<':语法错误解析错误,第15行是k2被定义的行,奇怪的是错误不会发生在k1上。 –

+0

我得到它的工作。谢谢! :) –

2

像素搅拌机语言并不难。下面的非常简单的代码来完成你想要做什么:

<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.

详情请参见该像素混合器参考: http://www.adobe.com/content/dam/Adobe/en/devnet/pixelbender/pdfs/pixelbender_reference.pdf

+0

嘿,非常感谢您的参考! –