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

Разработка игр | |

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

Это не туториал, а интервью, которое поможет представить рабочий процесс. Обучающая статья заняла бы более десяти страниц.

С оригинальным материалом можно ознакомиться тут.

01-virtual-landscapes

Введение

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

02-virtual-landscapes

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

Из того, что я делал недавно, можно выделить LawBreakers, где я делал природные фоны для уровней. Работая над Chronicles of Elyria, я был в позиции универсала, то есть создавал и игровые уровни, и рекламные шоты. Кроме того, я делал ландшафт в Squad и сейчас работаю с друзьями над Our Ghosts of War, это личный проект.

03-virtual-landscapes

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

Переход от маленьких сцен к обширным пространствам произошел, когда я впервые увидел Battlefield 3. Я был очень впечатлен этими огромными пейзажами и особенно – работой Эндрю Гамильтона. Он собаку съел на всем, что касается открытых локаций, поэтому в его работе все детали изумительны и находятся в полной гармонии друг с другом. В общем-то, в этом и есть секрет хороших открытых ландшафтов. «Не нужно недооценивать что-либо, исходя из размера. Даже маленькая галька на земле так же важна, как и огромные горы!» На тот момент я по-прежнему пользовался CryENGINE 3, но из-за недостатка инструментов для создания больших открытых пространств я таки бросил его и перешел на UE 4.0.1.

Должен признаться, что когда вы, наконец, доделываете большую открытую локацию, где все сделано до последней песчинки правильно, чувство удовлетворения гораздо сильней, чем от создания маленькой изолированной сцены. И это именно тот наркотик, который заставляет меня двигаться дальше. Я всегда жду момента, когда закончу очередную работу и смогу насладиться тем, что создал.

04-virtual-landscapes

05-virtual-landscapes

06-virtual-landscapes

Процесс создания

Работа над каждой сценой начинается с идеи, родившейся в голове, или с картинки-референса. К примеру, недавно я создал кусочек Исландии, и этот проект начался с того, что я случайно увидел классные фотки полуострова Рейкьянес. Локация, которую я сделал после, была вдохновлена сценой из фильма «Безумный Макс: Дорога Ярости».

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

07-virtual-landscapes

08-virtual-landscapes

09-virtual-landscapes

10-virtual-landscapes

Генерация ландшафта

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

11-virtual-landscapes

12-virtual-landscapes

Затем я использую 3ds Max и ZBrush для создания вспомогательных объектов для окружения. К примеру, камни. Чтобы «распластать» камни по UV-плоскости, я использую программу Unfold3D. Она, к слову, очень быстрая. Затем я делаю плиточные текстуры в UE4 при помощи нода Object Radius, чтобы плотность текселей оставалась одинаковой, как бы я не менял масштаб камня.

13-virtual-landscapes

14-virtual-landscapes

15-virtual-landscapes

К слову, у меня есть одна специальная функция, которая позволяет использовать цветовую информацию определенной точки ландшафта на объектах, которые на этой точке находятся. Это позволяет делать более плавные переходы между землей и камнями.

16-virtual-landscapes

17-virtual-landscapes

Дополнительная работа в UE4

Самое интересное начинается после того, как я импортирую в UE4 карту высот и начинаю играться с материалами, функциями, освещением, атмосферой и т.д. Я делаю кучу поправок, постоянно все меняя, пока не поймаю настроение локации.

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

Что касается тесселляции, меняющейся в зависимости от расстояния, то я создал библиотеку модульных функций, с помощью которых могу улучшить качество пейзажа, причем с очень небольшими затратами вычислительных ресурсов. Более того, эти функции универсальны, и я могу использовать их при работе с другими локациями, делая абсолютную красоту и очень быстро. Вот пара картинок, показывающих, как было до и стало после.

18-virtual-landscapes

19-virtual-landscapes

20-virtual-landscapes

21-virtual-landscapes

А вот еще одна функция, которая в качестве входной информации использует траву и на ее основе позволяет создавать бесконечное количество вариаций – не генерируя новые текстуры, а просто по-другому окрашивая траву. Впрочем, иной раз для того, чтобы пространство не выглядело однообразно, достаточно лишь одного типа травы, безо всяких вариаций.

22-virtual-landscapes

Геометрия

Я генерирую много рельефа, пока не увижу тот, что соответствует моему видению прекрасного. Я пытаюсь визуализировать то, как люди будут ориентироваться по этому ландшафту – это и помогает мне найти наилучший рельеф.

Другая важная вещь – это масштаб, поскольку погружение сильно зависит от того, насколько велика, к примеру, вон та гора или вон та песчаная дюна. Нужно, чтобы все эти горы, холмы и прочее оставались одного масштаба, который не будет слишком большим или слишком маленьким, а также держать в уме геймплей. То есть локация должна быть не только красивой, но и подходящей для геймплея.

К сожалению, при создании карты высот в WM2 трудно уловить чувство масштаба, и эта программа больше не обновляется. Поэтому я просто импортирую карту высот в UE4 и немного бегаю туда-сюда, чтобы понять, правильный ли получился масштаб. Потом вы немного привыкаете к этому масштабу и далее просто доверяете своему выбору.

Текстуры

Megascans – это очень богатый источник материалов для художников окружения. Впрочем, этой библиотеке пока не достает вариативности материалов, поэтому я не полагаюсь лишь на нее, а использую также CGTextures и делаю собственные текстуры.

