Що таке шум Перліна та як його використовувати при створенні ігор

Ми продовжуємо серію текстів «Математика в геймдеві» — цикл статей про математичні концепції та об’єкти, які розробники використовують при створенні ігор. У минулих публікаціях ми писали про криві Безьє, діаграми Вороного, інтерполяцію та кватерніони. Цього ж разу розкажемо про шум Перліна.

Загалом, шум (не тільки той, що названий на честь математика Кена Перліна) — один з важливих інструментів у комп’ютерній графіці та розробці ігор. Шуми використовують для текстурування, генерації мап, розташування об’єктів на картах та навіть розподілу небесних тіл в космосі.

Нижче — невеличкий екскурс в історію шуму Перліна. Якщо вам цікаво прочитати саме про прикладний аспект інструменту, радимо одразу перейти до розділу «Шум Перліна та геймдев».

Початок шумів: «Трон», Дісней та «машинне гетто»

Ідея шуму з’явилася у 1980-х роках на орбіті Голлівуду. Кінематограф потроху наповнювався комп’ютерною графікою і CG-спеціалісти намагалися робити речі, які б виглядали реальними на екрані. Об’єкти, що відтворювалися без дефектів, суцільними кольорами, здавалися неприродно «чистими». Саме тому художники, наприклад, намагалися «натягнути» на 3D-модель космічного корабля зображення і надати йому таким чином більшої візуальної складності. Однак комп’ютери тоді ще не мали необхідної потужності і часто зображення для текстурування просто не поміщалися в оперативну пам’ять.

Для нерівностей, блиску чи патини на поверхні об’єкта фахівці з комп’ютерної графіки пробували різні рішення. Спочатку були ідеї використовувати генератори випадкових чисел (ГВЧ), але їх було недостатньо. Дефекти чи нерівності в природі зазвичай гладкі. Тобто, попри випадковість текстури природних об’єктів, там є певна структура. Це означає, що дві сусідні точки на поверхні скоріше за все будуть виглядати майже однаково, а от якщо вони розташовані далеко одна від одної — ситуація може кардинально змінитися. ГВЧ своєю чергою видає числа, що не пов’язані одне з іншим (білий шум) і тому вони не дуже підходять для такої роботи.

Проблема лишалася відкритою, аж поки компанія Walt Disney Pictures не почала працювати над науково-фантастичним фільмом «Трон», що вийшов у 1982 році. Стрічка стала віхою для CGI і була однією з перших картин, де активно використовувалася комп’ютерна графіка.

Та куди важливіше, що над нею працював Кен Перлін. На той час він, бакалавр теоретичної математики з Гарварду, входив у склад компанії Mathematical Applications Group, Inc (MAGI) і саме ця організація стала надзвичайно важливою для усього фантастичного кіно. У 1978 році режисер Стівен Лісбергер завітав до MAGI, побачив їх демо комп’ютерних симуляцій, придумав ключові ідеї «Трона» і потім вже запітчив їх до оселі найвідомішої у світі миші. На той час, як згадує сам Перлін, креативним відділом Walt Disney Pictures керував Том Вілхайт, який і залучив до виробництва стрічки MAGI та ще кілька компаній.

Втім, робота над «Троном» для Перліна була неоднозначним досвідом — вчений називає його «чудовим, але ґрунтовно незадовільним». Проблемою було те, що більшість моделей у фільмі є традиційним прикладом комп’ютерної генерації того часу: пласкі, ненатуральні, занадто «чисті». Сам науковець називав це «machine-look ghetto». Однак, цей час все ж став натхненням для математика.

Кен Перлін, математик

«Після роботи над „Троном“ я провів багато експериментів. Я шукав такі штуки, що допоможуть випадково, але контрольовано досягати результату. Коли скульптор працює з каменем, або художник з пензлем, або графік працює з вугіллям — тут всюди є контрольований аспект медіумуму. Вони можуть робити все, що захочуть. Вони працюють з природним матеріалом і результат може виглядати не так, ніби його створив комп’ютер. Я ж хотів створити псевдовипадковий сигнал, енергія якого сконцентрована поблизу однієї конкретної частоти. І це було абсолютно новим напрямком».

Кен зазначає, що проривом був не сам по собі шум. Він був лише одним з компонентів цілої низки речей, які дослідник зробив. Проривом, за словами Перліна, було думати про піксель, як про точку у тривимірному просторі. З цією точкою можна було самому робити якісь розрахунки, або дати можливість іншим людям робити ці розрахунки і не замислюватися про сусідні пікселі. Науковець зазначав: користувачам не потрібно було б будувати структури даних, щоб оперувати всією поверхньою; вони просто переходять від однієї функції до іншої, «ніби пишуть музику».

