Как создают отражения в играх — от Duke Nukem 3D до рейтрейсинга
Замечали, как часто в играх встречаются разбитые зеркала? Или слишком грязные и поцарапанные — настолько, что в них не видно отражения. Разработчики не любят делать зеркала целыми и чистыми — для этого требуется слишком много работы.
Когда авторы всё же решаются добавить в игру отражения, они не ставят перед собой цель воссоздать саму физику зеркальной поверхности. Все силы тратятся на то, чтобы повторить сам эффект. В этом материале мы разберёмся, какие тут есть хитрости.
Автор: Юрий Кулагин
Зеркало в Death Stranding
Комнаты-двойники
Работающие зеркала появились в видеоиграх ещё до эпохи 3D. Во многих квестах начала 1990-х этот эффект достигался просто — спрайт персонажа дублировался, а фон заранее отрисовывался сразу с зеркальным отражением.
В 1996-м году зеркала с отражением появились в Duke Nukem 3D. Для каждого зеркала в игре создавалась дополнительная комната, отражённая по горизонтали со всеми деталями и обстановкой. Когда игрок приближался к зеркалу, в эту отражённую комнату добавлялся персонаж, дублирующий движения игрока. А само зеркало, соответственно, работало как окно между двумя комнатами.
Эффект получился красивым и располагал к творческим экспериментам. Например, во второй части Crash Bandicoot отражения на льду тоже были зеркальными комнатами, только отражёнными уже по вертикали. Причём “двойников” получили не только окружение и главный герой, но и находящиеся на льду предметы. Подобных секций на уровнях было немного — разработчики по возможности избегали лишней нагрузки.
A разработчики Doom 3 воспользовались желанием игрока полюбоваться на своё отражение. В одном из туалетов в игре зеркало запускает специально заготовленный скример, если на несколько секунд засмотреться на модель персонажа.
Зеркальные комнаты выглядят убедительно, но в современных играх почти не используются. Для их работы движку нужно рендерить сразу два помещения, а левел-дизайнерам приходится планировать уровень так, чтобы для отражённого помещения нашлось место.
Во времена Duke Nukem 3D это не было большой проблемой. Интерьеры тогда оформлялись довольно просто: никаких сложных теней, в роли мебели — комбинации кубов и спрайтов. Движку игры всё равно приходилось поднапрячься, но в масштабах целого уровня нагрузка возрастала не сильно. Но со временем подход к зеркалам пришлось поменять.
Отдельный рендер
В современных играх “зеркальные комнаты” почти полностью вытеснила более “честная”, хотя и столь же ресурсозатратная технология — planar reflections. Это отражения, которые создаются с помощью дополнительного рендера всей сцены. На этапе создания уровня левел-дизайнеры делают только одну комнату, после чего в поверхность, которая станет зеркалом, встраивается виртуальная камера. Она включается, когда попадает в поле зрения игрока, и заново рендерит комнату.
Подход двух технологий схож — движку нужно либо отрендерить две комнаты, либо одну, но с двух разных ракурсов. На производительности это всё равно сказывается не лучшим образом: локации, сделанные по современным стандартам, содержат множество мелких деталей, эффектов, шейдеров и движущихся объектов. Они сами по себе могут легко загрузить игровой движок, тем более — если их нужно отрендерить дважды.
Рендер с позиции зеркала можно сделать в пониженном разрешении, особенно для небольших зеркал в играх с видом от третьего лица. В них нельзя придвинуть основную (игровую) камеру вплотную к зеркалу, поэтому разницу в чёткости трудно заметить.
Поэтому повсеместно такие отражения использовать нельзя. Как правило, они встречаются либо в относительно компактных и небогатых на детали помещениях, как туалеты в новом Hitman, либо настолько тёмных, что в тенях скрывается большая часть деталей — как сцены с допросами из Tom Clancy’s Splinter Cell: Conviction.
Зеркальные кубики
В 1999 году Nvidia представила прорывную по тем временам видеокарту GeForce 256. Одной из её главных особенностей была поддержка cube maps — кубических карт отражений. Для создания кубической карты из центра локации захватываются шесть плоских изображений, которые ужимаются и наносится на плоскости невидимого для игрока куба, после чего его грани сглаживаются — получается панорамный шар, затекстуренный изнутри.
Для зеркал эта технология не подходит, поскольку такие отражения выглядят неточно и довольно размыто. Но отражающие поверхности только ими не ограничиваются: в играх встречаются такие объекты, как капоты машин, лужи и витрины магазинов.
На таких поверхностях cube maps выглядят неплохо, несмотря на низкое разрешение. Такие отражения довольно просты в производстве и не сильно нагружают систему, ведь самый трудоёмкий процесс (рендер самого куба) производится ещё на этапе разработки, чтобы сама игра потом просто подгружала затекстуренную панораму.
Ранние варианты технологии с трудом подстраивались под движения игрока. Например, если он отходил на несколько шагов от центра комнаты, то отражения смещались неравномерно. Со временем эта проблема была решена с помощью parallax corrected cube maps, которые сейчас уже почти полностью вытеснили классические “кубики”. Главное отличие параллаксов — умение растягиваться и подстраивать изображение под камеру игрока.
Cube maps используют заранее запечённые отражения, поэтому движущихся объекты в них не отражаются. На любое масштабное изменение локации — взрыв в комнате, рухнувшая стена здания, смена дня на ночь -нужно заранее заготовить отдельный куб.
Если не дополнять “кубики” другими технологиями отражения, то персонажи в игре будто превращаются в вампиров: весь мир вокруг них отражается, а сами они — нет. Генерирующиеся в реальном времени cube maps существуют, но пока что почти не используется — на создание панорамной текстуры, которая должна постоянно обновляться, уходит слишком много ресурсов.
Из-за ограничений технологии разработчикам приходится идти на хитрости. Например, в Spider-Man 2018-го года применяются кубы отражений, которые подгружаются слоями. На некоторые здания в игре назначены несколько кубических отражений, запечённых на разной высоте. Пока Человек-Паук карабкается вверх по очередному небоскрёбу, карты отражений плавно меняются от нижних этажей в низком же разрешении до более чётких кадров.
Cube maps активно используются в играх, когда нужно создать “фоновое” отражение на размытой поверхности. На создание в таких ситуациях “честных” отражений для большой локации современные движки не рассчитаны. Проще заранее нарисовать и отрендерить кубы с текстурами, а затем правильно их расставить.
SSR
В 2011 году Crytek наряду добавила в Crysis 2 шейдер, который получал отражения при помощи трассировки лучей только к видимым на экране объектам, используя информацию с предыдущих стадий рендеринга. Эта технология получила название screen space reflections (или просто SSR), и сейчас используется повсеместно.
SSR — ресурсозатратный процесс, но нагрузка на движок получается ниже, чем от дополнительного рендера.
Для отражения SSR использует только те ресурсы, которые видит сам игрок. Если какой-то объект хотя бы частично остаётся за кадром, то и его отражение в воде или в витрине не будет прорисовываться до конца. Такие ограничения разработчики маскируют, замыливая отражающую поверхность или растягивая края текстуры.
SSR часто применяют в комбинации с другими методами отражения. Например, в том же Spider-Man от Insomniac Games стеклянные фасады небоскрёбов чередуют SSR с кубическими отражениями. Первые используются в важных для сюжета местах и улицах с плотным трафиком — в отличие от cube maps, SSR может убедительно показать отражения пешеходов и автомобилей, хотя и искажает перспективу.
В боевых сценах Spider-Man SSR накладывается прямо на кубическое отражение. Относительно небольшие (если сравнивать с панорамами виртуального Нью-Йорка) помещения позволяют увеличить нагрузку на систему, поэтому cube map отвечает за статичную часть отображения (стены, потолок, мебель), а SSR — за подвижную (противники и главный герой).
В Hitman три типа отражений совмещаются и в пределах одной локации — особенно в Hitman 2, для которой разработчики обновили графический движок. Зеркала в небольших комнатах используют дополнительный рендер, а многие прозрачные объекты (стеклянные перегородки, окна) — SSR. А в отдельных местах разработчики размещают простые кубические отражения, чтобы хоть как-то снизить нагрузку на систему.
Как трассировка лучей работает с отражениями
Трассировка лучей меняет весь подход к созданию отражений в видеоиграх. Если прежде все технологии пытались имитировать только эффект зеркал, то рейтрейсинг воспроизводит источники света создаёт более точные отражения. О щадящих нагрузках на систему здесь речь уже не идёт — отражения с трассировкой предназначены для мощных ПК и консолей следующего поколения.
Трассировка лучей — это тоже имитация. Но имитирует она не только эффект отражений, но и то, как они образуются. В этом смысле рейтрейсинг проигрывает родственной технологии — трассировке пути (path tracing). Последняя полностью имитирует движения лучей в сцене, тогда как рейтрейсинг ограничивает их количество.
Обе технологии уже давно используются в рендере сцен для фильмов и мультипликации. Для работы со светом в реальном времени они не подходили из-за огромной нагрузки на систему. Из-за предельно точной симуляции лучей трассировка пути всё ещё не может применяться в играх, но рейтрейсинг, пусть и с некоторыми упрощениями, разработчики всё же смогли адаптировать под использование в реальном времени.
Трассировка лучей позволяет по-разному формировать отражения для разных типов поверхности. Например, прозрачные отражения (RT transparency reflections). применяют для любых стеклянных поверхностей в игре: зеркальный эффект добавляется на окна, перегородки и даже чайники.
При этом симуляция пучков света учитывает освещение вокруг стеклянного объекта. Например, если за стеклянной дверью находится тёмная комната, то и отражение на двери будет чётким и контрастным. Чем помещение светлее, тем более блёклым получается эффект. А если за стеклянным объектом лишь кромешная тьма, то отражение, полученное с помощью этой технологии, не уступит по чёткости зеркалам с дополнительным рендером.
RT opaque reflections — это отражения, которые по применению и внешнему виду похожи на SSR. На любых поверхностях, обладающих хотя бы минимальными зеркальными свойствами, появляются контуры отражаемых объектов. Или даже не контуры, а сами объекты, — только слегка смазанные. Opaque reflections хорошо работает с разными типами материалов и по-разному отражается на мутной, но отполированной плитке, и на луже крови.
Как и SSR, opaque reflections меняются в зависимости от угла обзора игрока и от его местоположения. Но при этом они ещё и показывают объекты, находящиеся за пределами кадра. Результат напоминает planar reflections, но с одним большим отличием: в этом случае используется не текстура — пускай и очень качественная, — а симуляция лучей.
Это важно потому, что текстуры, работающие по технологиям SSR и, тем более, planar reflections, нельзя размещать слишком тесно. Они могут не только излишне нагрузить систему, но и конфликтовать друг с другом. А отражения в рейтрейсинге, наоборот, дополняют друга друга и ни с чем не конфликтуют.
Отражения, полученные с помощью трассировки лучей, не только красивы, — они ещё и “склеивают” воедино любой уровень. Если в сцене есть десять предметов, и половина из них может создавать отражения, то рейтрейсинг распределяет эти отражения на все пять предметов. Ни SSR, ни cube maps такого не умеют.
Наконец, рейтрейсинг отлично справляется с отражением движущихся объектов в кадре. К хитростям вроде наложения одной технологии на другую не приходится прибегать — наоборот, нужно накладывать определённые ограничения, чтобы не перегрузить движок. Главного героя и его противников трассировка лучей отразит без проблем, но ей по плечу и летящие пули, и куски штукатурки, и даже брызги крови. Если у предмета есть физическая модель в игровом мире, трассировка учитывает её и отражает на всех доступных плоскостях.
----------
Отражения, полученные трассировкой лучей, не сразу заменят уже устоявшиеся в игровой индустрии технологии. Рейтрейсинг неплохо уживается и с SSR, и с кубическими “зеркалами” в одном кадре. Например, в Battlefield V трассировка лучей умеет плавно меняться на screen space reflections на небольшом удалении от игрока. А в World of Tanks рейтрейсинг обрабатывает только танки на ходу, а остальное окружение и взорванные машины обходятся более простыми технологиями.
Главный технический вопрос в этом случае — поиск правильного баланса между честными отражениями и их симуляцией. И Unreal Engine, и Unity умеют работать с рейтрейсингом и полностью открыты для экспериментов, поэтому у разработчиков есть удобные площадки для изучения технологии. Вероятно, рейтрейсинг будет становиться всё более популярным по мере того, как будет дешеветь поддерживающее его “железо”.
CGI Media
3.1K поста6.6K подписчиков
Правила сообщества
• Посты должны соответствовать тематике cообщества.
• Не допускается спам и нарушение правил сайта pikabu.