2012-08-30 4 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

실제로 16 진수 값을 rgb로 변환 해 주셔서 감사합니다. 잊어 버렸습니다! 계속 오류가 발생합니다. (줄 15) : '<': 구문 오류 구문 분석 오류입니다. 줄 15는 k2가 정의 된 줄이고 k1에서는 이상한 오류가 발생하지 않습니다. –

+0

나는 그것을 작동시켰다. 감사! :) –

2

에서는 화소 블렌더 언어가 어렵지 않다. RGBA 값 (0.0 ~ 1.0)에서 부동 소수점 숫자로되어

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

참고 : 아래의 간단한 코드는 당신이 뭘하려는 건지 수행합니다. 픽셀은 4 개의 부동 소수점 배열입니다. 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

안녕하세요, 참고할만한 많은 도움을 받았습니다. –