«Ти кажеш — в мене є повноцінна комп’ютерна програма (зі змінними, методами, циклами) і вона опрацьовує один піксель зображення. А потім — інший. І так кожний піксель поверхні. До цього люди не думали про таке. Сама думка, що цілий комп’ютер запускається заради одного пікселя була поза радарами фахівців», — додає він.

Одним з факторів, що вплинув на роботу Перліна, була система SynthaVision від MAGI. При створенні CGI-ефектів вона не використовувала полігони — все було побудовано на булевих комбінаціях математичних примітивів (еліпсоїди, циліндри, усічені конуси). Наприклад, мотоцикли в «Троні» як раз і створювалися шляхом додавання чи віднімання простих твердих математичних фігур. Спостерігаючи за роботою SynthaVision почав думати про текстурування не з точки зору поверхні, а з точки зору об’єму.

Першу псевдовипадкову функцію шуму математик зробив у 1983 році. Її роботу він порівнював з рухом пензля під час малювання. Коли художник використовує певний пензлик, то щетина на ньому має особливі статистичні якості (розмір, відстань чи жорсткість щетини). При цьому сам користувач не знає, або не хоче знати про параметри кожної окремої щетинки. Художник олійними фарбами створює контрольований випадковий процес, а Перлін досяг цього за допомогою математичних виразів при створенні текстур.

Зрештою, Кен Перлін зазначає — саме він був автором ідеї процедурних шейдерів, які працюють з кожним окремим пікселем. Вже потім ця ідея перетворилася на багатомільярдну індустрію, де такі компанії, як Nvidia чи ATI випускають чіпи з прискореною графікою і переносять цей підхід на телефони. Своє бачення математик вперше представив у 1985 році під час конференції SIGGRAPH (Спеціальна група з графічних і інтерактивних методів). Результатом його праці стала доповідь «An Image Synthesizer», а у 1997 році Перлін навіть отримав нагороду від Академії кінематографічних мистецтв і наук за роботу над процедурною текстурою, яка, наприклад, використовувалася для шкіри динозаврів у фільмі Стівена Спілберга «Парк Юрського періоду». Тім, кому цікаво ознайомитися з оригінальними ідеями науковця радимо почитати його статтю нижче.

Векторні поля функцій та параметри шуму

Математичне визначення шуму Перліна може бути різним. Наприклад, про нього можна думати, як про векторне поле функцій, де кожна точка має своє значення шуму. Але в такому разі у деяких читачів може постати питання, а що таке векторне поле функцій. Нагадуємо, що це математичне поняття, яке описує, як вектори змінюються в кожній точці простору. Уявіть річку та її рух. В кожній точці ми можемо визначити вектор, який показує напрям та швидкість води. Тоді векторне поле функцій буде включати всі вектори, розташовані вздовж річки.

Сам Перлін свій шум визначав, як апроксимацію (або ж наближення) до білого шуму, що обмежена діапазоном певного критерію. Формально це виглядає так:

Втім, ми можемо почати з того, що шум Перліна є окремим випадком градієнтних шумів. При їх генерації створюється решітка випадкових (або псевдовипадкових) градієнтів і далі потрібно знайти скалярний добуток цих градієнтів. Потім цей скалярний добуток потрібно інтерполювати для отримання значень у необхідних точках.

Розглянемо піксельну точку X, що є скалярним значенням і створимо сітку з кількома аналогічними об’єктами. Потім для кожної з цих точок призначимо вектор градієнта, що має випадковий напрямок. Для двовимірного випадку кожна точка буде мати чотири вектори градієнта (для 3D їх буде вже вісім). Кожен вектор лише здається випадковим і насправді генерує однакове значення градієнта кожного разу, коли ми застосовуємо алгоритм Перліна. Щоб отримати результат нам потрібно знайти вектори відстані, а для цього ми віднімаємо точкове значення градієнта від точки на сітці.


Втім, далеко не завжди є можливість досягти потрібного результату лише один раз згенерувавши шум Перліна — сам по собі цей алгоритм генерує досить прості криві. Для того, щоб отримати більш «природні» ефекти зазвичай накладають кілька шумів. Головне, щоб у них були різні параметри. Серед останніх можна виділити:

  • октави — це кількість кривих Перліна, що відповідають за неоднорідність шуму (чим більший цей параметр, тим складніша форма ландшафту);
  • амплітуда — коефіцієнт, що відповідає за висоту координати Y кінцевого результату;
  • період — періодичність піків кривої Перліна (чим цей параметр більший, тим гладкішою є поверхня);
  • сід (seed) — число, яке однозначно описує генерацію.

