Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何将位图数据连续淡入特定颜色?_Actionscript 3_Colors_Bitmapdata_Colormatrix_Color Palette - Fatal编程技术网

Actionscript 3 如何将位图数据连续淡入特定颜色?

Actionscript 3 如何将位图数据连续淡入特定颜色?,actionscript-3,colors,bitmapdata,colormatrix,color-palette,Actionscript 3,Colors,Bitmapdata,Colormatrix,Color Palette,我在bitmapData上绘制东西,我需要在仍然绘制的同时将每个像素持续淡入0x8080(它用于置换贴图过滤器)。。。 我想这说明了我的问题: 我尝试过的更简单的方法是在其上绘制一个半透明的灰色框,但它永远不会达到单一颜色(即0x808081永远不会变成0x808080)。。。同样的情况也发生在ColorMatrixFilter试图逐渐降低饱和度和/或对比度的情况下。(上面的示例是应用每帧对比度为-10的过滤器) 我现在正在尝试paletteMap,我感觉这可能是一种方式,但我一直无法得到它。

我在bitmapData上绘制东西,我需要在仍然绘制的同时将每个像素持续淡入0x8080(它用于置换贴图过滤器)。。。 我想这说明了我的问题:

我尝试过的更简单的方法是在其上绘制一个半透明的灰色框,但它永远不会达到单一颜色(即0x808081永远不会变成0x808080)。。。同样的情况也发生在ColorMatrixFilter试图逐渐降低饱和度和/或对比度的情况下。(上面的示例是应用每帧对比度为-10的过滤器)


我现在正在尝试paletteMap,我感觉这可能是一种方式,但我一直无法得到它。。。有什么想法吗?

你可以试着比现在稍微淡一点,所以颜色将变为0x8080,你只需要做一些计算

是的,您可以使用paletteMap执行此操作。 第三种方法是为其编写PixelBender着色器。
你也可以使用正常的淡入淡出,每隔几帧做一次paletteMap或PixelBender,以加速这一切。

你可以尝试比现在淡入淡出的颜色稍微淡出一些,因此颜色将变为0x8080,你只需要做一些计算

是的,您可以使用paletteMap执行此操作。 第三种方法是为其编写PixelBender着色器。
你也可以使用正常的淡入度,每隔几帧做一次paletteMap或PixelBender,来加速这一切。

我认为最简单的方法是使用两个连续的滤色器。即:

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。

我认为最简单的方法是使用两个连续的彩色滤波器。即:

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。

我通过每帧用0xFF8080填充纹理来解决这个问题,然后将我的动态内容绘制到第二个透明位图,用较低的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();
        }

我最后解决了这个问题,每帧用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();
        }

谢谢你的回答,但是计算告诉我,要将0x808081像素变成0x8080,我需要衰减50%以上。我最终使用了合并和播放alpha通道,这很有效,但我无法使其完美,然后我没有时间继续尝试PixelBender或paletteMap,顺便说一句,我仍然不知道如何准确使用。。。如果你有什么好的参考资料,那就太好了:)没错。您需要褪色50%以上(如果您愿意,只需少量褪色)我使用的唯一参考是这个。谢谢你的回答,但是计算告诉我,我需要衰减50%以上才能将0x8081像素变成0x8080。我最终使用了合并和播放alpha通道,这很有效,但我无法使其完美,然后我没有时间继续尝试PixelBender或paletteMap,顺便说一句,我仍然不知道如何准确使用。。。如果你有什么好的参考资料,那就太好了:)没错。您需要褪色50%以上(如果您愿意,只需少量褪色)我使用的唯一参考是这个。顺便说一句,我做了一个快速测试,这似乎没有任何舍入问题。如果对您来说是这样的话,您可以在第一个过滤器中使用比第二个过滤器稍大的偏移量,这将强制所有值收敛到0x80。这不是一个坏主意,但同样的问题也会出现。。。尝试将其添加到代码中:var myBMD:BitmapData=new BitmapData(2,2,false,0);噪声(2);对于(var i:uint=0;iCay:阅读您上面的评论。换句话说,在第一个过滤器中将“-off”更改为“-off-1”。哦,您是对的,我一开始没有得到它,对不起……但是,我丢失了低于0x8080的所有颜色信息,实际上我需要整个范围(能够获得负位移):(顺便说一句,我做了一个快速测试,这似乎没有任何舍入问题。如果对您来说是这样的话,您可以在第一个过滤器中使用比第二个过滤器稍大的偏移量,这将强制所有值收敛到0x80。这不是一个坏主意,但同样的问题也会出现……尝试将此添加到您的代码中:var myBMD:BitmapData=new BitmapData(2,2,false,0);myBMD.noise(2);for(var i:uint=0;iCay:阅读上面的注释。换句话说,在第一个过滤器中将“-off”更改为“-off-1”。哦,你是对的,我一开始没有得到它,对不起……不过,我丢失了低于0x8080的所有颜色信息,实际上我需要整个范围(能够获得负位移):(