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

Dvoudimenzní průřez 3D Perlinovým šumem.

Historie editovat

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

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

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

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