Ваша видеокарта рисует 60, 90 или даже 144 кадра в секунду. Каждый кадр — это миллионы треугольников, сотни текстур, десятки источников света. Но вот факт, который переворачивает представление о рендеринге: в подавляющем большинстве кадров игра не рисует от 70 до 95% всех объектов, существующих в сцене. Не потому что не может. А потому что их не видно.

За стеной, за которой вы стоите, может находиться целый город. Под полом — подвал с десятком комнат. За закрытой дверью — коридор с врагами. Всё это существует в памяти, но не тратит ни одного такта GPU. И именно Occlusion Culling: как игра не рендерит то, чего игрок не видит — тот механизм, который делает это возможным.

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

Что такое Occlusion Culling простыми словами

Occlusion Culling (отсечение по перекрытию) — это набор алгоритмов, которые определяют, какие объекты в трёхмерной сцене полностью или частично закрыты другими, более близкими объектами, и исключают их из процесса отрисовки.

Представьте, что вы смотрите в окно комнаты. За окном — улица, дома, люди. Но между вами и улицей — стена. Стена перекрывает вид. Рисовать то, что за стеной, бессмысленно: ни один пиксель скрытых объектов не попадёт на экран.

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

Occlusion Culling решает эту задачу: он отвечает на вопрос «виден ли объект из текущей точки камеры с учётом всех препятствий?» и, если ответ отрицательный, просто не отправляет объект на рендеринг.

Почему одного Frustum Culling недостаточно

Многие слышали про frustum culling — отсечение объектов, находящихся вне пирамиды видимости камеры. Это базовый и обязательный этап оптимизации. Однако он решает лишь часть проблемы.

Frustum culling говорит: «Объект находится в поле зрения камеры». Но он не говорит: «Объект действительно виден». Если перед вами стоит глухая стена, а за ней — десять зданий, все десять формально попадают в пирамиду видимости. Frustum culling их не отсечёт. И без дополнительного этапа отсечения по перекрытию видеокарта будет честно рисовать все десять зданий, хотя ни один их пиксель не появится на экране.

Именно поэтому Occlusion Culling работает как второй, более тонкий фильтр:

  • Первый фильтр (frustum culling) убирает объекты вне поля зрения
  • Второй фильтр (occlusion culling) убирает объекты, перекрытые ближней геометрией
  • Вместе они сокращают объём отрисовки на 80–95% в типичных сценах

Основные методы отсечения по перекрытию

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

Программная окклюзия (Software Occlusion Culling)

Движок строит упрощённую карту глубины сцены на стороне процессора. Для каждого потенциально видимого объекта проверяется, не перекрывается ли он уже записанной в карту геометрией. Если объект полностью «закрыт» — он исключается.

Преимущества: не зависит от видеокарты, работает предсказуемо, не вносит задержек в конвейер рендеринга.

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

Этот метод активно используется в движке Unity, где разработчик вручную задаёт статические объекты-окклюдеры (стены, здания, крупные блоки), а система автоматически определяет, что за ними скрыто.

Аппаратные запросы окклюзии (Hardware Occlusion Queries)

Видеокарте отправляется специальный запрос: «Если бы я попытался нарисовать этот объект, сколько его пикселей прошло бы тест глубины?» Если ответ — ноль, объект полностью закрыт и не рисуется.

Преимущества: высокая точность, учёт реальной геометрии и глубины.

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

Метод применяется в движках Unreal Engine и CryEngine как дополнительный уровень отсечения для динамических объектов.

Система порталов (Portal Culling)

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

Преимущества: крайне высокая эффективность в закрытых пространствах, минимальные затраты на проверку.

Недостатки: требует ручного или полуавтоматического разбиения уровня на ячейки. Плохо подходит для открытых миров.

Классические примеры: DOOM (1993), Half-Life, Counter-Strike, Thief. В этих играх уровни представляют собой лабиринты комнат, и портальная система работает идеально.

Потенциально видимые множества (Potentially Visible Set)

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

Преимущества: молниеносная работа в рантайме, нулевая нагрузка на процессор во время игры.

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

Метод прославился благодаря Quake (1996) и использовался во множестве шутеров на движке id Tech. Джон Кармак подробно описывал подход в своих технических заметках, опубликованных на сайте id Software.

Иерархический Z-буфер (Hierarchical Z-Buffer)

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

