Сегодня исполняется 100 лет со дня рождения Андрея Сахарова, отца советского термоядерного оружия, одного из ведущих создателей самой мощной бомбы в истории человечества АН602. Благодаря труду этого ученого и многих других физиков, математиков и инженеров, СССР достиг ядерного паритета в Холодной Войне, и тем самым сделал бессмысленным её переход в горячую стадию.
В предыдущем материале мы рассказали о том, как создавался волюметрический эффект грибовидного облака
Проблема окружающего мира
Атомный взрыв — это нечто совершенно выдающееся, то, что должно потрясти маленький игровой мир до основания и затронуть все элементы окружения. Мир должен разделиться на «до» и «после» — так, как оно происходило в реальной жизни.
Световая вспышка озаряет все пространство в радиусе десятков километров, будучи видимой сквозь облака и туман. По мере прохождения ударной волны облака из-за локального нагрева испаряются, а затем конденсируются заново. Во влажную погоду возможна конденсация облаков и куполов из воздуха, как это происходило во время испытаний Crossroads "Able" или РДС-3 .
Прохождение ударной волны по земной поверхности сопровождается поднятием облаков пыли. Ударная волна взрыва распространяется на дистанции в несколько километров, воздействуя на деревья, здания и другие объекты, разрушая их. Число объектов, одновременно затронутых ударной волной, измеряется тысячами.
Реализация этих воздействий хотя бы на визуальном уровне является сложной задачей со множеством аспектов, и по части внешнего вида, и по части производительности. Серьезной проблемой и отличием эффекта от остальных является его огромный размер: любая микродеталь по факту является и макродеталью тоже. Поэтому изменение алгоритма и его настройка для улучшения какого-то одного аспекта (например, воздействие волны в городской застройке) может привести к снижению качества в других ситуациях. А усложнение алгоритма за счет разных веток для разных ситуаций серьезно снижает производительность шейдеров.
Ударная волна
Реализация пыли и дыма, поднятого взрывом, как полноценного волюметрика, будет слишком затратной в производительности — детали такого волюметрика будут иметь характерные размеры в десятки метров, при этом сам эффект будет иметь в поперечнике более десяти километров. Поэтому было принято решение реализовать ударную волну и пылевые облака в виде декали, накладываемой на все остальные объекты сцены. Для типовых изометрических ракурсов подобный подход внешне практически ничем не отличается от полноценного волюметрического прохода.
Но, когда камера опускается на уровень земли, неоднородность становится хорошо заметной. Вполне возможно, что в будущем будет добавлен еще один проход, как раз для этих случаев.
Для того, чтобы поднятая с земли пыль лучше соответствовала ландшафту, в качестве диффузного цвета для нее используется самый грубый лод виртуальной текстуры земли, интерполированный в сторону серо-коричневого "пыльного" цвета. В большинстве случаев такой цвет получается адекватным.
Облака и конденсационные купола
Для отображения воздействия атомного взрыва на небо был написан вариант шейдера облаков, в котором функция плотности подвергается возмущению ударной волной. В некотором радиусе от эпицентра облака испаряются. Также, в этом шейдере было реализовано освещение облаков мощной световой вспышкой взрыва. Разумеется, подобная модификация шейдера заметно увеличила время его выполнения (в среднем в полтора раза), особенно для погоды с малым числом облаков (ведь проходящая ударная волна создает новые облака в пустом пространстве).
Создание конденсационных куполов вокруг взрыва потребовало написание нового волюметрика, так как эти купола располагаются ниже слоя облаков и обладают более тонкой детализацией. Эта детализация, как и в случае оригинального атомного взрыва, обеспечена трехкратным применением перлиновского шума в полярных координатах.
Для того, чтобы окружающий грибовидное облако конденсационный купол корректно отображался, купол был разделен на две части, одна из которых рисуется до волюметрика взрыва, а вторая после.
Само появление конденсационных куполов и их конфигурация случайны. Но вероятность их появления и длительность сильно зависит от влажности воздуха (являющейся одним из параметров погоды) и концентрации облаков на локации, поэтому во влажную и туманную погоду они будут появляться почти всегда.
Разрушение
Одним из самых трудносимулируемых эффектов атомного взрыва является разрушение объектов, попавших под ударную волну. Для ударной волны атомного взрыва характерны не только колоссальные размеры, но и высокий скоростной напор, швыряющий обломки в сторону от эпицентра.
Для игры со свободной камерой, вроде War Thunder, требуется показать разрушение всех объектов. Нельзя выбрать какой-то один ракурс или одну группу объектов, разрушение требуется всему на всех локациях. Ситуация усложняется тем, что большой процент ассетов вообще не имеет анимаций разрушения или разрушенного состояния. А даже если эти анимации имеются, то они реализованы на клиент-серверной архитектуре и выполняются на CPU, и одновременная анимация тысяч объектов мгновенно выберет весь ресурс производительности.
С другой стороны, атомный взрыв в текущей реализации является актом завершения игровой сессии, поэтому синхронизация данных с CPU или с сервером не нужна, и разрушение может быть реализовано как чисто визуальный эффект. И огромный объем вычислений траекторий и анимаций можно переложить на видеокарту.
Если при создании самого грибовидного облака можно было пользоваться большим числом кадров атомных испытаний, то референсов разрушения намного меньше. Тем не менее, во многих испытаниях проводилось измерение воздействия ударной волны на сооружения, и некоторые кадры этих испытаний находятся в публичном доступе.
На текущий момент нет технической возможности реализовать поражающий эффект светового излучения в виде воспламенения и дымления поверхностей — реализовано только освещение и обугливание. Поэтому на этом этапе разработки было принято решение увеличить поражающую мощь ударной волны для зрелищности эффекта. При фактической мощности взрыва 40 килотонн ударная волна соответствует взрыву в 100 кт.
Необходимость весьма специфической анимации разрушения абсолютно для всех объектов сцены, включая неразрушимые, потребовала специфического решения. Анимация разрушения выполняется с помощью геометрического шейдера, разбивающего ассеты на отдельные полигоны, которые далее летят по индивидуальным траекториям.
Траектория каждого обломка рассчитывается, исходя из силы ударной волны на заданном расстоянии. В зависимости от высоты поражаемого объекта и силы волны рассчитывается «линия среза». Чем выше объект и чем слабее волна, тем выше располагается «линия среза». Для плотной городской застройки это имитирует гашение ударной волны у земли при сохранении поражающей силы на высоте. Но в общем случае это предположение о прочности неверно и требует серьезной доработки.
Заранее запеченная карта высот местности вокруг взрыва используется для остановки падающих обломков, но сама траектория движения – это равноускоренное движение материальной точки, и никакой реальной физики столкновения обломков и земной поверхности нет. Во время движения каждый треугольник вращается в двух координатных плоскостях до момента остановки.
Крупные полигоны генерируют до трех полигонов-обломков, с тем же размером, но далее в пиксельном шейдере в шахматном порядке происходит их отсечение. Это хорошо скрывает полигональную топологию разрушения для относительно небольших треугольников. На крупных треугольниках «шахматы» просматриваются явно.
Цена разрушения
Геометрические шейдеры в игровой индустрии практически не используются, так как запись вершинных данных и генерация новой геометрии занимают слишком много времени. Некоторые платформы (например, Mac) вообще не поддерживают геометрические шейдеры, предлагая вместо этого использовать компут.
К сожалению, это недоверие к геометрическим шейдерам полностью оправдано.
На 1060 GTX разрушение города с типового изометрического ракурса занимает 10 мс на кадр. Для наиболее детализированных локаций со множеством высокополигональных зданий разрушение занимает уже порядка 20 мс, что вкупе с рендером остального кадра снижает FPS до 30. Учитывая зрелищность процесса разрушения и тот факт, что он происходит в момент прекращения игрового процесса, такая частота кадров видится нормальной (к тому же, сам шейдерный процесс разрушения исключает фризы, поэтому FPS будет стабильным). Но видеокарта 1060 ввиду этого является предельной, поэтому анимация разрушения с обломками отображается только на пресетах «максимум» и «кино». Для всех остальных пресетов генерируются только остовы зданий и других объектов, что на порядок дешевле, так как остовы не требуют геометрического прохода.
Альтернативой геометрическим шейдерам в этом является использование компут шейдеров для генерации вершинных буферов. Но, учитывая объем генерируемой геометрии, потребуется существенное выделение памяти, а также серьезная переделка конвейера рендера объектов — при этом не факт, что при таком подходе будет достигнуто ускорение по сравнению с геометрическим шейдером.
Итоги
Полученный визуальный эффект может быть воспроизведен с любого ракурса для любой локации, погоды и времени суток, и для этого не требуется никакой настройки со стороны художников. Любая новая локация или новый ассет будут легко переварены алгоритмом, переиграны и уничтожены. И любой игрок с достаточно мощной видеокартой сможет сам записать подобный ролик:
Тем не менее, эффект проигрывает по зрелищности и деталям эффектам, которые целиком сконструированы и отрисованы для одной сцены. Универсальный алгоритм никогда не даст того, что дает индивидуальная настройка и корректировка.
Суммарно эффект использует примерно 1 мб видеопамяти, та как практически все его элементы генерируются в реальном времени. Это особенно важно в условиях дефицита видеопамяти на ряде платформ.
Также, абсолютно все элементы атомного взрыва и разрушения могут быть легко улучшены и отмасштабированы для большего реализма и зрелищности ценой падения производительности, что формирует хороший задел на будущие улучшения. Световой поражающий фактор и огромные пожары ждут своего момента.
Как я перестал бояться и полюбил бомбу
Наверное, это самая крутая и сложная задача по графике, над которой я когда-либо работал.
За время разработки эффекта было проведено примерно 10000 атомных испытаний, в самых разных частях мира, включая несуществующие города и территории. Даже сказочный летающий архипелаг из TailSpin не избежал тяжкой поступи атомной эры.
Ну а настроение в ходе разработки было примерно таким: