Шум Перліна належить до градієнтних шумів і є розроблений Кеном Перліном у 1983 році як результат його розчарування у «машинному» вигляді комп'ютерної графіки тих часів. У 1997 році Перлін отримав Академічну Нагороду за Технічні Досягнення:
To Ken Perlin for the development of Perlin Noise, a technique used to produce natural appearing textures on computer generated surfaces for motion picture visual effects. The development of Perlin Noise has allowed computer graphics artists to better represent the complexity of natural phenomena in visual effects for the motion picture industry.
Перлін не патентував алгоритм, але у 2001 році йому надали патент на використання 3D+ реалізації симплекс шуму для генерації текстур. У симплекс шуму те ж призначення, але він використовує простішу сітку заповнення. Симплекс шум згладжує певні проблеми «класичного шуму» Перліна, такі як складність обчислень і візуально помітні артефакти.
Використання
Шум Перліна — це примітив процедурних текстур, що належить до градієнтних шумів. Художники використовують його, щоб зробити комп'ютерну графіку реалістичнішою. Результат алгоритму є псевдовипадковим, але всі візуальні деталі мають однаковий розмір. Завдяки цьому алгоритм має широке застосування; масштабовані копії шуму Перліна можна підставити у математичний вираз, що дозволить створити різноманітні процедурні текстури. Такі текстури часто використовують у CGI, щоб зробити більш реалістичним вигляд комп'ютерних ефектів, таких як вогонь, дим чи хмари, імітуючи випадковий характер вигляду природних явищ. Також шум Перліна використовують за умов дуже обмеженої пам'яті, наприклад у демосценах, чи у графіці реального часу в іграх.
Розробка
Шум Перліна створений Кеном Перліном у Mathematical Applications Group для Діснеївського фільму 1982 року Трон. У 1997 році Перлін отримав Академічну Нагороду за Технічні Досягнення від Академії кінематографічних мистецтв і наук за його внесок у CGI.
Деталі алгоритму
Шум Перліна зазвичай реалізується як дво-, три-, або чотиривимірна функція, але може бути визначений довільною кількістю вимірів. Реалізація складається з трьох кроків: визначення сітки, обчислення скалярного добутку градієнтних векторів, та інтерполяція між цими значеннями.
Визначення сітки
Визначити n-вимірну сітку. Кожній координаті сітки присвоїти n-вимірний одиничний вектор. У випадку одновимірної сітки кожній координаті буде присвоєно значення +1 або −1, для двовимірної сітки кожній координаті буде присвоєно випадковий вектор з одиничного кола, і так далі для більшої кількості вимірів.
Визначення випадкових градієнтів для одного чи двох вимірів є тривіальним. Для більшої кількості вимірів пропонується наближення Монте Карло, де випадкові Картезіанські координати вибираються з одиничного куба, а точки за межами одиничної сфери відкидаються. Процес продовжується, поки не отримаємо необхідну кількість випадкових градієнтів. Далі отримані вектори нормалізують.
З метою зменшення витрат на обчислення нових градієнтів для кожної координати деякі реалізації використовують хеш-таблиці й таблиці пошуку для обмеження кількості попередньо обчислюваних градієнтних векторів. Використання хешу також дозволяє включити випадкові сіди, де необхідно кілька разів застосувати шум Перліна.
Скалярний добуток
Другий крок алгоритму — це визначення, в яку комірку сітки потрапляє окрема точка. Для кожного вузла сітки визначаємо вектор відстані між точкою і координатами вузла. Далі обчислюємо скалярні добутки векторів відстані та градієнтних векторів кожного вузла комірки.
Для кожної точки у двовимірній сітці процес вимагатиме 4 операції, у тривимірній — 8. Звідси випливає складність .
Інтерполяція
Фінальний крок — інтерполяція значень скалярних добутків, обчислених для кожного вузла. Інтерполяція виконується з використанням функції, що має нульову першу похідну (і, можливо, другу похідну також) на обох кінцевих точках. Лінійна функція, для кінцевих точок на 0 та 1, зі значеннями a0 та a1, може бути такою:
Функції шуму, використовувані у комп'ютерній графіці, зазвичай мають значення у проміжку [−1.0, 1.0]. Щоб результати шуму Перліна залишалися у цьому проміжку, інтерпольовані значення мають коригуватись з допомогою масштабувального множника.
Псевдокод
Псевдокод двовимірної реалізації Класичного Шуму Перліна:
// Функція лінійної інтерполяції між a0 й a1 // Вага w має бути у межах [0.0, 1.0] function lerp(float a0, float a1, float w) { return (1.0 - w)*a0 + w*a1; } // Обчислення скалярний добуток між відстанню і градієнтним вектором. function dotGridGradient(int ix, int iy, float x, float y) { // Попередньо обчислені градієнтні вектори extern float Gradient[Y][X][2]; // Обчислення вектора відстані float dx = x - (double)ix; float dy = y - (double)iy; // Обчислення скалярного добутку return (dx*Gradient[iy][ix][0] + dy*Gradient[iy][ix][1]); } // обчислення шуму Перліна для координат x, y function perlin(float x, float y) { // Визначення координат комірки сітки int x0 = (x > 0.0 ? (int)x : (int)x - 1); int x1 = x0 + 1; int y0 = (y > 0.0 ? (int)y : (int)y - 1); int y1 = y0 + 1; // Визначення ваг інтерполяції // Також можна використати поліноміальну криву вищого порядку float sx = x - (double)x0; float sy = y - (double)y0; // Інтерполяція між градієнтами float n0, n1, ix0, ix1, value; n0 = dotGridGradient(x0, y0, x, y); n1 = dotGridGradient(x1, y0, x, y); ix0 = lerp(n0, n1, sx); n0 = dotGridGradient(x0, y1, x, y); n1 = dotGridGradient(x1, y1, x, y); ix1 = lerp(n0, n1, sx); value = lerp(ix0, ix1, sy); return value; }
Складність
При кожному виклику функції має бути обчислений скалярний добуток відстані та градієнта для кожного вузла. За додавання виміру кількість вузлів подвоюється, тому шум Перліна оцінюється як для вимірів. Альтернативою для шуму Перліна є симплекс та OpenSimplex, що мають кращу складність.
Посилання
- Making Noise Ken Perlin talk on noise
- libnoise
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Shum Perlina nalezhit do gradiyentnih shumiv i ye rozroblenij Kenom Perlinom u 1983 roci yak rezultat jogo rozcharuvannya u mashinnomu viglyadi komp yuternoyi grafiki tih chasiv U 1997 roci Perlin otrimav Akademichnu Nagorodu za Tehnichni Dosyagnennya Dvovimirnij pereriz trivimirnogo shumu Perlina pri z 0 To Ken Perlin for the development of Perlin Noise a technique used to produce natural appearing textures on computer generated surfaces for motion picture visual effects The development of Perlin Noise has allowed computer graphics artists to better represent the complexity of natural phenomena in visual effects for the motion picture industry Perlin ne patentuvav algoritm ale u 2001 roci jomu nadali patent na vikoristannya 3D realizaciyi simpleks shumu dlya generaciyi tekstur U simpleks shumu te zh priznachennya ale vin vikoristovuye prostishu sitku zapovnennya Simpleks shum zgladzhuye pevni problemi klasichnogo shumu Perlina taki yak skladnist obchislen i vizualno pomitni artefakti VikoristannyaShum Perlina ce primitiv procedurnih tekstur sho nalezhit do gradiyentnih shumiv Hudozhniki vikoristovuyut jogo shob zrobiti komp yuternu grafiku realistichnishoyu Rezultat algoritmu ye psevdovipadkovim ale vsi vizualni detali mayut odnakovij rozmir Zavdyaki comu algoritm maye shiroke zastosuvannya masshtabovani kopiyi shumu Perlina mozhna pidstaviti u matematichnij viraz sho dozvolit stvoriti riznomanitni procedurni teksturi Taki teksturi chasto vikoristovuyut u CGI shob zrobiti bilsh realistichnim viglyad komp yuternih efektiv takih yak vogon dim chi hmari imituyuchi vipadkovij harakter viglyadu prirodnih yavish Takozh shum Perlina vikoristovuyut za umov duzhe obmezhenoyi pam yati napriklad u demoscenah chi u grafici realnogo chasu v igrah RozrobkaShum Perlina stvorenij Kenom Perlinom u Mathematical Applications Group dlya Disneyivskogo filmu 1982 roku Tron U 1997 roci Perlin otrimav Akademichnu Nagorodu za Tehnichni Dosyagnennya vid Akademiyi kinematografichnih mistectv i nauk za jogo vnesok u CGI Detali algoritmuShum Perlina zazvichaj realizuyetsya yak dvo tri abo chotirivimirna funkciya ale mozhe buti viznachenij dovilnoyu kilkistyu vimiriv Realizaciya skladayetsya z troh krokiv viznachennya sitki obchislennya skalyarnogo dobutku gradiyentnih vektoriv ta interpolyaciya mizh cimi znachennyami Viznachennya sitki Viznachiti n vimirnu sitku Kozhnij koordinati sitki prisvoyiti n vimirnij odinichnij vektor U vipadku odnovimirnoyi sitki kozhnij koordinati bude prisvoyeno znachennya 1 abo 1 dlya dvovimirnoyi sitki kozhnij koordinati bude prisvoyeno vipadkovij vektor z odinichnogo kola i tak dali dlya bilshoyi kilkosti vimiriv Viznachennya vipadkovih gradiyentiv dlya odnogo chi dvoh vimiriv ye trivialnim Dlya bilshoyi kilkosti vimiriv proponuyetsya nablizhennya Monte Karlo de vipadkovi Kartezianski koordinati vibirayutsya z odinichnogo kuba a tochki za mezhami odinichnoyi sferi vidkidayutsya Proces prodovzhuyetsya poki ne otrimayemo neobhidnu kilkist vipadkovih gradiyentiv Dali otrimani vektori normalizuyut Z metoyu zmenshennya vitrat na obchislennya novih gradiyentiv dlya kozhnoyi koordinati deyaki realizaciyi vikoristovuyut hesh tablici j tablici poshuku dlya obmezhennya kilkosti poperedno obchislyuvanih gradiyentnih vektoriv Vikoristannya heshu takozh dozvolyaye vklyuchiti vipadkovi sidi de neobhidno kilka raziv zastosuvati shum Perlina Skalyarnij dobutok Drugij krok algoritmu ce viznachennya v yaku komirku sitki potraplyaye okrema tochka Dlya kozhnogo vuzla sitki viznachayemo vektor vidstani mizh tochkoyu i koordinatami vuzla Dali obchislyuyemo skalyarni dobutki vektoriv vidstani ta gradiyentnih vektoriv kozhnogo vuzla komirki Dlya kozhnoyi tochki u dvovimirnij sitci proces vimagatime 4 operaciyi u trivimirnij 8 Zvidsi viplivaye skladnist O 2 n displaystyle O 2 n Interpolyaciya Finalnij krok interpolyaciya znachen skalyarnih dobutkiv obchislenih dlya kozhnogo vuzla Interpolyaciya vikonuyetsya z vikoristannyam funkciyi sho maye nulovu pershu pohidnu i mozhlivo drugu pohidnu takozh na oboh kincevih tochkah Linijna funkciya dlya kincevih tochok na 0 ta 1 zi znachennyami a0 ta a1 mozhe buti takoyu f x a 0 1 x a 1 x displaystyle f x a 0 1 x a 1 x Funkciyi shumu vikoristovuvani u komp yuternij grafici zazvichaj mayut znachennya u promizhku 1 0 1 0 Shob rezultati shumu Perlina zalishalisya u comu promizhku interpolovani znachennya mayut koriguvatis z dopomogoyu masshtabuvalnogo mnozhnika PsevdokodPsevdokod dvovimirnoyi realizaciyi Klasichnogo Shumu Perlina Funkciya linijnoyi interpolyaciyi mizh a0 j a1 Vaga w maye buti u mezhah 0 0 1 0 function lerp float a0 float a1 float w return 1 0 w a0 w a1 Obchislennya skalyarnij dobutok mizh vidstannyu i gradiyentnim vektorom function dotGridGradient int ix int iy float x float y Poperedno obchisleni gradiyentni vektori extern float Gradient Y X 2 Obchislennya vektora vidstani float dx x double ix float dy y double iy Obchislennya skalyarnogo dobutku return dx Gradient iy ix 0 dy Gradient iy ix 1 obchislennya shumu Perlina dlya koordinat x y function perlin float x float y Viznachennya koordinat komirki sitki int x0 x gt 0 0 int x int x 1 int x1 x0 1 int y0 y gt 0 0 int y int y 1 int y1 y0 1 Viznachennya vag interpolyaciyi Takozh mozhna vikoristati polinomialnu krivu vishogo poryadku float sx x double x0 float sy y double y0 Interpolyaciya mizh gradiyentami float n0 n1 ix0 ix1 value n0 dotGridGradient x0 y0 x y n1 dotGridGradient x1 y0 x y ix0 lerp n0 n1 sx n0 dotGridGradient x0 y1 x y n1 dotGridGradient x1 y1 x y ix1 lerp n0 n1 sx value lerp ix0 ix1 sy return value SkladnistPri kozhnomu vikliku funkciyi maye buti obchislenij skalyarnij dobutok vidstani ta gradiyenta dlya kozhnogo vuzla Za dodavannya vimiru kilkist vuzliv podvoyuyetsya tomu shum Perlina ocinyuyetsya yak O 2 n displaystyle O 2 n dlya n displaystyle n vimiriv Alternativoyu dlya shumu Perlina ye simpleks ta OpenSimplex sho mayut krashu skladnist PosilannyaMaking Noise Ken Perlin talk on noise libnoise