Иллюзия пространства: как новый Spiderman рендерит помещения без геометрии

http://www.gamasutra.com/blogs/JoostVanDongen/20180925/327159/Interior_Mapping_rendering_real_rooms_without_geometry.php
  • Перевод

В недавно выпущенной игре Marvel's Spider-Man во многих зданиях за окнами есть интерьеры. Они выглядят замечательно, но похоже, что их реализовали с помощью хитрого рендеринга — геометрии интерьеров на самом деле не существует и она сгенерирована шейдером. Я не видел никаких официальных заявлений Insomniac о том, как они это сделали, но исходя из того, как выглядит эффект, здесь с большой вероятностью реализована техника interior mapping, которую я придумал в 2007 году в процессе работы над диссертацией. Раньше я не писал о ней в блоге, поэтому сейчас подходящий момент для объяснения любопытного небольшого шейдера, который я придумал.

Давайте начнём с просмотра геймплея Marvel's Spider-Man. Игра выглядит просто потрясающе. Сайт Kotaku записал отдельный ролик, посвящённый окнам:


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


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

Прежде всего хочу объяснить, что мой пост не является жалобой: я в восторге от того, что мою технику использовали в такой масштабной игре и ни в коем случае не обвиняю Insomniac в краже. Как я говорил в первой публикации о interior mapping, для меня будет честью, если кто-то использует эту технику. Если Insomniac действительно воспользовалась в своей технике моей идеей, то я считаю, что это замечательно. Если не воспользовалась, то, похоже, она придумала нечто до странности похожее. Тогда мне было бы интересно, как это было сделано.

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


Слева направо: только окна с отражениями, окна с Interior Mapping, каркасная модель — Interior Mapping не добавляет никаких полигонов.

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

Raycasting (испускание лучей) может показаться сложной и затратной операцией, но в этом конкретном случае она на самом деле очень проста и быстра. Хитрость в том, что можно добавить простое ограничение: при interior mapping потолки и полы находятся на неизменном расстоянии. Зная это, мы можем запросто вычислить, в какой комнате находимся, и где в этой комнате расположены пол и потолок. Сами по себе потолки и полы являются бесконечными геометрическими плоскостями. Вычисление пересечения между бесконечной плоскостью и лучём занимает всего несколько шагов и тратит мало ресурсов.


У комнаты есть 6 плоскостей: потолок, пол и 4 стены. Однако нам нужно учитывать только три из них, потому что мы знаем, в каком направлении смотрим. Например, если мы смотрим вверх, то нам не нужно проверять пол внизу, потому что мы будем видеть потолок наверху. Аналогичным образом вместо 4 стен нам нужно учитывать только две в том направлении, в котором мы смотрим.

Чтобы определить, что же мы видим, нужно вычислить пересечение луча с каждой из этих трёх плоскостей. Ближайшее к камере пересечение с лучом сообщает нам, какую из плоскостей мы видим в этом пикселе. Затем мы используем точку пересечения как координату текстуры, чтобы найти цвет пикселя. Например, если луч пересекается в позиции (x,y,z) с потолком, то мы используем в качестве координат текстур (x,y) и игнорируем z.

Здесь я добавил хорошую оптимизацию: часть вычислений пересечений для каждой из трёх плоскостей можно выполнять одновременно. Используемые шейдеры работали с float4 с такой же скоростью, как и с float, поэтому благодаря умной упаковке переменных можно было выполнять пересечения всех трёх лучей с плоскостями одновременно. Это сэкономило мне немного ресурсов и помогло достичь высокой частоты кадров при interior mapping даже в 2007 году. Мне говорили, что современные видеокарты с float работают быстрее, чем с float4; значит, на нынешнем железе эта оптимизация больше не работает.


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

Подробнее о работе interior mapping можно узнать в моей статье. Эта статья была опубликована на Computer Graphics International Conference в 2008. Наличие настоящей рецензированной публикации — это моя первая (и единственная) заявка на гордое звание учёного. В этой статье также описываются дополнительные эксперименты по добавлению деталей, например, изменение расстояния между стенами для комнат неодинакового размера и случайный выбор текстур из текстурного атласа для большей вариативности комнат. Также в ней подробно описываются две вариации, показанные на изображениях ниже.


Освещение в комнатах можно динамически включать и отключать для имитации смены дня и ночи. Это выполняется с помощью текстуры шума, из которой мы выполняем чтение, используя в качестве координат текстуры индекс комнаты.

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


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

После публикации этого поста один из программистов Simcity (2013) рассказал мне, что техника interior mapping использовалась и в этой игре. В ней она выглядит очень здорово, и разработчики записали об этом отличное видео. Они усовершенствовали мою исходную идею, сохранив все текстуры в одну текстуру и добавив комнаты разной глубины. Часть, посвящённая interior mapping, начинается с момента 1:00:


Если вы хотите глубже исследовать эту технику, то можете скачать моё демо interior mapping с исходным кодом. Если вы работаете в Unreal Engine 4, то можете найти interior mapping как стандартную функцию движка в виде функции InteriorCubeMap.

