Хотя статьи и выходят под названием «история разработки нашего рендера», здесь мы рассказываем не только о работе над непосредственно рендером, но и о работе над другими аспектами клиента игры, так что не удивляйтесь. Можете воспринимать это просто как дневники разработки.
Отражения и PBR
Не раз мы читали под нашими скриншотами сообщения вроде «в MTA/GTA SA нет отражений». Да, таких отражений, как у нас — нет (хотя и в GTA SA есть, например, зеркала и зеркальный пол). Но у нас всё достаточно серьёзно переработано и мы сделали Screen Space Reflections (к слову, на первой версии рендера такие отражения было бы сделать очень и очень проблематично, если вообще возможно).
На этих ранних скриншотах сцена не настроена (нет источников освещения, не учитывается окружение), а также видны мелкие артефакты (мелкие квадратики) на поверхностях — это из-за того, что текстуры нормалей сжаты, а поддержку сжатия в рендер на тот момент ещё не добавили. Но в целом, отражения достаточно хорошо видны.
Немного технических подробностей. До этого нормали сжимались алгоритмом DXT5, как и обычные текстуры. Но у такого вида сжатия не хватает точности для хранения нормали. Поэтому мы добавили поддержку BC5 (по сути, это два совмещенных DXT3), которая сильно повышает точность и нормали выглядят корректно.
А вот более поздний вариант — добавлена поддержка сжатия, вследствие чего исчезли артефакты на поверхностях, а также в отражения добавлен учёт окружения, благодаря чему сцена стала выглядеть заметно лучше.
Если присмотреться внимательнее ко второму скриншоту, то на полотенцах можно заметить графические артефакты в виде небольших светлых горизонтальных полосочек:
Забавно, но это не баги графического движка, как можно было бы подумать. На самом деле это медузы, которых вы наверняка не раз видели под водой в GTA SA 😀
А это — тестовая сцена, на которой хорошо виден результат PBR. Все эти потёртости на металле в динамике выглядят ещё круче!
Помните, как эта сцена выглядела в предыдущей статье? Ну вот, добавили отражения, расставили несколько источников света и сцена заметно преобразилась, не правда ли? И стоит заметить, что это — далеко не самый лучший результат, который можно получить.
А это уже более-менее финальный вариант отражений. Сцена не настроена и отражения специально выкручены «на максимум», чтобы их можно было лучше рассмотреть.
Зернистость отражений — характерная особенность SSR. Кстати, эту зернистость можно заметить на многих наших скриншотах, достаточно увеличить изображение на каком-нибудь отражении.
Чтобы полностью избавиться от этой зернистости, нужно использовать рейтрейсинг. У нас его ещё нет, но он запланирован в отдалённом будущем (увы, цены на RTX видеокарты как-то не способствуют активному развитию в этом направлении).
Ландшафт
Обычный путь, который используется для создания ландшафтов для GTA SA — это моделирование в каком-то редакторе (3ds Max, Blender и т.п.), затем нарезка его на части размером не более 256×256 метров и после — перенос этих мешей в игру. И при необходимости внесения любого изменения весь этот процесс нужно повторять снова и снова. В общем, сложно, долго, жутко неудобно и запросто может приводить ко всяким проблемам вроде зазоров между кусками ландшафта, провалам, невидимым стенам и другим проблемам, которые могут добавить большое количество головной боли.
Мы решили пойти другим путём и создать собственную систему ландшафта, которая не будет ограничена в размерах (да, можно делать хоть тысячу на тысячу километров), легко поддаётся изменениям, слабо нагружает систему и удобна для моделлеров. Сказано — сделано!
За основу ландшафтной системы мы взяли то, как реализован ландшафт в Unreal Engine. Фактически, наша система полностью воспроизводит результат, созданный в UE. Впрочем, это касается не только ландшафта — мы уже упоминали, что активно используем UE для разработки проекта (в частности, настраиваем в нём все материалы, освещение, отражения, компонуем карту и т.п., но об этом расскажем как-нибудь в другой раз). В своём проекте мы полностью пытаемся повторить ту картинку, которую выдаёт Unreal Engine и, как видно по скриншотам в группе, отлично справляемся с этой задачей.
Пример, на котором созданный в UE ландшафт один к одному воспроизводится в MTA (небольшая разница в цвете обусловлена освещением). И наша система поддерживает почти все возможности, которые есть у ландшафта UE.
Стандартная система GTA SA для физики использует коллизии, сохранённые в col файлах. Также она используется для того, чтобы задавать различные свойства поверхностей: внешний вид (где растёт трава, например), звуки, тени, а так же определяет, видим ли объект на экране.
Для того, чтобы динамически создавать ландшафт, нам пришлось модифицировать эту систему, чтобы была возможность создавать коллизии «на лету», причём, произвольного размера, не ограничиваясь максимальными для GTA SA 256×256 метров (это не совсем верно, так как и в стандартной GTA SA можно использовать гораздо более крупные коллизии, но вряд ли можно рекомендовать это делать, потому что как раз за счёт этой «нарезки» производится значительная часть оптимизации).
Более того, мы прикрутили современный физический движок к ландшафту, что дало нам многопоточность в обработке столкновений с ландшафтом, возможность динамически менять ландшафт (в том числе, копать ямы, например) и некоторые другие вещи, о которых мы расскажем в будущем.
Сам ландшафт рисуется небольшими частями с разным качеством — те, что ближе, рисуются с максимальной детализацией, и чем дальше от камеры, тем ниже качество. Называется эта технология Continuous Geo-MipMap LOD.
В специальном отладочном режиме хорошо видна полигональная сетка ландшафта.
Тут уже добавлено плавное смешивание разных уровней LOD’ов, что даёт превосходный конечный результат.
GUI
Из-за способа, который мы применили, чтобы перевести игру на DirectX11/12, мы не могли использовать обычные GUI системы для MTA, так как это очень сильно снижает производительность в нашем случае. Нам требовалось интегрированное непосредственно в клиент игры решение, напрямую работающее с DirectX11/12. Мы проверили множество доступных вариантов и остановились на совершенно нетипичном для GTA SA решении — NoesisGUI.
Это современное продвинутое GUI, основанное на XAML, поддерживающее векторную графику, сложные анимации, темы и многое другое. А самое интересное — интерфейсы строятся не непосредственно в коде игры, а в специальных конфиг-файлах. Это значит, что изменение и создание новых интерфейсов значительно упрощается. А проверять их работоспособность можно даже в браузере, не запуская игру.
Подключение NoesisGUI к MTA заняло всего несколько дней, а вот интеграция с Lua потребовала значительно больше времени. Всего на это ушёл примерно месяц
Только не просите нас сейчас показывать наши интерфейсы 🙂 Покажем, когда будем готовы 🙂
На сегодня, пожалуй, всё! Увидимся в следующей части!