Как работают зеркала в Sims 4
В этой заметке нет сенсационных открытий, а лишь несколько наблюдений над работой зеркал, которые могут показаться необычными для тех, кто никогда не создавал подобные объекты в играх.
В 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, в зеркале можно увидеть стену, которой нет в основной камере (иначе она бы её закрывала). Как это работает?
«Окружение — это простая текстура на самом объекте зеркала!»

Разобрал сохранение Skyrim VR с помощью ИИ-агентов и превратил его в словарь для изучения английского
Режиссёр объяснил, почему звезду «Во все тяжкие» почти целиком вырезали из «Клэйфейса»
Третьего сезона «Бегущих по краю» может не быть, шоураннер рассказал, при каких условиях возможно продолжение
Мобильная The Amazing Spider-Man 2 стала доступна на современных Android-устройствах
Microsoft продлила на месяц поиск покупателя для Arkane Lyon
Konami вела себя манипулятивно: компания намеренно ограничивала обмен информацией между командами, работающими над Silent Hill
Опубликованы новые постеры «Дюны. Часть третья», трейлер фильма ожидается в ближайшее время
Сооснователь Rockstar рассказал о причинах отмены шпионского экшена Agent