Створення реалістичних віртуальних ландшафтів

3D-художник Аліреза Хаджехалі - справжній майстер ландшафтного дизайну. Він створив незліченну кількість віртуальних локацій, повністю іграбельних в UE4. У цьому інтерв'ю вона описав свій робочий процес і розповів про те, як WorldMachine і Megascans допомагають йому конструювати великі і реалістичні цифрові світи.

Це не туторіал, а інтерв'ю, яке допоможе уявити робочий процес. Навчальна стаття зайняла б більше десяти сторінок.

З оригінальним матеріалом можна ознайомитися тут .

З оригінальним матеріалом можна ознайомитися   тут

Всім привіт! Мене звуть Аліреза Хаджехалі, і я здорово підсів на реалізм. В даний момент я отримую ступінь бакалавра за спеціальністю «Програмування», і мій випуск повинен відбутися приблизно через 8 місяців. Що стосується 3D-графіки, то тут я самоучка, і ця область знань для мене - справжня пристрасть. Саме вона і допомагає мені рухатися вперед.

Саме вона і допомагає мені рухатися вперед

Все почалося з того, коли я виявив, що у мого Crysis 1 є редактор, який можна відкрити подвійним кліком мишки і тут же стати ігровим розробником. «Ніколи не кажіть дитині, що посадити пару дерев - це непосильне завдання!» Незабаром вийшов CryENGINE 3 Free SDK, після чого моєю основною діяльністю стали створення сцен і допомогу маленьким інді-проектам, плюс я кілька років проводив купу вільного часу за безкоштовною роботою і в один прекрасний момент зміг, нарешті, представити себе як художника оточення з солідним портфоліо.

З того, що я робив недавно, можна виділити LawBreakers , Де я робив природні фони для рівнів. працюючи над Chronicles of Elyria , Я був в позиції універсалу, тобто створював і ігрові рівні, і рекламні шоти. Крім того, я робив ландшафт в Squad і зараз працюю з друзями над Our Ghosts of War , Це особистий проект.

Я думаю, кожен художник оточення мріяв займатися цим з самого дитинства. Наприклад, коли мені було 4-5 років, то я завжди, дивлячись фільми, думав про те, як би я оформив декорації, довір вони цю справу мені. Мені завжди подобалося комбінувати речі таким чином, щоб вони чудово виглядали один з одним - саме це я і робив в CryENGINE 2 в свої моддеррскіе деньки.

Перехід від маленьких сцен до великих просторів стався, коли я вперше побачив Battlefield 3. Я був дуже вражений цими величезними пейзажами і особливо - роботою Ендрю Гамільтона . Він собаку з'їв на всьому, що стосується відкритих локацій, тому в його роботі всі деталі дивовижні і знаходяться в повній гармонії один з одним. В общем-то, в цьому і є секрет хороших відкритих ландшафтів. «Не потрібно недооцінювати що-небудь, виходячи з розміру. Навіть маленька галька на землі так само важлива, як і величезні гори! »На той момент я як і раніше користувався CryENGINE 3, але через нестачу інструментів для створення великих відкритих просторів я таки кинув його і перейшов на UE 4.0.1.

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

Робота над кожною сценою починається з ідеї, яка народилася в голові, або з картинки-референсу. Наприклад, недавно я створив шматочок Ісландії, і цей проект почався з того, що я випадково побачив класні фотки півострова Рейкьянес. Локація, яку я зробив після, була натхненна сценою з фільму «Божевільний Макс: Дорога люті».

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

Мені завжди лінь робити ятати того, що я тільки що візуалізував в своїй голові, тому як тільки у мене з'являється ідея бажаного, я починаю працювати над картою висот майбутнього ландшафту

Як правило, для генерації карти висот я використовую WM2 (World Machine 2). Далі беру карти висот і кілька масок, з їх допомогою роблячи карту ваги (splat map). Використання карти ваги для ландшафтів - це старий, але як і раніше найкращий метод. Я також експортує карту висот в сітку, а потім використовую цю сітку для дизайну фонів локації. Для цього я спочатку спрощую сітку, а потім запікаю високополігональні модель в нізкополігональную, щоб у мене був нізкополігональних ландшафт і карта нормалей, які можна розмістити за межами локації і тим самим створити видимість, що локація більше, ніж насправді. Ось дві картинки, що показують різницю з фоновими моделями і без них:

