Flash 如何仅将位图过滤器渲染到BMD?

Flash 如何仅将位图过滤器渲染到BMD?,flash,actionscript-3,air,filter,bitmap,Flash,Actionscript 3,Air,Filter,Bitmap,如何将应用于精灵的位图过滤器(如DropShadowFilter)渲染到单独的位图数据层?然后将其放置在所有对象下方 例如,如果两个矩形精灵相互重叠,并且每个精灵都应用了DropShadowFilter,则结果将是该过滤器覆盖并遮挡另一个矩形精灵,如下所示 注意:每个过滤器可能有不同的设置,因此我不能只对包含的精灵应用统一的过滤器另外:理想情况下,此解决方案将可扩展以同时处理多个动画精灵 我想说,最简单的方法是保留每个精灵的大纲副本,并应用DropShadowFilter。在过滤器上,设置dro

如何将应用于精灵的位图过滤器(如DropShadowFilter)渲染到单独的位图数据层?然后将其放置在所有对象下方

例如,如果两个矩形精灵相互重叠,并且每个精灵都应用了DropShadowFilter,则结果将是该过滤器覆盖并遮挡另一个矩形精灵,如下所示

注意:每个过滤器可能有不同的设置,因此我不能只对包含的精灵应用统一的过滤器另外:理想情况下,此解决方案将可扩展以同时处理多个动画精灵


我想说,最简单的方法是保留每个精灵的大纲副本,并应用DropShadowFilter。在过滤器上,设置
dropShadowFilter.hideObject=true-这将仅渲染阴影。然后将所有轮廓阴影添加到单个容器精灵中,并使用
addChildAt(container,0)
,这样它将被渲染到其他所有阴影之下。

我的方法是将每个
DisplayObject
绘制为
BitmapData
对象,并将其过滤器的属性
knockout
设置为
true
,然后将每个过滤器的
淘汰
重置为原始状态。一个简单的例子来说明这一点:

var s:Sprite = new Sprite();
s.graphics.beginFill(0xFF0000);
s.graphics.drawRect(0,0,40,40);
s.graphics.endFill();
var shadow:DropShadowFilter = new DropShadowFilter();
s.filters = [shadow];


function renderFilter(sprite:Sprite):Bitmap
{
   var bd:BitmapData = new BitmapData(sprite.width * 1.2, sprite.height * 1.2, true); //extra 20% for the filter data, you might have to adjust this value depending on your filter's size
  var filter:DropShadowFilter = sprite.filters[0];
  var originalKnockout:Boolean = filter.knockout;
  filter.knockout = true;
  bd.draw(sprite);
  filter.knockout = originalKnockout;
  sprite.filters[0] = filter;
  var bitmap:Bitmap = new Bitmap(bd);
  return bitmap;
}
renderFilter(s); // here you have filter's rendering;

我想您正在查找BitmapData.applyFilter()。它将任何BitmapFilter类型应用于BitmapData对象。位图过滤器是一系列过滤器类型的父类,包括模糊过滤器、光晕过滤器和着色器过滤器

()


谢谢,这听起来确实是一个很好的方法,will Experience。为一个很好的答案干杯,我需要做一点实验,但它目前运行得太慢了cheers,但我不认为这是我想要的,而是一种只渲染应用于精灵的过滤器的方法。