Perlinův šum

Z Wikipedie, otevřené encyklopedie
Skočit na navigaci Skočit na vyhledávání
Dvoudimenzní průřez 3D Perlinovým šumem.

Perlinův šum (anglicky Perlin noise) je metoda vhodná pro generování grafického šumu, kterou roku 1985 představil Ken Perlin.

Historie[editovat | editovat zdroj]

Tato metoda vychází z tvorby Kena Perlina, který ji vyvinul během prací pro Mathematical Applications Group, Inc. Roku 1997 Ken Perlin získal ocenění Academy Award for Technical Achievement od Akademie filmových umění a věd za spoluúčast na filmu Tron z roku 1982.

Jak to funguje[editovat | editovat zdroj]

Tato metoda funguje na součtu stejné šumové funkce, avšak o různé intenzitě a v různém měřítku. Pro takovouto šumovou funkci se často používá náhodný, deterministický generátor. Výsledkem součtu šumových funkcí je šum, kterým je možné napodobit rozličné přírodní věci, nejčastěji oblaka, vodu, dřevěné materiály a mramor.

Pořadí při sčítání se nazývá oktáva. V každé oktávě má šumová funkce různé měřítko a intenzitu. Měřítko lze udávat frekvencí, tedy počtem opakování na jednotku. Intenzitu v tomto případě nazýváme amplitudou.

Perlinův šum je realizován jako funkce buď (x,y,z) nebo (x,y,z,čas), která využívá interpolaci mezi sadou předem vypočítaných vzestupných vektorů, pro konstrukci hodnoty, která se mění náhodně v závislosti na prostoru a/nebo čase. Ken Perlin tuto realizaci šumu vylepšil v roce 2002, potlačením některých vizuálních artefaktů.

Využití[editovat | editovat zdroj]

Perlinův šum je široce využíván v počítačové grafice pro vytvoření různých efektů, jako jsou např. plameny ohně, kouř, vodní hladiny a tekoucí vody, a také oblaka. Je také velmi často využíván pro generování textur, pokud je velmi omezená paměť nebo nároky na ni, jako např. u demoverzí. Také postupně nalézá uplatnění v GPU při tvorbě real-time grafiky v počítačových hrách.

Příklad[editovat | editovat zdroj]

Trojrozměrný Perlinův šum v C++:

double perlinNoise(const double &x, const double &y, const double &z, const int &OCTAVES = 4, const double &PERSISTENCE = 0.5)
{
	double ret = 0;
	double frequency = 1;
	double amplitude = 1;
	for(int i=0; i<OCTAVES; i++)
	{
		ret = ret + amplitude*noise(x*frequency,y*frequency,z*frequency);
		frequency *= 1/PERSISTENCE;
		amplitude *= PERSISTENCE;
	}
	return ret;
}

Externí odkazy[editovat | editovat zdroj]