Спустя столько лет очень здорово наконец увидеть, что мою технику interior mapping используют при производстве масштабной видеоигры! Если вам знакомы игры, в которых применяется нечто подобное, то напишите об этом мне.
Поделиться публикацией

Комментарии 38

    +3
    Помню оригинальную публикацию, тогда очень понравилась идея. С тех пор нередко вспоминал и удивлялся, почему же до сих пор нигде такого не делают. Наконец-то!
      0
      Кстати, не специалист, но замечал использование похожего в некоторых играх. Правда, там не было полноценного интерьера, который видно сквозь окно и полноценной коробки. Но глубина «за окном» ощущалась. Например, окна в Thief (последнем).
      +3
      Та-же техника применялась в Watch_Dogs

        +1
        Эдак скоро проекцию -light_direction на surface_normal назовут техникой упрощенного освещения.
          +10
          Самомнение автора мило, но, справедливости ради, это вариант так называемых «гипертекстур» — метода, придуманного Кеном Перлином году в 89м. Тем самым, который Perlin Noise придумал тоже, и много еще интересного.
            +1

            Оффтоп: когда прочитал фразу про диссертацию, сразу полез смотреть, перевод ли это. Как-то машинально хочется понять, делают ли у нас в ВУЗах такое. К сожалению, очень редко статьи оказывается оригиналом. Студенты вроде сильные у нас, и преподавателей много хороших, но дипломные и диссертации мало где фигурируют :(

              +4

              Ну, справедливости ради на диссертацию это слабо тянет.

                +4
                В том то вся и проблема, были бы у нас хотя бы такие дипломы — мы были бы уже впереди планеты всей. Но в ВУЗах к сожалению, вершиной мастерства (в большинстве случаев) по окончанию 6 лет учёбы считается «написанный сайт», в лучшем случае на фреймворке (это уже одназначно пять и овации от комиссии). Обычно же это какой-нибудь wordpress, установленный по инструкции и парой плагинов. Может быть плагин самописный какой туда добавят, чтобы можно было код в диплом закинуть, иначе где воду-то брать? Я уверен что не везде так, но так было 3 года назад в МАИ. На техническом факультете. И тема: «сайт-блог для студентов группы такой-то с расписанием занятий». Или (прости, Тьюринг) «интернет-магазин».
                  0
                  А я как-раз предложил сайт(агрегатор фирм-продавцов пластиковых окон), за что был жестко обсмеян на кафедре. Пришлось писать в стол, что-то про распределенные вычисления)
                    +1
                    Несколько лет назад дипломы студентов программистов в большинстве было по использованию стандартных баз данных. Сейчас популярны нейронные сети.
                      0
                      Что мешает студентам сами выбрать себе интересные темы? Времени на так уж мало, а адекватные руководители обычно поддержат.
                        0
                        В моем случае мешала работа на фулл тайм. Делать реальный ресерч в итоге было очень лень, поэтому согласился на вариант преподавателя — написать контроллер для asp.net приложения, который считал формулу из книжки. Прикрутил к этому график на js, добавил сохранение данных в SQL… Ну и всё на этом.

                        Один чел просто принес скриншоты из 1С и сказал «вот мой диплом».

                        Тоже МАИ, тоже 3 года назад.
                  +1
                  А разве можно на глаз отличить описанную технику от упрощённой геометрии — только стены, полы и потолки с текстурами?
                    0
                    Нет. В этом и фишка технологии же.
                      0

                      В первом видео, вставленном в статью, при переходе через оконную раму на 0:51 меняется текстура мебели на задней стенке. При нормальной геометрии такого бага не будет.

                        0
                        Если бы это была упрощённая геометрия, не было бы «глюка» с угловыми комнатами, когда с одной стороны видно одно, а с другой стороны — другое.
                          0
                          А разе это нельзя симулировать, введя дополнительные правила для угловых комнат? Просто разработчики решили не тратить на это время.
                            0
                            Конечно можно. Но проблема возможно не (с)только во времени разработчиков, но и в производительности. GPU не любит лишних условных переходов, так как в этом случае исполняются все ветки, и чем сложнее проверки в шейдере, тем тормознее результат. «А если не видно разницы, затем платить больше?»
                              +1
                              Можно просто добавить угловые версии комнат.
                                0
                                Конечно можно, а потом просто добавить условия их выбора, просто учесть что у нас могут быть дома с разным количеством комнат в длину и ширину, просто рассчитать правильную ориентацию, чтобы с разных углов всё корректно смотрелось, просто добавить discard для окон, глядящих изнутри, и т.д.

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

                                Но, вполне допускаю, что они просто схалтурили, не вдаваясь в такие дебри.
                                  0
                                  Можно просто сделать так чтобы в углу комнат не было вообще, или чтобы комната была только с одной стороны, а с другой стороны — глухая стена.
                        0
                        А в чем смысл не рендерить геометрию, если можно рендерить? Мне не кажется, что это будет более накладно по вычислительным ресурсам.
                          0
                          Меньше платить художникам / легче и быстрее создать все здания, которых там дофига.
                            0
                            За текстуру заплатить пришлось, и для её создания пришлось создать комнату в 3D.
                            Один раз созданную комнату тоже можно копипастой геометрии во все знания запихать. Причём даже в автоматическом режиме — обнаружив окно запихнуть сзади геометрию комнаты.
                            Сравните физику GTA 4 и GTA 5. Зачем тратиться больше, если подростки не заметят разницы.

                            А в чём, Trubix, разница? Можете рассказать?
                            (в эту серию не играл, потому что не фанат братвы)
                              0
                              Может быть, тогда остается производительность. Все эти комнаты можно нарисовать вообще в screenspace за один проход, и не нужно тащить и оптимизировать лишние вершины.
                                0
                                DelphiCowboy По сравнению с GTA 4, в 5-ой части физика поведения автомобилей и людей упрощена. Автомобили меньше заносит, меньше наклоняется кузов и в целом управление ближе к need for speed. В целом вождение более казуальное и я думаю, что это привлекает больше среднестатистических игроков.
                              0
                              А в чем смысл не рендерить геометрию, если можно рендерить? Мне не кажется, что это будет более накладно по вычислительным ресурсам.

                              И хотя статье уже пару месяцев под впечатлением от второй части я, кажется, нашел ответ.
                              Мне тоже сначала было непонятно. Ну сколько там той геометрии сэкономишь? В комнате каких-то 10 трехугольников, зато насколько более гибкая графика становится. Но, кажется, я понял.

                              Сейчас, с Parallax Interior — это один простой для вычислений Opaque шейдер.
                              Да, с реальной геометрией комната тоже будет простым для вычислений Opaque шейдером, но перед комнатой ведь есть еще окно. А вот это окно уже получается прозрачным шейдером, а как результат — слетают куча оптимизаций, мы отказываемся от отложенного рендера и огребаем проблем.

                              То есть не проблема сделать комнату. Зато проблема сделать прозрачное окно + комнату.
                              +1
                              Все так восхищаются технологий. А вот я смотрел стримы игроков, и практически все заметили этот рендер и высказались примерно так: «Что эта за халтура, почему дверь в стене, почему из соседнего окна другая картина? Лучше бы вообще не делали интерьер, только портит впечатление от игры».

                              Вот такой вот нюанс свел всю работу на нет.
                                0
                                Не думаю что всю. Хоть игра типа и 18+, она расчитана на подростков. Многие детишки просто будут играть и фон будет успешно выполнять роль фона. Просто из-за хайпа некоторые начинают обращать внимание и придираться. Но, думаю, что большинству игроков это не помешает. Сравните физику GTA 4 и GTA 5. Зачем тратиться больше, если подростки не заметят разницы.
                                  0
                                  Тем кому всё равно, можно было и не делать фон вообще. А внимательные к деталям, были сильно расстроены. Именно о том и речь, что лучше не делать работу вообще, чем делать плохо.
                                    0
                                    Так любой продукт можно делать бесконечно долго и стоить он потом будет бесконечно дорого. В человеке-пауке есть и более веселые моменты www.youtube.com/watch?v=oRbc3rMNI6s
                                      0
                                      Тут не в этом дело. Речь в статье идет о конкретной фиче. И в данном случае, раз не смогли сделать хорошо, по мнению игроков, лучше было вообще обойти без этой фичи. Это типа как, вот мы сделали паяльник, со сменными жалами. Правда жало у нас одно, разъем нестандартный, а запасных мы не делаем.
                                        0
                                        И в данном случае, раз не смогли сделать хорошо, по мнению игроков, лучше было вообще обойти без этой фичи.
                                        А еще по мнению игроков — это лучшая игра за последнее время. Как сказал Форд: «если бы я слушал покупателей, то сейчас бы у нас у всех были более быстрые лошади.» )
                                          0
                                          Опять же путаетесь. Форд сказал про фичреквесты. А мы говорим про отзывы на конечный продукт. Как мы уже выяснили раньше, некоторым пользователям не важны такие детали — они оценили игру высоко, и их мнение вряд ли бы изменилось, если бы этого рендера не было вообще. А вот для внимательных к деталям — это была ложка дёгтя, которая существенно испортила впечатления от игры. Ага?
                                            0
                                            некоторым пользователям не важны такие детали — они оценили игру высоко, и их мнение вряд ли бы изменилось, если бы этого рендера не было вообще. А вот для внимательных к деталям — это была ложка дёгтя, которая существенно испортила впечатления от игры
                                            Ну да, ну да — так все это и работает
                                              +1
                                              Ну я вот например играл в GTA5 и меня очень напрягали мутные плоские текстурки на окнах домов. Уж лучше бы худенькие interior mapping
                                      0
                                      Так-то там 16+ for teens.
                                        0
                                        В разных регионах по-разному, но мой посыл был в том, что для подростков :)

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое