История разработки нашего рендера #2

Версия вторая, которую мы разрабатываем для нашего проекта ReflectRP.

Для того, чтобы избежать потенциальных проблем с бывшим работодателем, ReflectRP было решено делать полностью с нуля, не используя ничего из того, что мы делали для RPBOX. Это же касается и системы рендера. Запланировали использовать систему с совершенно другим подходом, а заодно получить несравнимо более качественный результат.

Как известно, GTA SA работает на DirectX 9, который был выпущен в далёком 2002 году. Естественно, что за эти почти 19 лет, прошедшие с того момента, появилось множество технологий — как программных, так и аппаратных, — дающих множество преимуществ как разработчикам, так и простым пользователям.

Поэтому первым делом мы перевели GTA SA на DirectX 11/12. Хотя это и звучит так просто, работа была проделана огромнейшая (что заняло где-то в районе полугода работы), так как вся MTA «заточена» под DX9. То есть, если переключить игру на DX11/12, то почти весь функционал MTA, связанный с графикой, перестанет работать и нет какого-то простого эффективного способа обойти эту проблему. Однако, мы успешно справились с этой задачей, что позволило нам сделать кучу оптимизаций, использовать современные средства разработки и получить качественный результат. А некоторые вещи без этого было бы сделать вообще невозможно.

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

Тени

После перехода на DX11/12 мы начали работу над тенями. Сначала это просто чёрные пятна

к которым позже добавляется прозрачность

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

Если кому-то интересны технические подробности, то тени уже на тот момент поддерживали до восьми каскадов (в предыдущей версии было максимум четыре), сглаживание швов, сглаживание PCF с различными настройками зерна, алгоритмы подстраивания и оптимизации каскадов для наилучшего соотношения пикселей теневой карты на растеризуемый тексель, а также возможность выбирать различные типы теневых карт, в зависимости от возможностей железа.

Небо

Следующим шагом стала работа над небом.

Пока что базовым — без облаков, солнца, луны и звёзд. Казалось бы, а что в таком случае там ещё осталось? Всё очень просто — осталась атмосфера. В зависимости от времени суток у нас корректно рассчитывается цвет неба и атмосферное рассеивание света.

Кто-то из вас наверняка видел подобное небо в Unreal Engine или Unity, либо в играх, сделанных на этих движках (есть даже те, кто думал, что скрины с одного из этих движков, видя такое небо). А кто-то скажет: «просто какой-то туман, чего такого?». Но нет, это не простой туман. Вот пара картинок из интернета, показывающих, что даёт атмосферное рассеивание:

Красота, не правда ли? Вот и у нас это будет, когда завершим работу*.

*Хотя мы стараемся рассказывать о проделанной работе в хронологическом порядке, на момент публикации данной статьи атмосферное рассеивание всё ещё не закончено до конца — требуются кое-какие доработки и настройка, чем мы будем заниматься уже ближе к открытию проекта, а потому подобных скриншотов именно с нашей карты в ближайшее время ждать не следует.

PBR

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

Уличные сцены даже без пост-обработки выглядят неплохо, не правда ли? Если бы здесь было самозатенение (Ambient Occlusion) и сглаживание, то было бы уже почти то же самое, что на скриншотах, которые вы видели в группе. А вот интерьеры на этой стадии смотрятся заметно хуже из-за отсутствия сглаживания, настроенных источников света и отражений.

Производительность

С учётом того, что модели на нашей карте проработаны гораздо детальнее, чем в других проектах, основанных на GTA SA, объёмы ресурсов выходят на совершенно другой уровень. И, разумеется, что игра просто не может справиться с такими объёмами данных.

Чтобы всё работало, нам пришлось также существенно переработать множество вещей в GTA SA и MTA. Например, мы используем собственные форматы моделей и текстур.

Существующий инструментарий для GTA SA/MTA также непригоден для работы над проектом нашего уровня — для этого нам пришлось адаптировать современные инструменты и разрабатывать свои собственные. И это тоже огромный объём работы. Возможно, что обо всём этом мы также когда-нибудь расскажем.

Почти три миллиона треугольников при средних 100 FPS. Как уже говорилось, на данной стадии разработки, сцены в интерьерах выглядят невзрачно из-за отсутствия сглаживания, настроенных источников света и отражений (ну и мы решили не тратить время, расставляя и настраивая источники света в тестовых сценах — даже не думали, что кто-то кроме нас увидит эти скриншоты).

Ambient Occlusion и сглаживание

Следующим этапом у нас шла работа над самозатенением (Ambient Occlusion) и сглаживанием. Для разных по мощности компьютеров делается несколько разных алгоритмов — быстрые, но с менее качественным результатом, и медленные, но с отличным качеством.

Если интересны технические подробности, то на момент написания статьи для сглаживания поддерживаются SMAA 1x, SMAA 1x + TSSAA и SMAA 4x, а для Ambient Occlusion — SSAO, HBAO и Alchemy AO.

Но прямо на этом этапе разработки нашей системы рендера реализовывались только самые базовые алгоритмы.

Результат простого сглаживания:

А это результат работы базового алгоритма самозатенения:

Затем полученное изображение используется при рисовании финальной картинки: белый цвет остаётся без изменений, а тёмный как раз добавляет затенение.

Совмещаем самозатенение и сглаживание, что значительно улучшает результат:

Что было дальше?

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