0

나는이 BitmapData에 물건을 그리기있어 여전히 (그것을 DisplacementMapFilter에 대한) 그리는 동안 나는 ... 계속 0x808080에 모든 픽셀을 페이드 내가 생각 필요이 내 문제를 보여 나는 그 위에 반투명의 회색 박스를 그려 보려고했으나 결코 하나의 색상에 도달하지 못했다 (즉, 0x808081는 절대로 0x808080로 바뀌지 않을 것이다) ... ColorMatrixFilter가 같은 점을 가지고 점차적으로 채도를 줄이거 나/또는 대조. (위의 예는 매 프레임마다 -10 명암의 필터 적용).BitmapData를 특정 색상으로 연속해서 페이드하는 방법은 무엇입니까? <br/> <a href="http://www.ventdaval.com/lab/grey.swf" rel="nofollow noreferrer">http://www.ventdaval.com/lab/grey.swf</a></p> <p>더 단순한 방법 :

저는 팔레트 맵을 사용하려고합니다.이 방법이 될 수 있다는 것을 느끼고 있습니다. 그러나 그것을 얻을 수 없었습니다 ... 어떤 아이디어입니까?

답변

1

이제 페이드 아웃하는 것보다 약간 더 페이드를 시도 할 수 있습니다. 따라서 색상이 0x808080이되므로 약간의 계산 만하면됩니다.

예, 팔레트 맵을 사용하여이 작업을 수행 할 수 있습니다. 세 번째 방법은 PixelBender 셰이더를 작성하는 것입니다. 또한 일반적인 페이딩을 사용하고 몇 프레임에서 paletteMap 또는 PixelBender를 한 번씩 수행하여이 모든 작업의 ​​속도를 높일 수 있습니다.

+0

해답을 주셔서 감사합니다. 그러나 계산 결과에 따르면 0x808080 픽셀을 0x808080에 만들려면 50 % 이상 희미 해져야한다고 말해줍니다. 병합을 사용하고 알파 채널로 놀았는데 어떤 종류의 효과가 있었지만 완벽하지 못했으며 PixelBender 또는 paletteMap으로 계속 시도 할 시간이 없었습니다. 정확하게 사용하는 경우 ... 좋은 참조가 있다면 큰 것입니다 :) – Cay

+0

정확 하 게. 원하는 경우 50 % 이상 페이드해야합니다 (원하는 경우 페이드가 적음). http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/BitmapData.html#paletteMap() - 내가 사용하는 유일한 참조는이 태그입니다. – stroncium

1

이렇게하는 가장 쉬운 방법은 두 개의 연속적인 컬러 필터를 사용하는 것입니다. 즉 :

var n:Number = 0.9; 
var off:Number = 0x80; 
var filter:ColorMatrixFilter = new ColorMatrixFilter([ 
     1, 0, 0, 0, -off, 
     0, 1, 0, 0, -off, 
     0, 0, 1, 0, -off, 
     0, 0, 0, 1, -off ]); 
var filter2:ColorMatrixFilter = new ColorMatrixFilter([ 
     n, 0, 0, 0, off, 
     0, n, 0, 0, off, 
     0, 0, n, 0, off, 
     0, 0, 0, n, off ]); 

function onFrame(e:Event) { 
    myBMD.applyFilter(myBMD, myBMD.rect, new Point(), filter); 
    myBMD.applyFilter(myBMD, myBMD.rect, new Point(), filter2); 
} 

제 1 필터 128가 아래쪽으로 각 채널의 값을 상쇄 - 블랙 기반의 이미지로 회색 기반 이미지를 선회. 두 번째 필터는 각 채널 값에 모듈레이터를 곱한 다음 (예 : 0.9) 값을 128만큼 상쇄합니다.

+1

덧붙여 말하면, 나는 빠른 테스트를했는데 이것은 어떤 반올림 문제도없는 것처럼 보였다. 그것이 당신을 위해한다면, 당신은 항상 첫 번째 필터에서 두 번째보다 약간 큰 오프셋을 사용할 수 있습니다. 그러면 모든 값이 정확히 0x80로 수렴되어야합니다. – fenomas

+0

나쁜 생각은 아니지만 같은 문제가 발생합니다. 코드에 다음을 추가하십시오. var myBMD : BitmapData = new BitmapData (2,2, false, 0); myBMD.noise (2); for (var i : uint = 0; i <30; i ++) { \t trace (myBMD.getPixel (1,1) .toString (16)); \t onFrame (null); } 마침내 808080에 도달하도록 변경해야 할 때 마지막 10 개의 값이 동일한 방법 (848084)에 유의하십시오. 무슨 뜻인지 확인해보십시오. : S – Cay

+0

Cay : 당신의 의견을 읽으십시오. 즉, 첫 번째 필터에서 "off"를 "off-1"로 변경하십시오. – fenomas

1

모든 프레임마다 텍스처를 0xFF808080으로 채우고이를 동적으로 두 번째, 투명 비트 맵으로 낮은 알파 배율 (예 : 0.98)로 colortransform을 수행 한 다음 mergealpha를 사용하여 비트 맵을 주 비트 맵에 복사합니다. 대우를받습니다 :

public function update():void 
     { 
      lock(); 
      fillRect(rect, 0xFF808080); 

      drawTarget.lock(); 
      drawTarget.colorTransform(rect, fadeTransform); 
      drawTarget.applyFilter(drawTarget, rect, pt, blurFilter); 
      drawTarget.unlock(); 

      copyPixels(drawTarget, rect, pt, null, null, true); 
      unlock(); 
     }