Skip links

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

Версия вторая, которую мы разрабатываем для нашего проекта ReflectRP.
Для того, чтобы избежать потенциальных проблем с бывшим работодателем, ReflectRP было решено делать полностью с нуля, не используя ничего из того, что мы делали для RPBOX. Это же касается и системы рендера. Запланировали использовать систему с совершенно другим подходом, а заодно получить несравнимо более качественный результат.
Как известно, GTA SA работает на DirectX 9, который был выпущен в далёком 2002 году. Естественно, что за эти почти 19 лет, прошедшие с того момента, появилось множество технологий — как программных, так и аппаратных, — дающих множество преимуществ как разработчикам, так и простым пользователям.
Поэтому первым делом мы перевели GTA SA на DirectX 11/12. Хотя это и звучит так просто, работа была проделана огромнейшая (что заняло где-то в районе полугода работы), так как вся MTA «заточена» под DX9. То есть, если переключить игру на DX11/12, то почти весь функционал MTA, связанный с графикой, перестанет работать и нет какого-то простого эффективного способа обойти эту проблему. Однако, мы успешно справились с этой задачей, что позволило нам сделать кучу оптимизаций, использовать современные средства разработки и получить качественный результат. А некоторые вещи без этого было бы сделать вообще невозможно.
Современные средства отладки графики на службе у GTA SA
Например, у нас очень низкое потребление памяти игрой, ведь теперь в полной мере используются все возможности видеопамяти — нет необходимости дублировать модели и текстуры в основной памяти.
Тени
После перехода на DX11/12 мы начали работу над тенями. Сначала это просто чёрные пятна
к которым позже добавляется прозрачность
это самые ранние скриншоты, но даже здесь видно, что тени более качественные, чем в первой версии рендера.
Если кому-то интересны технические подробности, то тени уже на тот момент поддерживали до восьми каскадов (в предыдущей версии было максимум четыре), сглаживание швов, сглаживание PCF с различными настройками зерна, алгоритмы подстраивания и оптимизации каскадов для наилучшего соотношения пикселей теневой карты на растеризуемый тексель, а также возможность выбирать различные типы теневых карт, в зависимости от возможностей железа.
Небо
Следующим шагом стала работа над небом.
Пока что базовым — без облаков, солнца, луны и звёзд. Казалось бы, а что в таком случае там ещё осталось? Всё очень просто — осталась атмосфера. В зависимости от времени суток у нас корректно рассчитывается цвет неба и атмосферное рассеивание света.
Атмосферное рассеивание
Кто-то из вас наверняка видел подобное небо в Unreal Engine или Unity, либо в играх, сделанных на этих движках (есть даже те, кто думал, что скрины с одного из этих движков, видя такое небо). А кто-то скажет: «просто какой-то туман, чего такого?». Но нет, это не простой туман. Вот пара картинок из интернета, показывающих, что даёт атмосферное рассеивание:
Атмосферное рассеивание. Изображение с просторов интернета
Красота, не правда ли? Вот и у нас это будет, когда завершим работу*.
*Хотя мы стараемся рассказывать о проделанной работе в хронологическом порядке, на момент публикации данной статьи атмосферное рассеивание всё ещё не закончено до конца — требуются кое-какие доработки и настройка, чем мы будем заниматься уже ближе к открытию проекта, а потому подобных скриншотов именно с нашей карты в ближайшее время ждать не следует.
PBR
Следующий шаг — добавление PBR, физически корректного рендеринга. Это современный стандарт, позволяющий получить фотореалистичное изображение: металл будет выглядеть металлом, стекло — стеклом, кожа — кожей, дерево — деревом и т.п. То есть, этот стандарт позволяет достоверно воспроизводить оптические свойства поверхностей.
Интерьеры на этой стадии смотрятся хуже из-за отсутствия сглаживания, источников света и отражений.
Уличные сцены даже без пост-обработки выглядят неплохо, не правда ли? Если бы здесь было самозатенение (Ambient Occlusion) и сглаживание, то было бы уже почти то же самое, что на скриншотах, которые вы видели в группе. А вот интерьеры на этой стадии смотрятся заметно хуже из-за отсутствия сглаживания, настроенных источников света и отражений.
Производительность
С учётом того, что модели на нашей карте проработаны гораздо детальнее, чем в других проектах, основанных на GTA SA, объёмы ресурсов выходят на совершенно другой уровень. И, разумеется, что игра просто не может справиться с такими объёмами данных.
Чтобы всё работало, нам пришлось также существенно переработать множество вещей в GTA SA и MTA. Например, мы используем собственные форматы моделей и текстур.
Существующий инструментарий для GTA SA/MTA также непригоден для работы над проектом нашего уровня — для этого нам пришлось адаптировать современные инструменты и разрабатывать свои собственные. И это тоже огромный объём работы. Возможно, что обо всём этом мы также когда-нибудь расскажем.
Тестовая сцена. Почти три миллиона треугольников при средних 100 FPS
Почти три миллиона треугольников при средних 100 FPS. Как уже говорилось, на данной стадии разработки, сцены в интерьерах выглядят невзрачно из-за отсутствия сглаживания, настроенных источников света и отражений (ну и мы решили не тратить время, расставляя и настраивая источники света в тестовых сценах — даже не думали, что кто-то кроме нас увидит эти скриншоты).
Ambient Occlusion и сглаживание
Следующим этапом у нас шла работа над самозатенением (Ambient Occlusion) и сглаживанием. Для разных по мощности компьютеров делается несколько разных алгоритмов — быстрые, но с менее качественным результатом, и медленные, но с отличным качеством.
Если интересны технические подробности, то на момент написания статьи для сглаживания поддерживаются SMAA 1x, SMAA 1x + TSSAA и SMAA 4x, а для Ambient Occlusion — SSAO, HBAO и Alchemy AO.
Но прямо на этом этапе разработки нашей системы рендера реализовывались только самые базовые алгоритмы.
Результат простого сглаживания:
Результат работы простого алгоритма сглаживания
А это результат работы базового алгоритма самозатенения:
Результат работы самого простого алгоритма Ambient Occlusion
Затем полученное изображение используется при рисовании финальной картинки: белый цвет остаётся без изменений, а тёмный как раз добавляет затенение.
Совмещаем самозатенение и сглаживание, что значительно улучшает результат:
Что было дальше?
Позже мы добавляли более качественные алгоритмы самозатенения и сглаживания, вели серьёзную работу над динамическим освещением, прозрачными объектами, отражениями, тесселяцией и многим другим, но об этом мы расскажем в следующих частях.