Загалом, сьогодні у комп’ютерній графіці використовують не тільки шум Перліна. Так, симплекс-шум має кращу продуктивність та меншу кількість артефактів, а OpenSimplex йде ще далі. Що приємно в цьому випадку — в інтернеті є достатньо готових алгоритмів для генерації шумів. Наприклад, за цим посиланням можна знайти код оригінального шуму Перліна для С, а за цим лінком — приклад симплекс-шуму для C#. Втім, ніхто не забороняє розібратися в темі детальніше і написати своє.

Шум Перліна та геймдев

Уважний читач на цьому етапі вже розуміє, яку саме роль шум Перліна відіграє при створенні комп’ютерних ігор. Його можна використовувати як дифузний колір, матеріал, мерехтіння світла, пляму на текстурі тощо. Та ми все ж пригадали успішні випадки застосування цього інструменту, а також поспілкувалися з українськими розробниками, які його використовували у своїй роботі.

По-перше, було б помилкою пройти повз творців пригодницької гри No Man’s Sky. Розробники зі студії Hello Games модифікували шум Перліна для генерації ландшафтів на понад 18 квінтильйонах планет та розташування астрономічних об’єктів в космосі. Зокрема, коштом накладання кількох шумів вдалося досягти реалістичності біомів, а додавання фрактальних параметрів до генерації допомогли з побудовою берегових ліній, річкових систем та інші природних утворень.

По-друге, інді-розробник Андрій Бичковський застосував шуми Перліна для своєї стратегії Farlanders. Зокрема, він використовувався:

  • для генерації карти висот, щоб мати гірські масиви та протяжні каньйони;
  • для генерації нерівностей у геометрії мешів;
  • для визначення регіонів багатства на карті для міст у новій грій.

Андрій Бичковський, інді-розробник

«Також знаю, що для генерації підземель у Minecraft теж використовується щось подібне до шуму Перліна. Там печери створюються на тонких лініях з певним значення шуму (умовно значення від 0.45 до 0.55). Взагалі магія відбувається, коли генеруєш декілька шумів для різних феноменів у грі. Тоді виходить різноманітний результат. У тому самому Minecraft є, наприклад, окремі шуми Перліну для визначення температури, вологості, рівнинності. І в залежності від значення цих показників визначається біом», — додає він.

Засновник Cat Floor Studio і творець фізичного 3D-пазлу The GoD Unit Андрій Кушнірук зазначає, що він у своїй роботі шум Перліна використовував в основному для створення недосконалостей на текстурах — плям чи неоднорідності кольору.

Андрій Кушнірук , засновник Cat Floor Studio

«Тут насправді досить нескладно. Наприклад, є металева діжка, пофарбована зеленою фарбою. Якщо колір цієї фарби буде однорідний, то це буде нереалістично. В такому випадку можна використовувати шум (будь-який з процедурних шумів, не лише Перліна), як маску, щоб, наприклад де-не-де колір був темнішим», — додає розробник.

Unity-розробник Олексій, що вирішив не називати свого прізвища, зазначив, що вони в своїй студії регулярно використовують шум Перліна для генерації мап та процедурного розставляння об’єктів на них (дерев, кущів тощо).

«Оскільки ми працювали з вокселами, це було найпростіше рішення — на один „кубик“ приходиться один предмет. Одна з переваг, що це виглядає досить випадково для гравця. Мінуси тут полягають в тому, що складно втілювати „ручний контроль“. Припустимо, ви хочете, щоб поруч з деревами завжди спавнилися кущі. Або ж щоб дерева займали якусь специфічну позицію. З цим можуть бути проблеми», — резюмує Олексій.

А як ви використовуєте у своїй роботі шум Перліна? Можливо, існують більш неочевидні варіанти його застосування? Діліться в коментарях! Окрім того, якщо ви користуєтеся іншими математичними об’єктами чи концепціями для створення ігор — можете пройти наше невеличке опитування про математику в розробці ігор.

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини

👍ПодобаєтьсяСподобалось8
До обраногоВ обраному5
LinkedIn


Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А ось повна збірка уроків на Юніті. Та ще з джобсами і розрахунками на ГПУ. Звідти доречі і взята картинка посту. catlikecoding.com/...​rials/pseudorandom-noise

Підписатись на коментарі