Как создавалось окружение для игры Soldiers Inc: Mobile Warfare
Придумать игровой мир непросто. Создать мир, который поместится на экран мобильного телефона, – еще сложнее. Ольге Менделис, Environment Artist в Plarium Kharkiv, это удалось. В статье она рассказала, как смоделировать реалистичное окружение и найти баланс между качеством и техническими требованиями.
Мы готовили мобильный проект в сеттинге «милитари будущего». Перед командой стояла задача придумать глобальную карту и сектор игрока: ландшафт, климат и флору. Нужно было всё детально проработать и оптимизировать под Unity.
Практически сразу мы определились, что это будут тропики и скалистая местность (постройки всегда выгодно смотрятся на фоне зелени и песка), и начали сбор референсов.
Очень полезной оказалась программа PureRef – в нее легко добавлять изображения из браузера и скриншоты из разных программ, а также компоновать их. Легко менять размер рабочего окна, нет мешающего UI, и ее можно расположить поверх всех окон.
Поиск референсов начинали с фотографий реальных мест на планете. На этом этапе можно проанализировать, какие детали просматриваются в конкретной среде. Например, для скал в каньоне могут быть характерны сильные разрушения у основания и блок больших масс по середине. Или как растительность изменяется по форме и цвету с высотой местности.
Следующие этапы разработки проходили в тесном общении Environment, Concept и Technical Artists. Ведь, помимо эстетических, к моделям предъявлялись жесткие технические требования.
Хотя уровень производительности устройств постоянно растет, общий размер билда игры не должен превышать 100 Мбайт. А окружение – часть этой сборки. Также мы старались оптимизировать скорость рендеринга для экономии батареи и сохранения планки в 30 fps на как можно большем количестве устройств.
Мы использовали смешение тайловых текстур. В качестве основной маски выбрали Vertex Color, а для более интересных переходов – текстуру глубины, которая находилась в альфа-канале основной текстуры. Этот подход позволил добиться относительно разнообразного рисунка на поверхностях ландшафта при использовании всего нескольких текстур небольшого разрешения.
Начали мы с сектора игрока – это первое, что видит пользователь, когда заходит в приложение. Определились с цветовой гаммой, самой идеей местности и композицией. Очень простыми формами обозначили дизайн: как будут располагаться скалы, растения, река, как можно разместить вертолетные площадки, защитные вышки или пушки.
Скалы
Для лепки скал подходят кисти с различными альфа-каналами фактур и трещин, а также Trim Smooth Border, Orb Cracks, Planar. Основная форма скал создавалась на меше с малым количеством полигонов. Использовались в основном кисти Clay Polish для наращивания форм и Trim Smooth Border для их полировки. Когда основные блоки и разломы вырисовались, начали дорабатывать меш на high-poly (несколько миллионов полигонов), добавляя трещины и самые мелкие детали.
Основная задача состояла в том, чтобы текстура хорошо тайлилась, а повторение деталей не бросалось в глаза. Сначала несколько частей скалы мы смоделировали в ZBrush. Затем расставили их на плейне и сняли Heightmap. Эту карту затайлили в Photoshop с помощью Offset и штампа и опять назначили на плейн в ZBrush в качестве дисплейсмента. В месте, где карта затиралась в Photoshop, образовались видимые дефекты. На это место мы опять поставили куски скал. Не самый простой способ, но мы смогли экспериментировать с ритмичным чередованием элементов и разным расположением масс.
В итоге у нас были заготовки, при комбинации которых мы получали разные текстуры. А после выбрали наиболее подходящую.
Диффуз-текстуру рисовали в Photoshop, используя маски, полученные из Normal Map (Cavity, Ambient Occlusion), смешивая фактуры скал и добавляя траву.
Трава
Травинки и листики создавались в 3ds Max – от моделинга до рендера. Размножили их при помощи MultiScatter – и получили фактически готовую текстуру, которую оставалось только затайлить.
Песок
Текстура песка сделана в Substance Designer. Программа позволяет быстро создавать варианты текстур, подбирать красивую раскладку тайла, сразу получать маски для смешивания текстуры в шейдере Unity.
Растения
Создание растительности было одним из самых сложных этапов. Нужно было рисовать реалистичные тропики с жестким ограничением по полигонам, и при этом мы не могли использовать альфу.
Для начала мы создали библиотеку растений и текстур, опираясь на референсы. В ZBrush из моделей листьев high-poly мы делали middle-poly c помощью ZRemesher. После сделали развертку и нарисовали текстуру. Затем скомпоновали эти листья в интересные группы и таким образом запекали различные текстуры.
Для леса мы не делали отдельные деревья, а изначально создали low-poly массу леса и разбавили ее более детализированными веточками.
Вращение игровой камеры не позволяло нам запечь лес на плейны, иначе было бы видно, что лес – это плоская картинка с текстурой.
Освещение
Для имитации освещения мы использовали Lightmap. В нашем случае каналы Lightmap использовались для разных погодных условий и, соответственно, были черно-белыми. Окрашивались они градиентно между двумя цветами солнечной и теневой области. Так мы сэкономили на количестве и размере текстур, сохранив визуальное качество и производительность игры.
Глобальная карта
Было решено, что глобальная карта должна быть объемной и вращаться на 360 градусов. Нам нужен был привлекательный дизайн, который служил бы фоном для секторов и дополнительных построек, ведь именно они главные элементы на карте и должны выделяться прежде всего.
Ко всей графике у нас были жесткие технические ограничения, чтобы в игру можно было играть практически на любых устройствах. Для качественного батчинга мы сделали карту одним шейдером в движке игры. Вся поверхность и дополнительные элементы собирались из одного атласа текстур без Lightmap и физического освещения.
Мы отрисовали береговую линию, равнинную местность и возвышения. Землю разбавили дополнительными тайлами травы и пропсами – небольшими камнями, озерами, следами от взрывов, деревьями. А потом из этих элементов собрали большую карту мира – как конструктор.
Для создания плато и берега был смоделирован блок из трех частей, затайленных между собой, и каждый кусочек развернут на квадрат. Затем из полученных low-poly сняли Heightmap, которую использовали для создания детализированного плато в World Machine. Например, горы, которые разбавляют землю, делались сразу от и до в этой программе. Маски для текстурирования были взяты из нее же. Сама текстура для high-poly была создана в фотошопе из этих масок.
Запеклось всё в 3ds Max с high-poly на уже готовые low-poly как Complete Map, и было затайлено между собой при помощи Mudbox.