[Перевод] Проблемы рейтрейсинга в играх нового поколения: анализ трассировки лучей в ремастере Marvel's Spider-Man

akrhnbbj6twnaujjw5dlm2mpiws.png

По мере приближения запуска нового поколения консолей Insomniac Games начала публиковать больше материалов, раскрывающих подробности о Marvel«s Spider-Man и Marvel’s Spider-Man: Miles Morales. Оба проекта задействуют технологию трассировки лучей. На взгляд Алекса Баттальи из Digital Foundry, выглядит она очень достойно, если не сказать, что превосходно. Для старта — весьма недурно.

Тем не менее, читая комментарии в Интернете, он столкнулся с немалым количеством критики по отношению к реализации технологии, а также к частоте и разрешению кадров. Поэтому в новое видео Digital Foundry он решил представить своего рода пособие по трассировке лучей на консолях следующего поколения и объяснить, почему в Marvel’s Spider-Man она выглядит именно так.
Итак, обо всем по порядку. Давайте обсудим, для чего именно нужна трассировка лучей в Marvel«s Spider-Man на PS5.

При частоте кадров 30FPS с разрешением 4К трассировка лучей выглядит замечательно. При этом, как заведено в играх Insomniac, динамическое разрешение может использоваться, а может и нет. Здесь трассировка лучей применяется для отражений в игре, подобных тем, которые видны на дверях машин.

iitvx2u9rg7bhrklhijud1fbuiy.png

Или на этом скриншоте, где герой и город вдалеке отражаются в окне здания.

ikq_i8s5xz51wxm1gipmyqo8u0c.png

Согласно пресс-релизу, трассировка лучей также используется для фонового затенения (Ambient Occlusion, AO). Его труднее определить на скриншотах или в видео. Как правило, AO имитирует тени от непрямого освещения в тех областях, куда свету, отражающемуся в окрестностях сцены, труднее добраться.

v-hpw3ievgzoqdfpg-et4hhzcwy.gif

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

cai1vfnwiktjz2biesuxgkrbyic.png

Отражения показываются в разрешении 1080p, тогда как остальная часть изображения — в 4K. Комментаторы жалуются, например, на то, что листья в отражении более редкие либо вовсе отсутствуют по сравнению с теми, которые можно увидеть на «реальном» дереве. Или что некоторые внутриигровые объекты, такие как автомобили или пешеходы, могут не показываться в отражениях. Или на отсутствие теней. Или на пренебрежение мелкими деталями, например, на костюме Человека-паука.

gezvyvd1o_dgpupaj03oioka_w8.png

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

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

gcsj6fcatoisdihrenjohviyppc.png

Разделим процесс работы с трассировкой лучей на четыре шага. Допустим, нам нужно уложиться в 8 мс для создания отражений для игры на 30 FPS при разрешении 4K.

Перейдем к первому шагу. Для моделирования лучей графический процессор должен иметь представление о сцене и геометрических объектах на экране и за его пределами. На первом этапе мы создаем легко читаемую версию игровой сцены. Чем больше в ней объектов и чем они динамичнее, тем больше времени займет этот шаг.

На втором этапе мы запускаем лучи в структуру, созданную на первом.

ggtqcdmsq4swwn2sslld_e5ncvw.gif

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

На следующем этапе происходит затенение попадания или выбор цвета пикселя.

onllgipi3fzu1yrafjpvllh7xeq.gif

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

exqrhof0ufufqbgwa0fxkrm1il0.gif

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

tek8_xmwj1eyyr5pbrggi-crr38.png

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

avw4ojilsqnvueomm9xqarbenpm.png

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

bezckhggyft7bk90gllsbvxucnm.png

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

9e46vckxee2og1nghcryqwejf-k.png

Посмотрим на скриншот из демо The Ghost Runner с включенной трассировкой лучей с разрешением 4K на видеокарте RTX2060 Super. Здесь мы видим некоторые отличия по сравнению с «Человеком-пауком». Unreal Engine 4, на котором создана игра, использует метод трассировки лучей чуть более дорогой по времени, но физически более точный, чем в «Человеке-пауке».

pagajp5bdps2jgb6uloch4y7lq4.png

RTX 2060 Super работает аналогично RTX 2070, имеет такую же пропускную способность шины памяти, как и у PS5, и такой же ее объем — 8 ГБ. RTX 2060 Super, скорее всего, станет отличной отправной точкой для сравнения с графическим процессором PlayStation 5.

9rn7cgvlmk6qohufuk9krnfjcji.png

