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采樣美觀。
算法解析到這里,源碼內有注釋已提供下載,關於Stage3D技術的使用方法請參考上一篇博文。