使用雜訊函數製作紋理

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

若要修改點陣圖的外觀,您可以使用 noise() 方法或是 perlinNoise() 方法,在點陣圖上套用雜訊效果。雜訊效果可以比喻為出現在未調頻之電視螢幕上的電波干擾。

若要將雜訊效果套用到點陣圖,請使用 noise() 方法。這個方法會將隨機的顏色值套用到點陣圖影像的指定區域內。

此方法可接受五個參數:

  • randomSeed (int):決定圖樣的隨機種子數值。雖然其名稱為如此,如果傳遞相同的數目,此數目實際上會建立相同的結果。為了取得真正隨機的結果,請使用 Math.random() 方法為此參數傳遞隨機數值。

  • low (uint):此參數指的是要為每個像素所產生的最低值 (0 到 255),預設值為 0。設定此值會降低在較黑的雜訊圖樣中的結果,而將它設定為較高的值會導致較亮的圖樣。

  • high (uint):此參數指的是要為每個像素所產生的最高值 (0 到 255),預設值為 255。設定為較小的值時,會產生較暗的雜訊圖樣;而設定為較大的值則會產生較亮的圖樣。

  • channelOptions (uint):此參數會指定雜訊圖樣將套用的點陣圖物件之顏色色版。此數字可以是任何四個顏色色版 ARGB 值的組合,預設值為 7。

  • grayScale (Boolean):設定為 true 時,此參數會將 randomSeed 值套用至點陣圖像素,可有效地將影像的所有顏色洗掉。此參數不受 Alpha 色版的影響。預設值為 false

下列範例會建立點陣圖影像,並將藍色的雜訊圖樣套用至該影像:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BitmapDataChannel; 
 
    public class BitmapNoise1 extends Sprite 
    { 
        public function BitmapNoise1() 
        { 
            var myBitmap:BitmapData = new BitmapData(250, 250,false, 0xff000000); 
            myBitmap.noise(500, 0, 255, BitmapDataChannel.BLUE,false); 
            var image:Bitmap = new Bitmap(myBitmap); 
            addChild(image); 
        } 
    } 
}

如果您想要建立看起來更有組織的紋理,請使用 perlinNoise() 方法。 perlinNoise() 方法會產生寫實且具組織性的紋理,適用於煙霧、雲狀、水、火或甚至是爆炸效果。

因為它是由演算法所產生,所以比起點陣圖紋理, perlinNoise() 方法會使用更少的記憶體。然而,它對於處理器使用率仍然有影響,因此會使內容變慢,造成重繪螢幕的速度比影格速率更慢,特別是較舊的電腦更是如此。這主要是為了處理 Perlin 雜訊演算法,因此需要執行浮點數計算。

此方法會採用九個參數 (前六個為必要參數):

  • baseX (Number):決定所建立圖樣的 x (大小) 值。

  • baseY (Number):決定所建立圖樣的 y (大小) 值。

  • numOctaves (uint):建立此雜訊所需結合的 octave 或是個別的雜訊函數數量。較大的 octave 數字所建立的影像能呈現更細膩的畫質,但是也需要更多的處理時間。

  • randomSeed (int):隨機種子數字的運作方式與它在 noise() 函數中的運作方式完全相同。為了取得真正隨機的結果,請使用 Math.random() 方法為此參數傳遞隨機號碼。

  • stitch (Boolean):如果設定為 true ,則此方法會嘗試柔合 (平滑化) 影像的轉場邊緣,以建立無接縫的拼貼紋理做為點陣圖填色。

  • fractalNoise (Boolean):此參數與此方法所產生的漸層邊緣有關。如果設定為 true ,則此方法會產生不規則雜訊,以平滑化該效果的邊緣。如果設定為 false ,則會造成湍流化。帶有亂流的影像具有明顯不連續的漸層,可讓它產生較逼近、鮮明的視覺特效,例如火焰和海浪。

  • channelOptions (uint): channelOptions 參數的運作方式與它在 noise() 方法中的運作方式完全相同。它會指定雜訊圖樣所套用的點陣圖顏色色版。此數字可以是任何四個顏色色版 ARGB 值的組合,預設值為 7。

  • grayScale (Boolean): grayScale 參數的運作方式與它在 noise() 方法中的運作方式完全相同。如果設定為 true ,它會將 randomSeed 值套用至點陣圖像素,可有效地將影像的所有顏色洗掉。預設值為 false

  • offsets (Array):對應至每個 octave 之 x 和 y 偏移的點陣列。藉由操作偏移值,您可以平順地捲動影像的圖層。在偏移陣列中的每個點都會影響特定的 octave 雜點函數。預設值是 null

下列範例將建立一個 150 x 150 像素的 BitmapData 物件,它會呼叫 perlinNoise() 方法來產生綠色與藍色雲狀效果:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BitmapDataChannel; 
 
    public class BitmapNoise2 extends Sprite 
    { 
        public function BitmapNoise2() 
        { 
            var myBitmapDataObject:BitmapData = 
                new BitmapData(150, 150, false, 0x00FF0000); 
             
            var seed:Number = Math.floor(Math.random() * 100); 
            var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE  
            myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); 
             
            var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); 
            addChild(myBitmap); 
        } 
    } 
}