Когда сцена вместе с отражениями рендерится в 4K, а количество самих отражений на экране столь невелико, как в случае со статичной лужей выше, графический процессор едва укладывается в 30 FPS. Если бы в сцене было больше динамики, частота кадров определенно была бы меньше. Уменьшение осевого разрешения трассировки лучей на 50% и, таким образом, общего разрешения до 1080p увеличивает производительность примерно на 27%, оставляя свободные ресурсы в графическом процессоре для повышения частоты кадров до 30 FPS.

nhn2ybeabtpqimvfzsgncgekfxa.png

В других сценах можно увидеть более впечатляющие результаты. Как, например, здесь. Отражающая стеклянная поверхность занимает почти весь экран. В этом случае отражения с исходным разрешением 4К приводят к частоте кадров 21 FPS. При этом понижение разрешения отражений до 1080p увеличивает частоту кадров на 58% до 33 FPS при необходимых 30 FPS.

Таким образом, на графическом процессоре с такой же производительностью, что и у PS5, необходимо использовать отражения с трассировкой лучей с более низким разрешением для возможности поддерживать постоянной частоту кадров 30 FPS при общем разрешении 4К. Тогда становится понятным, почему для снижения стоимости трассировки лучей в «Человеке-пауке» будут использоваться отражения только при 1080p.

polno7tannib7ia_qfactl8xhes.png

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

Давайте попробуем сократить время первого шага, уменьшив динамичность либо количество объектов, по отношению к которым будет выполняться трассировка лучей. Так, на показанных ранее скриншотах некоторые динамические объекты могли отсутствовать в отражениях. Или здесь, в геймплейном видео Miles Morales, в массовых сценах порой можно заметить, что некоторые из NPC не отражаются на поверхностях.

ywbcjpzanhc-3irju1fa15fotba.png

По опыту других разработчиков мы знаем, что прорисовка множества персонажей на экране может оказаться очень ресурсоемкой. Например, отрисовка некоторых сцен в Metro Exodus с большим количеством персонажей на RTX 2080 Ti занимает более 4 мс. В нашем случае это окажется половиной отведенного бюджета — непозволительная для наш роскошь.

Итак, уменьшение количества динамических объектов на первом этапе трассировки лучей приводит к ускорению процесса, и тогда мы вписываемся в отведенные 8 мс.

o0tfneguer7f5xq1cv9bk3fjerc.png

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

Например, взглянем на эти скриншоты Battlefield V.

t84gpxccmovldtz4mda8kayoxae.png
t84gpxccmovldtz4mda8kayoxae.png

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

_mckndmnj7zk5rmxyne8dgep5d8.png

Возвращаясь к нашему кадру из «Человека-паука», мы видим, что в отражениях видны объекты, находящиеся очень далеко. Вероятно, было бы очень неприятно, если бы объекты на горизонте отсутствовали в отражениях или постоянно мигали, то появляясь, то исчезая.

kj1dim1bddvr8p-4y9cy3a1qpfq.png

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

zu5gxaqddlzc4wwccxljwzarpxy.png

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

Снова посмотрим на наш скриншот с городом. В отражении на окне можно увидеть более редкие или вовсе отсутствующие листья по сравнению с тем, как они выглядят на изначальной модели дерева. Листья здесь классифицируются как прозрачные, а для прозрачных объектов второй шаг пайплайна занимает больше времени. Мы знаем это из опыта с Battlefield V, где частицы и отражения делают некоторые сцены чрезвычайно дорогими.

image

Что касается «Человека-паука», мы можем уменьшить количество листьев на деревьях в отражениях перед вторым шагом. А еще сделаем так, чтобы эффекты частиц не обрабатывались трассировкой лучей, как здесь, где туман в отражении не отображается.

k6sye7h5p743qf3w-8b9tj2qh5k.png

Теперь мы почти вписываемся в бюджет кадра, но все еще немного его превышаем.

y2xjmqxjxpnemgkeh-mqdb8twro.png

Последняя оптимизация может быть сделана на третьем шаге, где мы используем затенение.

Вернемся снова к нашему скриншоту. Заметили ли вы отсутствие мелких деталей в отражении костюма Человека-паука? Которые видны на его настоящем костюме? Если мы упростим материал в отражении, потребуется меньше времени на его прорисовку.

zu-kimjiasmdpivfz8srawaaduo.png

В этом нет ничего такого, ведь многие игры, использующие трассировку лучей, такие как Wolfenstein: Youngblood, прибегают к тому же приему.

ll-qcr9d0xzpffzcbawltsb3_ku.png

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

1lipzt2qm205n9o3s6a-17n93ew.png

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

© Habrahabr.ru