Имитация интерьера: почему здания в Spider-Man выглядят жилыми

Нью-Йорк, наконец, состоит не из картонных коробок.

В Marvel's Spider-Man во многих окнах можно увидеть полноценный интерьер. Это сделано с помощью одного трюка — всё воссоздаётся с помощью особого шейдера.

Сооснователь студии Ronimo Games (Awesomenauts) Йост ван Донген на сайте Gamasutra опубликовал текст, в котором разобрал принцип создания реалистичных интерьеров в Marvel's Spider-Man. Сам автор занимался этим вопросом в рамках работы над своим дипломным исследованием в 2007 году. Мы выбрали из материала главное.

Имитация интерьера: почему здания в Spider-Man выглядят жилыми

Работа этого эффекта наглядно продемонстрирована в видео Kotaku.

На 0:40 этого ролика видно, что комнаты фактически игнорируют геометрию здания: дверь находится там, где должно быть окно. Если же заглянуть в ту же комнату, но из другого окна, то можно заметить, что там представлен уже совсем другой интерьер. Всё это говорит о том, что комнаты являются фальшивыми, но, тем не менее, они совершенно корректны с точки зрения перспективы и имеют реальную глубину.

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

Для сохранения производительности комнаты в играх зачастую не имеют интерьеров. Например, это можно увидеть в GTA V
Для сохранения производительности комнаты в играх зачастую не имеют интерьеров. Например, это можно увидеть в GTA V

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

Слева направо: окна только с отражениями; окна с техникой interior mapping; каркасная модель, по которой видно, что interior mapping не добавляет полигонов
Слева направо: окна только с отражениями; окна с техникой interior mapping; каркасная модель, по которой видно, что interior mapping не добавляет полигонов

Используемый для рейкастинга луч — это просто луч от камеры к пикселю. Визуализируемый пиксель находится на внешней части здания, поэтому используется только часть луча за пикселем. Это связано с тем, что именно эта часть находится внутри здания.

Рейкастинг может показаться сложным и затратным, но на самом деле это очень полезно в данном случае. Хитрость заключается в одном ограничении: при планировании интерьера потолки и стены находятся на постоянном расстоянии. Зная это, можно легко вычислить местоположение игрока, потолка и стен комнаты.

Сами потолки и стены представляют собой бесконечные геометрические плоскости. Вычисление пересечения между бесконечной плоскостью и лучом занимает всего несколько шагов и приводит к снижению нагрузки на систему.

Идея, лежащая в основе interior mapping, заключается в том, что при рендеринге пикселя окна, луч направляется из этой точки в здание. Луч пересекает потолок, чтобы вычислить, какой пиксель будет виден
Идея, лежащая в основе interior mapping, заключается в том, что при рендеринге пикселя окна, луч направляется из этой точки в здание. Луч пересекает потолок, чтобы вычислить, какой пиксель будет виден

Всего в комнате шесть плоскостей: потолок, пол и четыре стены. Однако достаточно только трёх, поскольку известно направление взгляда пользователя. Например, если смотреть на потолок, не нужно проверять пол. Точно так же, из четырёх стен нужно рассмотреть только две, которые находятся в направлении, в котором смотрит игрок.

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

Затем точка пересечения используется в качестве координаты текстуры, чтобы подобрать цвет пикселя. Например, если луч достигает потолка в позиции (x, y, z), то (x, y) используются в качестве координаты текстуры, игнорируя z.

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

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

Также с помощью interior mapping можно, например, менять освещение в разных комнатах для имитации смены дня и ночи. Для этого применяется текстура шума, из которой высчитывается индекс комнаты в качестве координат текстуры.

Имитация разного освещения
Имитация разного освещения

Поскольку происходит лишь распространение лучей в плоскости, все комнаты являются простыми прямоугольниками с текстурами. Вся мебель в помещении находится на текстуре, а значит, что она остаётся плоской. В Marvel's Spider-Man это заметно при приближения: столы в комнатах — фактически плоские текстуры на стенах.

Как видно на показанном ниже изображении, можно дополнить эту технику с помощью одного или нескольких дополнительных слоёв текстуры. Но это даёт дополнительную нагрузку на производительность.

Выполняя трассировку лучей ещё одной плоскости, параллельной внешней части здания, можно добавить в помещения мебель и людей. Тем не менее они всё равно останутся плоскими
Выполняя трассировку лучей ещё одной плоскости, параллельной внешней части здания, можно добавить в помещения мебель и людей. Тем не менее они всё равно останутся плоскими

В Simcity (2013) техника interior mapping также использовалась. Разработчики усовершенствовали изначальную идею и соединили несколько текстур в одну для создания глубины комнат. В видео ниже (начиная с 1:00) объясняется принцип работы техники.

Автор оригинального текста приложил ссылку на свою демонстрацию interior mapping. Также в Unreal Engine 4 можно найти эту технику в виде функции InteriorCubeMap.

136136
71 комментарий

Это всё прекрасно конечно, но пролетая перед зданиями с зеркальными окнами почему-то отражение города добавить не забыли, а паучка не видно, странно. Паук-вампир? Заявка на продолжение?

34
Ответить

На самом деле да, имхо самый большой удар по иммерсивности тут наносят не двери выходящие на улицу с 10 этажа, а отсутствие адекватного отражения когда ползешь/бежишь по стене. Каждый раз замечал и расстраивался.

Причем под каким то углом оно есть, а под другими нет.

22
Ответить

Комментарий недоступен

17
Ответить

Псч не тянет

3
Ответить

Ресурсы не бесконечные все же.

2
Ответить

Screenspace Reflections

1
Ответить

Проезжая мимо станции, с меня слетела шляпа

1
Ответить