Потім я використовую 3ds Max і ZBrush для створення допоміжних об'єктів для оточення. Наприклад, камені. Щоб «розпластати» камені по UV-площини, я використовую програму Unfold3D . Вона, до речі, дуже швидка. Потім я роблю плиткові текстури в UE4 за допомогою нода Object Radius, щоб щільність текселей залишалася однаковою, як би я не міняв масштаб каменю.

Потім я роблю плиткові текстури в UE4 за допомогою нода Object Radius, щоб щільність текселей залишалася однаковою, як би я не міняв масштаб каменю

До слова, у мене є одна спеціальна функція, яка дозволяє використовувати колірну інформацію певної точки ландшафту на об'єктах, які на цій точці знаходяться. Це дозволяє робити більш плавні переходи між землею і камінням.

Це дозволяє робити більш плавні переходи між землею і камінням

Найцікавіше починається після того, як я імпортують в UE4 карту висот і починаю гратися з матеріалами, функціями, освітленням, атмосферою і т.д. Я роблю купу поправок, постійно все змінюючи, поки не зловлю настрій локації.

Я використовую, як правило, 4-6 матеріалів на один пейзаж, і кінцевий результат, який можна бачити на картинках, як правило, вимагає 3 Гб пам'яті RAM (4K-текстури) і бігає з частотою від 60 до 100 кадрів в секунду на моїй 970, що непогано для світу площею в 64 квадратних кілометри, з динамічним глобальним освітленням (за допомогою LPV) і включеної теселляція (від англ. «tessellation»; це технологія, що розбиває полігони на дрібні частини, які потім можна використовувати для поліпшення якості картинки) , змінюється в залежності від відстані.

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

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

Втім, іноді для того, щоб простір не виглядало одноманітно, досить лише одного типу трави, без жодних варіацій

Я генеруючи багато рельєфу, поки не побачу той, що відповідає моєму баченню прекрасного. Я намагаюся візуалізувати те, як люди будуть орієнтуватися по цьому ландшафту - це і допомагає мені знайти найкращий рельєф.

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

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

Megascans - це дуже багате джерело матеріалів для художників оточення. Втім, цій бібліотеці поки не дістає варіативності матеріалів, тому я не покладаюся лише на неї, а використовую також CGTextures і роблю власні текстури.

Тепер до важливого. Ви про це не запитували, але, як мені здається, цим варто поділитися. Неважливо, Megascans це чи ні, але коли ви імпортуєте текстуру в движок, вона починає виглядати посередньо. У бібліотеці Megascans поверхні отрендеріть в мільйони полігонів. Найменша деталізація, все в 3D, підтримка тіней і генерація AO. Але зовсім інша справа, коли ви імпортуєте ці матеріали в ігровий движок. В ігрових движках поверхні виконані з невеликою кількістю полігонів - як правило, 2 трикутника на один квадратний метр. Але є способи це обійти. Серед художників оточення є поширена думка, що на PBR-движку металевих матеріалів не потрібна карта відображень. Також багато хто помилково думають, що на карті альбедо не повинно бути тіней. Погодитися з цим категорично не можу.

Є така штука як мікротені, і ігрові движки їх робити не вміють, тому ці мікротені потрібно додавати на карту альбедо. Щоб ви краще розуміли, що таке мікротені, погляньте на картинку нижче:

Щоб ви краще розуміли, що таке мікротені, погляньте на картинку нижче:

Якщо видалити ці тіні з карти альбедо, то ігровий движок їх реконструювати не зможе - незалежно від того, чи використовуєте ви окрему карту для AO чи ні. AO-карти ніяк не вплинуть на текстуру, якщо поверхня знаходиться під освітленням, тому що вони працюють, тільки якщо поверхня покрита тінями. Так що ці мікротені потрібно додавати на карти альбедо. Деякі люди чогось видаляють ці тіні, потім використовують окрему AO-карту, а потім об'єднують її з картою альбедо в редакторі матеріалів, але я не розумію, навіщо видаляти тіні, а потім знову їх додавати ціною додаткової AO-карти.

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

