Tworzenie tekstur za pomocą funkcji szumów

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

W celu zmodyfikowania wyglądu bitmapy można nałożyć na nią efekt szumu, korzystając z metody noise() lub perlinNoise() . Efekt szumu można przyrównać do statycznego obrazu wyświetlanego na niewyregulowanym odbiorniku telewizyjnym.

W celu zastosowania wobec bitmapy efektu szumów należy skorzystać z metody noise() . Metoda ta umożliwia zastosowanie losowych wartości kolorów wobec pikseli w określonym obszarze obrazu bitmapy.

Metoda ta przyjmuje pięć parametrów:

  • randomSeed (int): Generowana liczba losowa determinująca wzór. W przeciwieństwie do tego, co mówi nazwa, liczba ta w rzeczywistości daje takie same efekty przy przekazaniu tej samej liczby powtórnie. W celu uzyskania prawdziwego efektu losowego należy użyć metody Math.random() do przekazania liczby losowej do tego parametru.

  • low (uint): Ten parametr odnosi się do najniższej wartości, jaka ma być generowana dla każdego piksela (od 0 do 255). Wartością domyślną jest 0. Ustawienie tej wartości na niższą powoduje, że wzór szumu staje się ciemniejszy, podczas gdy ustawienie wartości wyższej powoduje rozjaśnienie wzoru.

  • high (uint): Ten parametr odnosi się do najwyższej wartości, jaka ma być generowana dla każdego piksela (od 0 do 255). Wartością domyślną jest 255. Ustawienie tej wartości na niższą powoduje, że wzór szumu staje się ciemniejszy, podczas gdy ustawienie wartości wyższej powoduje rozjaśnienie wzoru.

  • channelOptions (uint): Ten parametr określa, wobec którego kanału koloru obiektu bitmapy wzór szumu będzie stosowany. Liczba ta może być kombinacją dowolnych z czterech wartości kanałów kolorów ARGB. Wartością domyślną jest 7.

  • grayScale (Boolean): Po ustawieniu na wartość true ten parametr stosuje wartość randomSeed wobec pikseli bitmapy, co w efekcie skutkuje „zmyciem” całego koloru z obrazu. Ten parametr nie wpływa na wartość kanału alfa. Wartością domyślną jest false .

W poniższym przykładzie opisano tworzenie obrazu bitmapy oraz stosowanie wobec niej niebieskiego wzoru szumów:

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); 
        } 
    } 
}

Jeśli użytkownik zamierza utworzyć teksturę o nieco bardziej „organicznym” charakterze, może skorzystać z metody perlinNoise() . Metoda perlinNoise() umożliwia generowanie realistycznych, organicznych tekstur idealnych do zobrazowania dymu, chmur, ognia, wody, a nawet efektu eksplozji.

Ze względu na fakt, że jest ona generowana za pośrednictwem algorytmu, metoda perlinNoise() korzysta z mniejszej ilości pamięci niż tekstury oparte na bitmapach. Mimo to może mieć ona wpływ na użycie procesora, spowalniając działanie treści i powodując spowolnienie ponownego wyświetlania poniżej poziomu prędkości klatek, szczególnie na starszych komputerach. Jest to spowodowane główne przez obliczenia zmiennoprzecinkowe, które są potrzebne do przetwarzania algorytmu generowania szumów metodą perlin.

Metoda ta przyjmuje jeden z dziewięciu parametrów (pierwszych sześć z nich jest wymaganych):

  • baseX (Liczba): Określa wartość x (rozmiar) tworzonych wzorów.

  • baseY (Liczba): Określa wartość y (rozmiar) tworzonych wzorów.

  • numOctaves (uint): Liczba oktaw lub indywidualnych funkcji szumu do połączenia w celu wygenerowania tego szumu. W przypadku większych liczb oktaw konieczne jest tworzenie obrazów o większej liczbie detali, lecz ponadto wymagają one również dłuższego czasu przetwarzania.

  • randomSeed (int): Generowana liczba losowa działa dokładnie w ten sam sposób, co w funkcji noise() . W celu uzyskania prawdziwego efektu losowego należy użyć metody Math.random() do przekazania liczby losowej do tego parametru.

  • stitch (Boolean): Po ustawieniu na wartość true metoda ta próbuje "zszyć" (lub wygładzić) krawędzie przejścia obrazu w celu utworzenia spójnych tekstur wypełniających.

  • fractalNoise (Boolean): Ten parametr odnosi się do krawędzi gradientów generowanych ta metodą. Po ustawieniu na wartość true metoda generuje szum fraktalowy który wygładza krawędzie obszaru, wobec którego zastosowano efekt. Ustawienie jej na wartość false powoduje wygenerowanie turbulencji. Obraz zawierający turbulencję ma widoczne przerwy w gradiencie, co powoduje tworzenie lepszych efektów wizualnych obiektów o ostrych kształtach, jak na przykład płomienie i fale oceanu.

  • channelOptions (uint): Parametr channelOptions działa dokładnie w ten sam sposób, co w metodzie noise() . Określa on, na jaki kanał koloru (bitmapy) wzór szumu jest nakładany. Liczba ta może być kombinacją dowolnych z czterech wartości kanałów kolorów ARGB. Wartością domyślną jest 7.

  • grayScale (Boolean): Parametr grayScale działa dokładnie w ten sam sposób, co w metodzie noise() . Po ustawieniu na wartość true powoduje on nałożenie wartości randomSeed na piksele bitmapy, czego efektem jest „zmycie” wszelkich kolorów z obrazu. Wartością domyślną jest false .

  • offsets (Tablica): Tablica punktów odpowiadających przesunięciom x i y dla każdej oktawy. Poprzez manipulację wartości przesunięcia możliwe jest płynne przewijanie warstw obrazu. Każdy punkt tablicy przesunięć wpływa na określoną funkcję szumu oktawy. Wartością domyślną jest null.

Poniższy przykład ilustruje tworzenie obiektu BitmapData o rozmiarze 150 x 150 pikseli, który wywołuje metodę perlinNoise() w celu wygenerowania efektów chmury koloru zielonego i niebieskiego:

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); 
        } 
    } 
}