Введение
Метод рисования теней в компьютерных графических изображениях Картографирование теней или проекция теней - это процесс, посредством которого тени добавляются в 3D-компьютерную графику. Эта концепция была введена Лэнсом Уильямсом в 1978 году в статье под названием "Обращение изогнутых теней на изогнутые поверхности". С тех пор он использовался как в предварительно сделанных, так и в реальном времени сценах во многих консольных и компьютерных играх. Тени создаются путем проверки того, видим ли пиксель из источника света, путем сравнения пикселя с буфером z или изображением глубины изображения источника света, сохраненным в виде текстуры.
Shadow mapping or shadowing projection is a process by which shadows are added to 3D computer graphics. This concept was introduced by Lance Williams in 1978, in a paper entitled "Casting curved shadows on curved surfaces." Since then, it has been used both in pre rendered and realtime scenes in many console and PC games. Shadows are created by testing whether a pixel is visible from the light source, by comparing the pixel to a z buffer or depth image of the light source's view, stored in the form of a texture.
Принцип тени и карты теней
Если вы посмотрите на свет из источника света, все объекты, которые вы можете видеть, будут выглядеть в свете. Однако все, что находится за этими объектами, будет в тени. Это основной принцип, используемый для создания карты теней. Вид света отображается, сохраняя глубину каждой поверхности, которую он видит (карта теней). Далее обычная сцена отображается, сравнивая глубину каждой изображенной точки (как будто она видится светом, а не глазом) с этой картой глубины. Этот метод менее точен, чем теневые объемы, но теневая карта может быть более быстрой альтернативой в зависимости от того, сколько времени наполнения требуется для любого из методов в конкретном приложении, и поэтому может быть более подходящим для приложений в реальном времени. Кроме того, карты теней не требуют использования дополнительного буфера для штемпеля и могут быть изменены для получения теней с мягким краем. Однако, в отличие от объемов теней, точность карты теней ограничена ее разрешением.
Обзор алгоритма
Для создания теневой сцены требуется два основных шага. Первый из них создает карту теней, а второй применяет ее к сцене. В зависимости от реализации (и количества огней) для этого может потребоваться два или более прохождения.
Создание теневой карты
Первый шаг - изображение сцены с точки зрения света. Для точечного источника света, вид должен быть перспективной проекцией, такой же широкой, как его желаемый угол эффекта (это будет своего рода квадратный прожектор). Для направленного света (например, солнечного) следует использовать орфографическую проекцию. Из этого рендеринга глубинный буфер извлекается и сохраняется. Поскольку только информация о глубине имеет значение, обычно избегают обновления цветовых буферов и отключают все расчеты освещения и текстуры для этого рендеринга, чтобы сэкономить время рисования. Эта карта глубины часто сохраняется в виде текстуры в графической памяти. Эта карта глубины должна обновляться каждый раз, когда происходят изменения в свете или объектах на сцене, но может быть повторно использована в других ситуациях, например, когда движется только камера наблюдения. (Если световых приборов несколько, то для каждого светового прибора необходимо использовать отдельную карту глубины.) Во многих реализациях практично отображать только подмножество объектов в сцене на теневой карте, чтобы сэкономить некоторое время, необходимое для перерисования карты. Кроме того, глубинный офсет, который смещает объекты от света, может быть применен к рендерингу теневой карты в попытке решить проблемы сшивания, когда значение карты глубины близко к глубине наносимой поверхности (т. Е. поверхности отбрасывания теней) на следующем шаге. В качестве альтернативы, выбор передних лиц и только рендеринг задней части объектов на карте теней иногда используется для получения аналогичного результата.
Теневая сцена
Второй шаг - нарисовать сцену с обычной точки зрения камеры, применяя карту теней. Этот процесс состоит из трех основных компонентов. Первый шаг - найти координаты объекта, как видно из света, так как 3D-объект использует только 2D-координаты с осью X и Y для представления своей геометрической формы на экране, эти координаты вершин будут соответствовать соответствующим краям теневых частей внутри самой карты теней (карты глубины). Второй этап - это глубинный тест, который сравнивает значения z объекта с значениями z из карты глубины, и, наконец, после завершения, объект должен быть нарисован либо в тени, либо в свете.
Координаты светового пространства
Для проверки точки на карте глубины ее положение в координатах сцены должно быть преобразовано в эквивалентное положение, видимое при помощи света. Это достигается путем умножения матрицы. Расположение объекта на экране определяется обычным преобразованием координат, но для определения местоположения объекта в пространстве света необходимо создать второй набор координат. Матрица, используемая для преобразования мировых координат в координаты просмотра света, такая же, как и та, которая используется для рендеринга карты теней на первом шаге (при OpenGL это произведение матриц modelview и проекции). Это даст набор однородных координат, которые нуждаются в перспективном делении (см. 3D-проекцию), чтобы стать нормализованными координатами устройства, в которых каждый компонент (x, y или z) находится между -1 и 1 (если он видим с помощью светового обзора). Многие реализации (такие как OpenGL и Direct3D) требуют дополнительного масштаба и умножения матрицы смещения для отображения этих значений −1 к 1 до 0 к 1, которые являются более обычными координатами для поиска карты глубины (текстуры карты). Это масштабирование может быть выполнено до перспективного деления и легко складывается в предыдущий вычисление преобразования, умножая эту матрицу на следующее: Если это сделано с помощью шейдера или другого расширения графического оборудования, это преобразование обычно применяется на уровне вершин, а генерируемое значение интерполируется между другими вершинами и передается на уровень фрагмента.
If done with a shader, or other graphics hardware extension, this transformation is usually applied at the vertex level, and the generated value is interpolated between other vertices and passed to the fragment level.
Испытание на карте глубины
Как только координаты светового пространства найдены, значения x и y обычно соответствуют местоположению в текстуре карты глубины, а значение z соответствует его соответствующей глубине, которое теперь можно проверить на карте глубины. Если значение z больше значения, сохраненного на карте глубины в соответствующем (x,y) месте, объект считается находящимся за закрывающим объектом и должен быть отмечен как неисправность, которая должна быть нарисована в тени процессом рисования. В противном случае, он должен быть зажжен. Если местоположение (x,y) находится за пределами карты глубины, программист должен либо решить, что поверхность должна быть освещена, либо затенена по умолчанию (обычно освещена). В реализации шейдера эта проверка будет выполнена на уровне фрагмента. Кроме того, необходимо соблюдать осторожность при выборе типа хранения текстуры карты, который будет использоваться аппаратным обеспечением: если интерполяция не может быть выполнена, тень будет иметь резкий, зубчатый край (эффект, который может быть уменьшен с большим разрешением карты теней). Можно модифицировать тест карты глубины, чтобы получить тени с мягким краем, используя диапазон значений (на основе близости к краю тени), а не просто проходить или провалиться. Техника отображения теней также может быть модифицирована для нанесения текстуры на освещенные области, имитируя эффект проектора. На рисунке выше под заголовком "визуализация карты глубины, проецируемой на сцену" показан пример такого процесса.
Реализация теневой карты в реальном времени
Одним из ключевых недостатков картирования теней в реальном времени является то, что размер и глубина карты теней определяют качество окончательных теней. Это обычно видно как псевдоним или теневые сбои в непрерывности. Простой способ преодолеть это ограничение - увеличить размер теневой карты, но из-за ограничений памяти, вычислительных или аппаратных средств это не всегда возможно. Для обхода этого ограничения были разработаны широко используемые методы нанесения тень в реальном времени. К ним относятся Каскадные карты теней, Трапециевидные карты теней, Карты теней с перспективой в пространстве света или Карты параллельных разделенных теней. Также примечательно, что генерируемые тени, даже если они свободны, имеют твердые края, что не всегда желательно. Для того, чтобы эмулировать мягкие тени в реальном мире, было разработано несколько решений, либо путем выполнения нескольких поисков на карте теней, создания геометрии, предназначенной для эмуляции мягкого края, либо создания нестандартных карт глубины теней. Примечательными примерами являются карты с процентной близостью, смайлики и вариации теней.
Разделение
PSSM "Параллельный раскол" https://developer. - Нет, нет, нет. - Я не могу. html CSM "Каскадный" http://developer. Загрузить. - Нет, нет, нет. com/SDK/10.5/opengl/src/cascaded shadow maps/doc/cascaded shadow maps. (англ.) (недоступная ссылка) pdf
CSM "Cascaded" http://developer. download. nvidia. com/SDK/10.5/opengl/src/cascaded shadow maps/doc/cascaded shadow maps. pdf
Сгибание
LiSPSM "Перспектива в светлое пространство" https://www. - Да, сэр. Ты знаешь. кондиционер. at/research/vr/lispsm/ TSM "Трапезоид" http://www. Компенсация. - Нет. Учитель. - Я не знаю. PSM "Перспектива" http://www sop. Ириа. из "Ревс/Марк". Stamminger/psm/ CSSM "Камерное пространство" http://bib. - ИРБ. hr/datoteka/570987.12 CSSM. pdf
TSM "Trapezoid" http://www. comp. nus. edu. sg/~tants/tsm. html
PSM "Perspective" http://www sop. inria. fr/reves/Marc. Stamminger/psm/
CSSM "Camera Space" http://bib. irb. hr/datoteka/570987.12 CSSM. pdf
Сглаживание
PCF "Процентная более тесная фильтрация" https://developer. - Нет, нет, нет. - Я не могу. html - это
Фильтрация
ЭСМ "Экспоненциальный" https://discovery. УКЛ. кондиционер. uk/id/eprint/10001/1/10001. pdf CSM "Конволюция" https://doclib. Ухесселт. be/dspace/bitstream/1942/8040/1/3227. pdf VSM "Variance" http://citeseerx. Это так. ПСУ. edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf SAVSM "Суммированная область вариации" https://developer. - Нет, нет, нет. com/gpugems/gpugems3/part ii light and shadows/chapter 8 summed area variance shadow maps SMSR "Shadow Map Silhouette Revectorization" http://bondarev.com/part-ii-light-and-shadows/ Глава 8 суммированная область вариантности теневых карт SMSR "Теневая карта ревекторизации силуэта" http://bondarev.com/part-ii-light-and-shadows/ nl/?p=326
CSM "Convolution" https://doclib. uhasselt. be/dspace/bitstream/1942/8040/1/3227. pdf
VSM "Variance" http://citeseerx. ist. psu. edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf
SAVSM "Summed Area Variance" https://developer. nvidia. com/gpugems/gpugems3/part ii light and shadows/chapter 8 summed area variance shadow maps
SMSR "Shadow Map Silhouette Revectorization" http://bondarev. nl/?p=326
Мягкие тени
PCSS "Процент ближе" http://developer. Загрузить. - Нет, нет, нет. com/shaderlibrary/docs/shadow PCSS. Это не так. pdf VSSM "Variance Soft Shadow Mapping" https://jankautz. com/publications/VSSM PG2010. pdf SSSS "Мягкие тени в экране" http://www. - Нет, нет. com/doi/abs/10.1201/b10648 36 FIV "Вектор полного радиационного излучения" http://getlab. org/публикации/FIV/
VSSM "Variance Soft Shadow Mapping" https://jankautz. com/publications/VSSM PG2010. pdf
SSSS "Screen space soft shadows" http://www. crcnetbase. com/doi/abs/10.1201/b10648 36
FIV "Fullsphere Irradiance Vector" http://getlab. org/publications/FIV/