
В этой заметке нет сенсационных открытий, а лишь несколько наблюдений над работой зеркал, которые могут показаться необычными для тех, кто никогда не создавал подобные объекты в играх.
В Sims 4 зеркала действительно функционируют: для каждого из них игра запускает повторный рендер комнаты, что является достаточно ресурсоёмким процессом.
Интересная оптимизация: при удалённом обзоре зеркало отображает статичную текстуру, а настоящее отражение появляется только при приближении камеры.
И нет, эффект бесконечных зеркал в игре недоступен:
На самом деле я хотел продемонстрировать следующее видео, где видно, как эффективно обрезается «зеркальный мир».
Предыстория: при подключении моего профайлера к игре процесс рендеринга даёт сбой — пол исчезает, и зеркальная комната рисуется поверх основного изображения, что позволяет увидеть всю сцену целиком.
Меня впечатляет скорость отсечения объектов: персонажи и предметы «усекаются» мгновенно, даже содержимое экрана ноутбука! Возможно, это не кажется чем-то выдающимся, но приятно наблюдать за такими деталями.
Технические детали
Немного подробнее о механизме рендеринга зеркал:
Как уже отмечалось, игра для каждого зеркала повторно рендерит сцену. С помощью профайлера удалось выяснить, что после формирования буфера глубины и теней сцена рисуется стандартно, а затем зеркала обрабатываются поочерёдно.
Первый блок (ID 923) относится к другому зеркалу, расположенного неподалёку, но не попавшего в кадр.
Чтобы определить, какое зеркало отражает какую область, игра, вероятно, использует stencil-буферы — по сути чёрно-белые маски. В моём захвате трёх видимых зеркал я обнаружил три разных stencil-буфера:
Нумерация stencil-буферов начинается с 2, поскольку рядом с тремя активными зеркалами находилось ещё одно скрытое.
Точный алгоритм Sims 4 остаётся загадкой, но он напоминает подход из Unity:
- Рендер каждой зеркальной поверхности в отдельный stencil-буфер (или в общий с разными ID).
- Формирование списка видимых объектов для каждого зеркала и их отрисовка только там, где stencil-маска разрешает.
Источник: Unity Stencil Buffer
Бонус
Наблюдение № 1
Даже если в Sims 4 скрыть внутренние стены для лучшего обзора интерьера, зеркала по-прежнему их рендерят и игнорируют этот режим.
Наблюдение № 2
Наблюдая за симом в душе, можно заметить, что пикселизация и частицы воды отражаются в зеркале:
При активации «глитча» видно, что пикселизация и частицы ограничены только зоной зеркальной поверхности, вероятно, с помощью stencil-масок.
Наблюдение № 3
Я не сумел воспроизвести старый глитч из видео десятилетней давности — вероятно, это была оптимизация анимаций, уже исправленная. Тем не менее я оставил демонстрацию из-за её забавности:
Пример от сообщества
Марина реализовала зеркало в своей игре и поделилась разбором в моём Discord.

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

Как и в Sims, в зеркале можно увидеть стену, которой нет в основной камере (иначе она бы её закрывала). Как это работает?
«Окружение — это простая текстура на самом объекте зеркала!»


![Подробности хотфикса [v0.5.2] Подробности хотфикса [v0.5.2]](https://clan.fastly.steamstatic.com/images/45140680/1f0397a55d110719349f7baf0b933dcb854d484c.png)