Преимущества: работает на стороне GPU, не требует предварительной подготовки, подходит для динамических сцен.

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

Как Occlusion Culling реализован в популярных движках

Unreal Engine

В Unreal Engine 4 и 5 окклюзия работает на нескольких уровнях. Статическая геометрия использует предварительные вычисления и иерархический Z-буфер. Динамические объекты проверяются через аппаратные запросы окклюзии. В Unreal Engine 5 добавлена интеграция с системой Nanite, которая выполняет отсечение на уровне кластеров треугольников, а не целых объектов.

Разработчик настраивает параметры в редакторе: размер ячейки, агрессивность отсечения, минимальный размер объекта, который подлежит проверке. Некорректная настройка может привести к «миганию» объектов — когда они появляются и исчезают на границе отсечения.

Unity

В Unity система окклюзии строится на этапе запекания (Bake). Разработчик помечает статические объекты как окклюдеры и окклюдируемые, после чего редактор вычисляет данные видимости. В рантайме система использует программную окклюзию с учётом подготовленных данных.

Для динамических объектов в Unity доступны API-вызовы к аппаратным запросам окклюзии, но они используются реже из-за сложности настройки и потенциальных задержек.

Собственные движки крупных студий

Студии уровня Rockstar, CD Projekt RED, Bethesda используют проприетарные решения, адаптированные под конкретные задачи. В Red Dead Redemption 2 система окклюзии тесно связана с потоковой подгрузкой и системой погоды: в тумане дальность видимости снижается, и отсечение работает агрессивнее. В Cyberpunk 2077 окклюзия комбинируется с вертикальным разделением города на уровни, чтобы не рисовать подземные парковки, когда игрок на улице.

Влияние Occlusion Culling на производительность и качество картинки

Правильно настроенное отсечение по перекрытию даёт колоссальный прирост производительности. В закрытых уровнях шутеров оно может сокращать количество вызовов отрисовки на 80–90%. В открытых мирах эффект скромнее — 30–50%, но и это критически важно.

Что происходит при отсутствии или некорректной работе окклюзии:

  • Частота кадров падает в 2–5 раз в насыщенных сценах
  • Видеопамять переполняется данными объектов, которые не видны
  • Время кадра становится нестабильным, появляются микрофризы
  • Вентиляторы видеокарты работают на максимальных оборотах без видимой причины

Возможные артефакты при агрессивном отсечении:

  • Объекты «пропадают» при взгляде под определённым углом
  • Тени от невидимых объектов исчезают
  • Отражения и глобальное освещение теряют вклад скрытых источников
  • Звук объекта, который был отсечён, может резко оборваться

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

Как геймер может наблюдать Occlusion Culling в действии

Хотя технология работает «за кулисами», внимательный игрок может заметить её следы.

Объекты появляются при повороте камеры. Если вы резко развернётесь в узком коридоре, дальние объекты могут «материализоваться» с задержкой в один-два кадра. Это момент, когда система окклюзии пересчитывает видимость и решает, что объект больше не перекрыт.

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

Режимы отладки и консольные команды. В ряде игр через консоль можно отключить окклюзию и увидеть, как резко падает FPS. В движках разработки (Unreal, Unity) существуют режимы визуализации, раскрашивающие объекты по статусу: видимый, перекрытый, отсечённый.

Сравнение производительности в разных локациях. Замечали, что в закрытом помещении игра работает плавнее, чем на открытой площади с тем же количеством объектов? Это заслуга окклюзии: стены и потолки перекрывают большую часть содержимого, и движок рисует минимум.

Связь с другими системами оптимизации

Occlusion Culling не работает в вакууме. Он тесно интегрирован с другими механизмами оптимизации рендеринга.

Frustum Culling — первый уровень фильтрации. Объект, не попавший в пирамиду видимости, даже не доходит до этапа проверки окклюзии.

LOD (Level of Detail) — упрощение геометрии на расстоянии. Объект, прошедший проверку окклюзии, может быть отрисован в упрощённом виде, если находится далеко.

Потоковая подгрузка (Streaming) — управление памятью. Объекты, которые гарантированно не видны (закрыты и далеко), могут быть выгружены из оперативной и видеопамяти.

Инстансирование (Instancing) — отрисовка множества одинаковых объектов за один вызов. Окклюзия может отсечь целую группу инстансов разом, если они перекрыты одним крупным объектом.

