Перейти к основному содержимому

Видимость и буфер глубины

Программистам CG

Камера видит не всю сцену целиком: объекты перекрывают друг друга. Задача видимости — для каждого пикселя выбрать ближайшую к камере поверхность (или линию в 2.5D). От выбранного метода зависят и скорость, и артефакты.

Контекст

Конвейер растеризации — 13.md. OpenGL depth test — 18.md. BSP для уровней — 16.md.


Видимость и буфер глубины

Лицевые грани и отсечение по нормали

Back-face culling — не рисовать треугольники, чья нораль «смотрит» от камеры (знак скалярного произведения нормали и вектора взгляда). Работает для замкнутых водонепроницаемых мешей; для открытых поверхностей (лист, лента) culling отключают.


Буфер глубины (z-buffer)

Самый распространённый метод в real-time 3D.

  1. Для каждого пикселя хранят глубину ближайшего пока что нарисованного фрагмента.
  2. Новый фрагмент сравнивают с записью; если он ближе — перезаписывают цвет и глубину.
  3. Тест выполняет GPU (depth test); порядок отрисовки объектов не важен (для непрозрачной геометрии).

Проблемы: fighting z (близкие coplanar поверхности), нужна согласованность near/far плоскостей камеры. Полупрозрачность обычно рисуют после непрозрачного, сортировкой back-to-front — z-buffer один не решает смешивание альфы.

Иерархический z-buffer (Hi-Z) — пирамида минимальных глубин по блокам экрана; отсекает целые треугольники до растеризации. Используется в GPU и occlusion culling.


Методы без z-buffer (история и ниши)

МетодИдеяМинус
Алгоритм художникаСортировка полигонов от дальних к ближнимO(n log n), ошибки при пересечениях
Робертс / АппельАналитическое удаление невидимых рёберДорого для сложных мешей
Ray casting на пиксельЛуч из камеры, первое пересечениеБез ускорения — медленно
BSP-деревоПорядок обхода даёт правильную перерисовку для статичной indoor-сценыДолгое построение, плохо для динамики

В современных API z-buffer включён по умолчанию; художник и BSP остаются в учебниках и level design.


Порталы и PVS

В коридорных уровнях (шутеры, квесты) комнаты соединены порталами — полигонами-«окнами». Если камера в комнате A, рисуют только комнаты, достижимые через видимые порталы.

PVS (Potentially Visible Set) — для каждой зоны заранее (offline) считают множество потенциально видимых зон. В runtime лишние комнаты не отправляют в GPU. Классика 1990–2000-х; в открытых мирах чаще streaming + occlusion + Hi-Z.

BSP из пространственных структур помогает и сортировке, и построению порталов.


Сводка

ЗадачаПрактичный выбор
Игра, general meshZ-buffer + back-face cull + frustum cull
ПрозрачностьСортировка + blend после opaque pass
Indoor, мало динамикиПорталы / PVS + z-buffer
Офлайн качествоRay tracing / path tracing (13.md)

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").