Типы карт теней: shadow map, PCF, PCSS, Poisson

Карты теней являются важнейшим элементом в рендеринге 3D-графики, так как они обеспечивают реалистичное освещение и добавляют глубину сценам. Однако, несмотря на свою важность, простое использование стандартной карты теней может привести к ряду визуальных дефектов, таких как алиасинг, артефакты и нечёткость. Для устранения этих проблем существует несколько техник улучшения качества карт теней. В данной главе рассматриваются основные методы работы с тенями в Babylon.js, включая shadow map, PCF, PCSS и Poisson.

Shadow Map

Shadow map — это наиболее популярный метод, используемый для создания теней в 3D-графике. Суть этого подхода заключается в следующем: на этапе рендеринга сцены создаётся специальная текстура (shadow map), в которой хранятся данные о том, что находится в тени, а что — на свету. Эта текстура генерируется с точки зрения источника света и используется при рендеринге финальной сцены для вычисления освещённости объектов.

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

Недостатки метода shadow map:

  • Aliasing — в случае высоких углов обзора или крупных объектов в тени появляются чёткие линии и контуры, что сильно ухудшает качество изображения.
  • Тени с резкими краями — shadow map не всегда предоставляет информацию о плавных переходах от света к тени, что приводит к появлению резких краёв теней.

PCF (Percentage Closer Filtering)

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

Основной принцип работы PCF заключается в том, что для каждого пикселя, который находится на границе тени, выполняется несколько проверок близлежащих пикселей на shadow map. Эти проверки берутся с определённым шагом и усредняются для получения более мягкого и сглаженного перехода. Чем больше проверок выполняется, тем плавнее становится край тени.

Преимущества PCF:

  • Уменьшает появление резких переходов и алиасинга.
  • Может значительно улучшить визуальное качество, особенно на больших и сложных сценах.

Однако существует и недостаток: увеличение количества проверок пикселей на shadow map существенно увеличивает нагрузку на процессор и видеокарту, что может замедлить рендеринг.

PCSS (Percentage Closer Soft Shadows)

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

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

Алгоритм PCSS работает следующим образом:

  1. Производится вычисление различных «облаков» (regions), для которых будет использовано сглаживание.
  2. Затем для каждого пикселя на границе тени производится усреднение значений нескольких пикселей shadow map, но с учётом расстояния от источника света.

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

Poisson Disk Sampling

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

Идея Poisson Disk Sampling заключается в том, что он генерирует точки на поверхности, которые находятся на определённом расстоянии друг от друга. Это позволяет избежать ситуаций, когда точки слишком близки, что может вызвать потерю качества рендеринга. Для генерации этих точек используется алгоритм, который ищет позиции с минимальным расстоянием между точками, что даёт более гармоничную выборку.

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

Сравнение методов

  • Shadow Map — это базовый метод, который обеспечивает быстрое рендеринг и хорошую производительность. Однако он страдает от алиасинга и жёстких краёв теней.
  • PCF улучшает качество карт теней путём сглаживания, но добавляет дополнительную нагрузку на систему, особенно при большом количестве проверок.
  • PCSS даёт ещё более качественные и натуральные тени, но его реализация сложнее и требует больше вычислительных ресурсов.
  • Poisson Disk Sampling даёт равномерное распределение точек для сглаживания, обеспечивая плавность теней, но также может потребовать значительных ресурсов, особенно на крупных сценах.

В Babylon.js использование этих методов реализовано через настройки ShadowGenerator. При выборе подходящего метода важно учитывать как требования к качеству, так и производительность системы.