硬件加速的径向模糊

demo程序需要安装Flash Player11才能正常运行。


源文件:http://files.cnblogs.com/flash3d/radialBlur.rar

点击“open”按钮可以选择本地图片,水平滚动条可以调整模糊的量。

之前一直在纠结AGAL不能进行流程控制,致使很多需要循环计算的特效无法使用硬件加速。

今天用了一个笨方法通过as3循环拼接AGAL程序来模拟简单确定的循环过程。

一个循环执行十次,就要在程序中拼十行相同的代码,由于程序的最大长度限制,程序只能拼非常有限的数量。

这个方法相当撇脚,不知大大们是否有更好的方法,求点拨。

下面介绍径向模糊的基本算法。

一般模糊算法的基本思想是,目标图像(生成的图像)上的任何一点的颜色值都受源图像对应位置的点以及其附近的点的颜色值共同影响。比如高斯模糊就是将处理点附近的颜色平均值作为该点的颜色。而径向模糊的特点则是某个中心点颜色向外扩散,这说明从中心点指向外侧的一条直线上,远离中心点的点是不会影响比较靠近中心点的点。另外,由于颜色是向四处发散,则不同放射线上的颜色也不会相互影响。

那么,我们可以将径向模糊算法归结为,目标图像上的某点颜色值为源图像对应点向中心点方向上一定距离的像素平均值。如下图所示。

点击查看原图

灰色点就是采样点,处理每个像素都要找到他对应的采样点,计算这些点的颜色平均值(分三个通道)则是我们要计算的点的颜色值。其中采样点的个数在程序中称为STEP(步数),点的间隔成为步长,步长不一定是距离,在程序中步长是scale值,所以采样点不是等距离的,离中心点越远采样点越稀疏,模糊起来更豪放o(╯□╰)o

这里我采用矩阵缩放的方式计算采样点进行采样。

点击查看原图

通过矩阵,可以对一个点进行变换,如将所有绿色点的坐标变换到红色点的位置,这个变换是等比变换(scaleX == scaleY)。变换后的坐标点和原点正好是在中心点的同一条辐射线上。我们可以给定一个单位矩阵,每次对该矩阵的scale减小一个固定量,然后采样,反复执行一定次数,则可以采样到一系列同一辐射线上的点。矩阵计算在GPU中是很快的,当然,你也可以选择通过计算这个直线的dx(x微分),dy(y微分),不断累加来获取采样点坐标,不过看起来的效果不如用scale采样美观。

算法解析到这里,源码内有注释已提供下载