加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

actionscript-3 – DisplacementMapFilter如何工作?

发布时间:2020-12-15 07:29:21 所属栏目:百科 来源:网络整理
导读:我是动作脚本的初学者.如果我理解正确,DisplacementMapFilter根据“MAP图像”中相应像素位置的颜色从“源图像”移动像素. 问题是我的目标图像包含不在源图像中的像素! 例如,我使用此BitMapData获取UNICOLOR 10 * 10像素的“源图像”: sourceBitmap = new B
我是动作脚本的初学者.如果我理解正确,DisplacementMapFilter根据“MAP图像”中相应像素位置的颜色从“源图像”移动像素.

问题是我的目标图像包含不在源图像中的像素!

例如,我使用此BitMapData获取UNICOLOR 10 * 10像素的“源图像”:

sourceBitmap = new BitmapData(BITMAP_WIDTH,BITMAP_HEIGHT,false,0x000002);

produce:

  0   1   2   3   4   5   6   7   8   9
[002,002,002] Row 0
[002,002] Row 1
[002,002] Row 2
[002,002] Row 3
[002,002] Row 4
[002,002] Row 5
[002,002] Row 6
[002,002] Row 7
[002,002] Row 8
[002,002] Row 9

现在,我采用这个BLACK位移MAP并添加一个蓝色方块:

displacementBitmap = new BitmapData(BITMAP_WIDTH,0x000000);
for(i=5;i<10;i++)
    for(j=5;j<10;j++)
        displacementBitmap.setPixel(i,j,255);

produce:

 0   1   2   3   4   5   6   7   8   9 
[000,000,000] Row 0
[000,000] Row 1
[000,000] Row 2
[000,000] Row 3
[000,000] Row 4
[000,255,255] Row 5
[000,255] Row 6
[000,255] Row 7
[000,255] Row 8
[000,255] Row 9

结果:

displacementFilter = new DisplacementMapFilter();
displacementFilter.alpha=0;
displacementFilter.color=0;
displacementFilter.mapPoint=new Point(0,0);
displacementFilter.scaleX=1;
displacementFilter.scaleY=1;
displacementFilter.componentX = flash.display.BitmapDataChannel.BLUE;
displacementFilter.componentY = flash.display.BitmapDataChannel.BLUE;
displacementFilter.mapBitmap = displacementBitmap;

destinationBitmap = new BitmapData(BITMAP_WIDTH,0xFFFFFFFF);
destinationBitmap.applyFilter(
    sourceBitmap.bitmapData,new Rectangle(0,BITMAP_WIDTH,BITMAP_HEIGHT),new Point(0,0),displacementFilter
);

produce:        

  0   1   2   3   4   5   6   7   8   9 
[002,001,001] Row 5
[002,001] Row 6
[002,001] Row 7
[002,001] Row 8
[002,001] Row 9

所以我不明白为什么我的’001’像素在源图像中不存在.

非常感谢你.

解决方法

置换贴图滤镜使用 this formula决定从源位图抓取哪个像素:

dstPixel[x,y] = srcPixel[x + ((componentX(x,y) - 128) * scaleX) / 256,y + ((componentY(x,y) - 128) *scaleY) / 256)

dstPixel是目标位图,srcPixel是源位图,componentX / Y来自位移位图.映射由组件通道距离128的距离确定.请注意,128是中性值,其中没有变换,并且使用相同的源像素.

例如,让我们考虑你的情况下的(1,1)像素.您的组件通道为蓝色,位移图中(1,1)的蓝色通道的值为0.因此我们将取代(0 – 128)/ 256或-0.5.因此,我们从源位图中获取的最终像素为(0.5,0.5).

但是使用一半像素是什么意思?事实证明,Flash使用bilinear filtering来平滑结果.您最终会在(0,0)和(1,1)之间的四个像素中混合使用颜色.

这是您看到不在源图像中的奇数像素的原因.尽管源图像中的所有像素都是相同的颜色,但当Flash在颜色之间进行插值时,似乎存在一些浮点不准确性,因此有时您会获得稍微偏离的值.请注意,如果在位移位图中使用“干净”除以128的值(例如0或64),则会得到正确的结果.但是如果使用255或19之类的值,则会出现一些错误.

不幸的是,似乎没有任何方法可以关闭过滤并使用简单的最近邻点采样.因此,如果您需要保证不会引入新颜色,则必须仔细选择置换贴图中的值.

或者,您可以使用Pixel Bender创建满足您需求的内核. Pixel Bender允许您从源位图进行最近邻采样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读