В совокупности эти системы создают многоуровневый конвейер, на каждом этапе которого из списка на отрисовку исключается всё лишнее.

Будущее технологии: что меняется с новым поколением железа

С приходом GPU с аппаратной трассировкой лучей, высокоскоростной памяти и многопоточных архитектур подход к окклюзии эволюционирует.

Трассировка лучей как инструмент окклюзии. При использовании ray tracing движок может трассировать лучи от камеры и определять видимость объектов с абсолютной точностью. Однако это дорого, поэтому трассировка применяется выборочно — для отражений, глобального освещения и теней, а не для базового отсечения.

Mesh Shaders и GPU-driven culling. Новые графические API позволяют видеокарте самостоятельно выполнять проверку видимости миллионов объектов без участия процессора. Это снимает главное узкое место традиционных подходов — передачу команд от ЦП к GPU.

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

Nanite и виртуализированная геометрия. В Unreal Engine 5 система Nanite выполняет отсечение не на уровне целых объектов, а на уровне кластеров треугольников. Это означает, что часть модели может быть отрисована, а часть — нет, в зависимости от перекрытия. Точность возрастает на порядок.

Практические советы для геймеров

Знание того, как работает Occlusion Culling: как игра не рендерит то, чего игрок не видит, может пригодиться и в повседневном гейминге.

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

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

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

Устанавливайте игры на SSD. Потоковая подгрузка тесно связана с окклюзией. Если данные не успевают подгрузиться, система не может корректно определить, что перекрыто, и рисует «запасные» варианты. Быстрый накопитель устраняет эту проблему.

FAQ: частые вопросы об Occlusion Culling

Вопрос: Что такое Occlusion Culling и зачем он нужен в играх?

Occlusion Culling — это технология определения и исключения из отрисовки объектов, которые полностью закрыты другими, более близкими объектами. Без неё видеокарта рисовала бы всё содержимое сцены, включая объекты за стенами и под полом, что привело бы к многократному падению производительности.

Вопрос: Чем Occlusion Culling отличается от Frustum Culling?

Frustum Culling отсекает объекты, находящиеся вне поля зрения камеры. Occlusion Culling идёт дальше: он исключает объекты, которые формально в поле зрения, но перекрыты ближней геометрией. Оба метода работают последовательно и дополняют друг друга.

Вопрос: Может ли отсечение по перекрытию вызывать визуальные баги?

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

Вопрос: Влияет ли Occlusion Culling на нагрузку процессора или видеокарты?

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

Вопрос: Работает ли Occlusion Culling в открытых мирах?

Работает, но менее эффективно, чем в закрытых уровнях. В открытом мире меньше крупных объектов-окклюдеров (стен, потолков), поэтому основной вклад в экономию вносят distance culling и LOD. Тем не менее здания, холмы и крупные структуры по-прежнему перекрывают значительную часть сцены.

Вопрос: Может ли игрок отключить Occlusion Culling?

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

Вопрос: Почему в старых играх не было заметно работы окклюзии?

В ранних 3D-играх уровни были простыми, объектов мало, а разрешение низкое. Необходимость в агрессивном отсечении была ниже. Кроме того, аппаратные возможности того времени не позволяли выполнять сложные проверки в реальном времени, и разработчики полагались на заранее подготовленные данные (PVS, порталы).

Заключение

Occlusion Culling: как игра не рендерит то, чего игрок не видит — это не просто техническая деталь. Это фундаментальный принцип, благодаря которому современные игры с миллионами объектов работают на домашних компьютерах и консолях. Без отсечения по перекрытию ни одна видеокарта не справилась бы с отрисовкой насыщенных сцен, и мы до сих пор играли бы в пустые уровни с десятком полигонов.

От порталов в DOOM до иерархического Z-буфера в современных движках, от PVS в Quake до кластерного отсечения в Nanite — технология прошла огромный путь. И с каждым поколением железа она становится точнее, быстрее и незаметнее для игрока.

Если вам было интересно узнать, как игра решает, что показывать, а что прятать, — поделитесь этой статьёй с друзьями, которые любят разбирать технологии «под капотом». И расскажите в комментариях: замечали ли вы когда-нибудь артефакты отсечения в играх? Объекты, которые появляются из ниоткуда, или тени, которые ведут себя нелогично? Ваш опыт может быть полезен другим читателям.

Комментарии

Добавить комментарий

Войти

Зарегистрироваться

Сбросить пароль

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

Войти с помошью