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