Как работают зеркала в Sims 4

Как работают зеркала в Sims 4

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

В Sims 4 зеркала действительно функционируют: для каждого из них игра запускает повторный рендер комнаты, что является достаточно ресурсоёмким процессом.

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

И нет, эффект бесконечных зеркал в игре недоступен:

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

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

Меня впечатляет скорость отсечения объектов: персонажи и предметы «усекаются» мгновенно, даже содержимое экрана ноутбука! Возможно, это не кажется чем-то выдающимся, но приятно наблюдать за такими деталями.

Технические детали

Немного подробнее о механизме рендеринга зеркал:

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

Первый блок (ID 923) относится к другому зеркалу, расположенного неподалёку, но не попавшего в кадр.

Чтобы определить, какое зеркало отражает какую область, игра, вероятно, использует stencil-буферы — по сути чёрно-белые маски. В моём захвате трёх видимых зеркал я обнаружил три разных stencil-буфера:

Нумерация stencil-буферов начинается с 2, поскольку рядом с тремя активными зеркалами находилось ещё одно скрытое.

Точный алгоритм Sims 4 остаётся загадкой, но он напоминает подход из Unity:

  1. Рендер каждой зеркальной поверхности в отдельный stencil-буфер (или в общий с разными ID).
  2. Формирование списка видимых объектов для каждого зеркала и их отрисовка только там, где stencil-маска разрешает.

Источник: Unity Stencil Buffer

Бонус

Наблюдение № 1

Даже если в Sims 4 скрыть внутренние стены для лучшего обзора интерьера, зеркала по-прежнему их рендерят и игнорируют этот режим.

Наблюдение № 2

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

При активации «глитча» видно, что пикселизация и частицы ограничены только зоной зеркальной поверхности, вероятно, с помощью stencil-масок.

Наблюдение № 3

Я не сумел воспроизвести старый глитч из видео десятилетней давности — вероятно, это была оптимизация анимаций, уже исправленная. Тем не менее я оставил демонстрацию из-за её забавности:

Пример от сообщества

Марина реализовала зеркало в своей игре и поделилась разбором в моём Discord.

Источник
Источник

«Для игрока это камера + render target, target которого — единственный четырёхугольник со скриптом, следующий за игроком по горизонтали. У зеркала есть stencil-маска, поэтому четырёхугольник появляется перед ним».

Источник
Источник

Как и в Sims, в зеркале можно увидеть стену, которой нет в основной камере (иначе она бы её закрывала). Как это работает?

«Окружение — это простая текстура на самом объекте зеркала!»


 

Источник

Читайте также