Я не використовую для цього окрему карту відображень, тому що це зайва трата обчислювальних ресурсів. Але я можу задіяти карту відображень на мапі альбедо, додавши нод Clamp (він обмежує встановлене значення в межах певного діапазону) з мінімальним значенням «0» і максимальним «0,5» ( «0,5» - це відображення на більшості неметалевих поверхонь) . Щоб додати варіативності на отриману карту відображень і зробити поверхню більш цікавою, ми можемо пропустити її через нод Power (він бере задане значення і примножує його на себе певну кількість разів), щоб зробити більш контрастною перед тим, як за роботу візьметься нод Clamp. Це дозволяє зробити поверхню більш правдоподібною, оскільки тепер діри і тріщини не відбивають світло так само, як і плоска поверхня.

Нижче - пара фотографій, які демонструють різницю між звичайною текстурою для каменю і текстурою, куди я додав зміни, про які розповів вище.

Нижче - пара фотографій, які демонструють різницю між звичайною текстурою для каменю і текстурою, куди я додав зміни, про які розповів вище

А ось те ж саме, але якщо дивитися тільки через буфер відображень.

Тут також можна було б розповісти про ефект Френеля, але оскільки цей текст і так перетворюється в «Війну і мир», то я, мабуть, утримаюся. Можливо наступного разу.

Способів оптимізувати оточення є безліч, і деякі з них я використовую для своїх пейзажів. Думаю, найкращий метод - це укладання в канали (від англ. «Channel packing»; це техніка, при якій канали R, G і B зображення використовуються для зберігання різних даних), він допомагає зберегти ресурси пам'яті і зменшити складність шейдеров. Тобто ви можете укласти три монохромні карти альбедо в одну RGB-текстуру, а потім розфарбувати кожен канал в редакторі матеріалів. Я, правда, цим методом не користуюся, тому що намагаюся зберегти оригінальну колірну інформацію. Але що я роблю, так це розміщую карту зміщення (displacement map) в синій канал карти нормалей і виставляю тип компресії на «Masks». Потім я простою математикою реконструюю синій канал карти нормалей в редакторі матеріалів, що дозволяє мені не використовувати окрему карту зміщення. Виставлення типу компресії на «Masks» знижує використання пам'яті приблизно на 50%. Я також, буває, витягаю карту нерівностей з карти альбедо і розміщую її в альфа-канал карти нормалей, але рідко - лише у випадках, коли потрібна унікальна карта нерівностей.

Що стосується сіток для каменів, то я, як правило, не економлю трикутники, і намагаюся дотримуватися рівня приблизно в 30 тисяч трикутників на камінь - це дуже допомагає занурення, якщо гравець раптом виявиться поруч з таким каменем. Крім того, я використовую, як правило, 4 або 5 рівнів деталізації - щоб при переміщенні гравця об'єкт не смикався. Крім того, я намагаюся максимально знизити кількість трикутників на рівень деталізації, при цьому зберігаючи форму, тому в мене не виходить так, що на 0-му рівні деталізації я бачу камінь, а на 5-му - базуку.

Крім того, я намагаюся максимально знизити кількість трикутників на рівень деталізації, при цьому зберігаючи форму, тому в мене не виходить так, що на 0-му рівні деталізації я бачу камінь, а на 5-му - базуку

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

Прощу вибачення, але цей розділ обіцяє бути великим. Системам для роботи з PBR-матеріалами потрібно фізичне освітлення. Я маю на увазі, що ми повинні знати, скільки саме світла ми проливаємо на наші матеріали, інакше сенс у використанні PBR для створення реалістичних ландшафтів, по суті, просто не має сенсу.

