0

我在 bitmapData 上绘制东西,我需要在绘制的同时不断地将每个像素淡化到 0x808080(它用于 DisplacementMapFilter)......我认为这说明了我的问题:
http ://www.ventdaval.com/lab/grey .swf

我尝试的更简单的方法是在其上绘制一个半透明的灰色框,但它永远不会达到单一颜色(即 0x808081 永远不会变成 0x808080)...... ColorMatrixFilter 试图逐步减少饱和度和/或对比度。(上面的例子是每帧应用一个对比度为 -10 的过滤器)。

我现在正在尝试paletteMap,我觉得这可能是要走的路,但我一直没能得到它......有什么想法吗?

4

3 回答 3

1

我解决了这个问题,每帧用 0xFF808080 填充纹理,然后将我的动态内容绘制到第二个透明位图,使用较低的 alpha 乘数(比如 0.98)对其进行颜色变换,然后将该位图复制到主位图与 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();
        }
于 2013-01-24T23:03:02.970 回答
1

你可以试着让它比现在淡化它稍微多一点,所以颜色会变成 0x808080,你只需要做一些计算。

是的,您可以使用paletteMap 做到这一点。第三种方法是为其编写 PixelBender 着色器。您也可以使用正常的淡入淡出并在几帧中执行一次paletteMap 或 PixelBender,以加快所有这一切。

于 2009-11-27T10:00:42.817 回答
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 );
}

第一个过滤器将每个通道值向下偏移 128 - 将基于灰色的图像变成基于黑色的图像。第二个滤波器将每个通道值乘以调制器(在我的示例中为 0.9),然后将这些值偏移 128。

于 2010-04-04T07:59:57.823 回答