В недавно выпущенной игре 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 используют при производстве масштабной видеоигры! Если вам знакомы игры, в которых применяется нечто подобное, то напишите об этом мне.

Комментарии (35)


  1. shiru8bit
    01.10.2018 09:47
    +2

    Помню оригинальную публикацию, тогда очень понравилась идея. С тех пор нередко вспоминал и удивлялся, почему же до сих пор нигде такого не делают. Наконец-то!


    1. Trubix
      01.10.2018 12:09

      Кстати, не специалист, но замечал использование похожего в некоторых играх. Правда, там не было полноценного интерьера, который видно сквозь окно и полноценной коробки. Но глубина «за окном» ощущалась. Например, окна в Thief (последнем).


  1. Inobelar
    01.10.2018 11:35
    +1

    Та-же техника применялась в Watch_Dogs


  1. BingoBongo
    01.10.2018 12:02
    +1

    Эдак скоро проекцию -light_direction на surface_normal назовут техникой упрощенного освещения.


  1. NikRag
    01.10.2018 14:39
    +4

    Самомнение автора мило, но, справедливости ради, это вариант так называемых «гипертекстур» — метода, придуманного Кеном Перлином году в 89м. Тем самым, который Perlin Noise придумал тоже, и много еще интересного.


  1. QtRoS
    01.10.2018 15:43

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


    1. syouth
      01.10.2018 15:55
      +2

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


      1. AlexMt
        01.10.2018 20:37

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


        1. king555
          01.10.2018 21:57

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


        1. sim31r
          02.10.2018 01:55

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


  1. vagran
    01.10.2018 20:04
    +1

    А разве можно на глаз отличить описанную технику от упрощённой геометрии — только стены, полы и потолки с текстурами?


    1. AllexIn
      01.10.2018 20:26

      Нет. В этом и фишка технологии же.


    1. EviGL
      01.10.2018 21:04

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


    1. SHVV
      01.10.2018 21:04

      Если бы это была упрощённая геометрия, не было бы «глюка» с угловыми комнатами, когда с одной стороны видно одно, а с другой стороны — другое.


      1. iDm1
        01.10.2018 23:09

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


        1. SHVV
          01.10.2018 23:25

          Конечно можно. Но проблема возможно не (с)только во времени разработчиков, но и в производительности. GPU не любит лишних условных переходов, так как в этом случае исполняются все ветки, и чем сложнее проверки в шейдере, тем тормознее результат. «А если не видно разницы, затем платить больше?»


          1. DelphiCowboy
            02.10.2018 05:32

            Можно просто добавить угловые версии комнат.


            1. SHVV
              02.10.2018 20:07

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

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

              Но, вполне допускаю, что они просто схалтурили, не вдаваясь в такие дебри.


              1. Space__Elf
                02.10.2018 22:04

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


  1. robo2k
    02.10.2018 08:36

    А в чем смысл не рендерить геометрию, если можно рендерить? Мне не кажется, что это будет более накладно по вычислительным ресурсам.


    1. BingoBongo
      02.10.2018 10:12

      Меньше платить художникам / легче и быстрее создать все здания, которых там дофига.


      1. DelphiCowboy
        02.10.2018 11:02

        За текстуру заплатить пришлось, и для её создания пришлось создать комнату в 3D.
        Один раз созданную комнату тоже можно копипастой геометрии во все знания запихать. Причём даже в автоматическом режиме — обнаружив окно запихнуть сзади геометрию комнаты.

        Сравните физику GTA 4 и GTA 5. Зачем тратиться больше, если подростки не заметят разницы.

        А в чём, Trubix, разница? Можете рассказать?
        (в эту серию не играл, потому что не фанат братвы)


        1. BingoBongo
          02.10.2018 12:53

          Может быть, тогда остается производительность. Все эти комнаты можно нарисовать вообще в screenspace за один проход, и не нужно тащить и оптимизировать лишние вершины.


        1. Trubix
          02.10.2018 19:45

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


  1. Nagh42
    02.10.2018 08:59

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

    Вот такой вот нюанс свел всю работу на нет.


    1. Trubix
      02.10.2018 10:11

      Не думаю что всю. Хоть игра типа и 18+, она расчитана на подростков. Многие детишки просто будут играть и фон будет успешно выполнять роль фона. Просто из-за хайпа некоторые начинают обращать внимание и придираться. Но, думаю, что большинству игроков это не помешает. Сравните физику GTA 4 и GTA 5. Зачем тратиться больше, если подростки не заметят разницы.


      1. Nagh42
        02.10.2018 10:25

        Тем кому всё равно, можно было и не делать фон вообще. А внимательные к деталям, были сильно расстроены. Именно о том и речь, что лучше не делать работу вообще, чем делать плохо.


        1. BingoBongo
          02.10.2018 11:26

          Так любой продукт можно делать бесконечно долго и стоить он потом будет бесконечно дорого. В человеке-пауке есть и более веселые моменты www.youtube.com/watch?v=oRbc3rMNI6s


          1. Nagh42
            02.10.2018 12:34

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


            1. BingoBongo
              02.10.2018 22:22

              И в данном случае, раз не смогли сделать хорошо, по мнению игроков, лучше было вообще обойти без этой фичи.
              А еще по мнению игроков — это лучшая игра за последнее время. Как сказал Форд: «если бы я слушал покупателей, то сейчас бы у нас у всех были более быстрые лошади.» )


              1. Nagh42
                02.10.2018 23:40

                Опять же путаетесь. Форд сказал про фичреквесты. А мы говорим про отзывы на конечный продукт. Как мы уже выяснили раньше, некоторым пользователям не важны такие детали — они оценили игру высоко, и их мнение вряд ли бы изменилось, если бы этого рендера не было вообще. А вот для внимательных к деталям — это была ложка дёгтя, которая существенно испортила впечатления от игры. Ага?


                1. BingoBongo
                  03.10.2018 00:58

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


                1. svr_91
                  03.10.2018 08:57
                  +1

                  Ну я вот например играл в GTA5 и меня очень напрягали мутные плоские текстурки на окнах домов. Уж лучше бы худенькие interior mapping


      1. DSLow
        02.10.2018 10:43

        Так-то там 16+ for teens.


        1. Trubix
          02.10.2018 19:33

          В разных регионах по-разному, но мой посыл был в том, что для подростков :)