Существует две основные методики отрисовки теней:
- · Shadow volume
- · Shadow maps
Shadow volumes
Объект, отбрасывающий тень, называется Shadow Caster, объект, на которого отбрасывается тень — Shadow Receiver.
В идеале вся сцена является и Shadow Caster’ом, и Shadow Receiver’ом, но часто можно указать Shadow Caster’ы и Shadow Receiver’ы более детально, и получить на этом неслабую экономию ресурсов. Например, если у нас есть более-менее плоский ландшафт с объектами на нем, то логично не делать ландшафт Shadow Caster’ом.
При самозатенении Shadow Caster является еще и Shadow Receiver’ом своей же тени.
Вся идея данного метода заключается в построении такого объекта, что бы все что попадает внутрь него считалось затененным. Отсюда и Shadow Volume — теневой объем.
То есть для каждого объекта в сцене мы строим Shadow Volume — особый невидимый объект, такой, чтобы все, что попадало в тень от этого объекта, находилось внутри него. Понятно, что этот объем — это сам Shadow Caster, вытянутый по направлению от источника.
Shadow maps
Принцип построения теней в методе Shadow maps достаточно прост. Всё, что видно с позиции источника света, то освещено, остальное же находится в тени.
Принцип работы можно разделить на два этапа:
Рендеринг в текстуру глубины сцены с позиции источника света. Рендеринг происходит без использования материалов, чтобы уменьшить затраты ресурсов. Такую текстуру называют shadow map.
Рендеринг сцены с тенями, с использованием данных, полученных на первом этапе. [5].
Выбранный алгоритм В проекте использовался метод Shadow maps. Преимуществами этого алгоритма над Shadow volumes являются:
- · независимость от сложности геометрии;
- · слабые требования к качеству геометрии;
- · качественная реализация сглаженных теней.
В проекте также использовалось дополнение к алгоритму, с помощью которого тени сглаживались. При втором шаге тени отрисовываются в текстуру отдельно от всей геометрии, затем тени размываются с помощью blur фильтра и накладываются при построцессинге. Помимо визуального преимущества это также разгружает пиксельный шейдер при отрисовке материалов.