На жаль, світіння від сонця в UE4 не вимірюються в одиницях виміру на зразок люксів, тому ми, по суті, не знаємо, скільки світла випромінює на створюваний світ. Втім, є кілька способів, що дозволяють розрахувати цю величину, але результат навряд чи буде таким же задовільним, як з фізичним світлом. Тому я поділюся з вами власними знахідками. Якщо у вас хмарна погода, то вам потрібна, власне, хмарна небесна сфера і параметр «Skylight Intensity», виставлений «1». Для сонячно-хмарного дня параметр «Sun Intensity» краще виставити на «3.14», а «Skylight Intensity» має сенс трохи знизити - для підтримки хорошого контрасту між світлом і тінню. Якщо у вас менше хмар і більше сонця, то для «Sun Intensity» підійде значення «4» або «5». Для випалених пустель з нещадним сонцем параметр «Sun Intensity» можна виставити на «7».

Але я дуже не рекомендую йти вище «7», оскільки матеріали починають виглядати гірше. Люди часто ставлять «10» або навіть «12», але це помилка. У результаті або ваші текстури будуть недостатньо висвітлені (вони будуть темніші, ніж повинні), або ви станете жертвою тональної компресії (від англ. «Tone mapping»; це конвертація колірного діапазону з HDR в більш «вузький» LDR). У UE4 ця функція обмежує білий колір, тому спочатку у вас виходить дуже руда зображення, і трохи компенсувати це можна, лише сильно піднявши параметр «Sun Intensity». Але в підсумку від такого світла матеріали втрачають свою оригінальну деталізацію. Щоб впоратися з цим, але не відключаючи тональну компресію (оскільки разом з нею відключиться і купа інших функцій), я створив спеціальну таблицю - якщо завантажити її в Post Processing Volume, це поверне білі кольори назад до оригінальних позиціях, а ви зможете користуватися повним спектром яскравості (0-255).

Щоб впоратися з цим, але не відключаючи тональну компресію (оскільки разом з нею відключиться і купа інших функцій), я створив   спеціальну таблицю   - якщо завантажити її в Post Processing Volume, це поверне білі кольори назад до оригінальних позиціях, а ви зможете користуватися повним спектром яскравості (0-255)

Розібравшись з білими квітами, можна спробувати збільшити контраст картинки, щоб зробити її більш цікавою, правда через це може постраждати реалістичність. Тому, якщо ви більше схиляєтеся до «більше реалізму!», Ніж до «даєш цікаво!», То значення для контрасту краще залишити за замовчуванням або близько того.

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

Крім того, після створення карти висот і до переходу до текстуруванню / висвітленню має сенс трохи пробігтися рівню, щоб перевірити масштаб. Це дуже заощадить вам час.

Це дуже заощадить вам час

Слідкуйте за тим, щоб ваші матеріали виглядали як треба. Не бійтеся змінювати матеріали (особливо кольору), поки не досягнете повної гармонії.

Роблячи оточення для відкритих локацій, станьте першим, хто по ньому пройдеться, станьте першим, хто буде судити, чи підходить ця локація хоча б для 2-3 різних типів геймплея чи ні. Будьте першим, хто подбає про продуктивності та оптимізації. Спростіть роботу іншим.

Звертайте увагу на дрібну деталізацію, не робіть винятків. Камені, трава, галька, гори - не забувайте ні про що. Чи не перескакуйте з одного об'єкта на інший, поки гарненько його не доробили. Один добре зроблений світловий меч заслуговує більше поваги, ніж 10 посередніх локацій.

Один добре зроблений світловий меч заслуговує більше поваги, ніж 10 посередніх локацій

Створюйте модульні функції, які можна буде використовувати повторно. Це здорово економить час і зусилля, попутно покращуючи якість.

Не бійтеся робити по кілька проходів. Робіть одну версію, потім ще і ще, поки не зрозумієте, що так - це воно! І вчіться у тих, хто критикує вашу роботу.

Якщо у вас є якісь питання, можете сміливо писати мені. Але заздалегідь перепрошую, якщо з відповіддю будуть затримки. Буває, я працюю по 16 годин поспіль, забуваючи навіть почухати верхівку.

Буває, я працюю по 16 годин поспіль, забуваючи навіть почухати верхівку

Представництва сайту «80 level» в Twitter і VK .