23-virtual-landscapes

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

Есть такая штука как микротени, и игровые движки их делать не умеют, поэтому эти микротени нужно добавлять на карту альбедо. Чтобы вы лучше понимали, что такое микротени, взгляните на картинку ниже:

24-virtual-landscapes

Если удалить эти тени с карты альбедо, то игровой движок их реконструировать не сможет – независимо от того, используете ли вы отдельную карту для AO или нет. AO-карты никак не повлияют на текстуру, если поверхность находится под освещением, т.к. они работают, только если поверхность покрыта тенями. Так что эти микротени нужно добавлять на карты альбедо. Некоторые люди зачем-то удаляют эти тени, затем используют отдельную AO-карту, а затем объединяют ее с картой альбедо в редакторе материалов, но я не понимаю, зачем удалять тени, а затем снова их добавлять ценой дополнительной AO-карты.

Эти микротени представляют собой трещины и дыры в поверхности, и они, как правило, всегда темные, потому что свет от них почти не отражается. Но есть один момент. Если у вас за отражение отвечает одно и то же значение, это значит, что вся поверхность отражает свет одинаково, и это, если принять во внимание пример выше, неправильно, потому что от этих дыр и трещин света практически не отражается, поэтому значение отражения для этих дыр и трещин должно быть меньше, чем для плоской поверхности.

25-virtual-landscapes

Я не использую для этого отдельную карту отражений, т.к. это лишняя трата вычислительных ресурсов. Но я могу задействовать карту отражений на карте альбедо, добавив нод Clamp (он ограничивает заданное значение в пределах определенного диапазона) с минимальным значением «0» и максимальным «0,5» («0,5» – это отражение на большинстве неметаллических поверхностей). Чтобы добавить вариативности на получившуюся карту отражений и сделать поверхность более интересной, мы можем пропустить ее через нод Power (он берет заданное значение и умножает его на себя определенное количество раз), чтобы сделать более контрастной перед тем, как за работу примется нод Clamp. Это позволяет сделать поверхность более правдоподобной, поскольку теперь дыры и трещины не отражают свет так же, как и плоская поверхность.

Ниже – пара фотографий, демонстрирующих разницу между обычной текстурой для камня и текстурой, куда я добавил изменения, о которых рассказал выше.

26-virtual-landscapes

27-virtual-landscapes

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

28-virtual-landscapes

29-virtual-landscapes

Здесь также можно было бы рассказать об эффекте Френеля, но поскольку этот текст и так превращается в «Войну и мир», то я, пожалуй, воздержусь. Может быть, в следующий раз.

Оптимизация

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

Что касается сеток для камней, то я, как правило, не экономлю треугольники, и стараюсь придерживаться уровня примерно в 30 тысяч треугольников на камень – это очень помогает погружению, если игрок вдруг окажется рядом с таким камнем. Кроме того, я использую, как правило, 4 или 5 уровней детализации – чтобы при перемещении игрока объект не дергался. Кроме того, я стараюсь максимально снизить количество треугольников на уровень детализации, при этом сохраняя форму, поэтому у меня не получается так, что на 0-ом уровне детализации я вижу камень, а на 5-ом – базуку.

30-virtual-landscapes

О другом способе я уже рассказывал выше – это функция для травы. Смысл в том, что я использую для травы одну текстуру и одну сетку, а затем делаю много разных вариаций, чтобы покрыть ими сотни метров вокруг игрока, причем тот не замечает, что это, по сути», «клоны» одной и той же травы.

Освещение

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

31-virtual-landscapes

К сожалению, свечение от солнца в 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).

32-virtual-landscapes

Разобравшись с белыми цветами, можно попробовать увеличить контраст картинки, чтобы сделать ее более интересной, правда из-за этого может пострадать реалистичность. Поэтому, если вы больше склоняетесь к «больше реализма!», чем к «даешь интересно!», то значение для контраста лучше оставить по умолчанию или около того.

Совет

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

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

33-virtual-landscapes

Следите за тем, чтобы ваши материалы выглядели как надо. Не бойтесь менять материалы (особенно цвета), пока не достигнете полной гармонии.

Делая окружение для открытых локаций, станьте первым, кто по нему пройдется, станьте первым, кто будет судить, подходит ли эта локация хотя бы для 2-3 разных типов геймплея или нет. Будьте первым, кто позаботится о производительности и оптимизации. Упростите работу другим.

Обращайте внимание на мелкую детализацию, не делайте исключений. Камни, трава, галька, горы – не забывайте ни о чем. Не перескакивайте с одного объекта на другой, пока хорошенько его не доделаете. Один хорошо сделанный световой меч заслуживает больше уважения, чем 10 посредственных локаций.

34-virtual-landscapes

Создавайте модульные функции, которые можно будет использовать повторно. Это здорово экономит время и усилия, попутно улучшая качество.

Не бойтесь делать по несколько проходов. Делайте одну версию, потом еще и еще, пока не поймете, что да – это оно! И учитесь у тех, кто критикует вашу работу.

Если у вас есть какие-то вопросы, можете смело писать мне. Но заранее извиняюсь, если с ответом будут задержки. Бывает, я работаю по 16 часов подряд, забывая даже почесать макушку.

35-virtual-landscapes

Представительства сайта «80 level» в Twitter и VK.

Владимир FrostBite Хохлов frostbite@progamer.ru

Поделиться

Обсудить