Распространенные методики по улучшению карт глубины теней

Теневые карты, впервые представленные в 1978 году, являются распространенным методом добавления теней в игры. Три десятилетия спустя, несмотря на достижения в области оборудования и программного обеспечения, артефакты тени, а именно мерцающие края, псевдонимы перспективы и другие проблемы с точностью, сохраняются.

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

Выбор правильных методов для устранения определенных артефактов нетривиальный. При исправлении недостатков теневой карты разница в качестве может быть впечатляющей (рис. 1). Правильная реализация этих методов значительно улучшает стандартные тени. Методы, описанные в этой статье, реализованы в примере CascadedShadowMaps11 в пакете SDK для DirectX.

Рис. 1. Тени с серьезными артефактами (слева) и тени после реализации методов, описанных в этой статье (справа)

тени с серьезными артефактами (слева) и тени после реализации методов, описанных в этой статье (справа)

Обзор карт глубины тени

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

Рис. 2. Ключевые части теневой сцены

ключевые части теневой сцены

Проход 1

Сцена показана на рис. 2. На первом проходе (рис. 3) геометрия отрисовывается в буфер глубины с точки зрения света. В частности, вершинный шейдер преобразует геометрию в пространство зрения света.

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

Рис. 3. Первый проход базового сопоставления теней

первый проход базового сопоставления теней

Проход 2

Во втором проходе (рис. 4) вершинный шейдер преобразует каждую вершину дважды. Каждая вершина преобразуется в пространство обзора камеры и передается в пиксельный шейдер в качестве позиции. Каждая вершина также преобразуется матрицей текстуры представления, проекции и текстуры света и передается в пиксельный шейдер в качестве координаты текстуры. Матрица view-projection-texture — это та же матрица, которая используется для отрисовки сцены в проходе 1 с одним дополнительным преобразованием. Это преобразование, которое масштабирует и преобразует точки из пространства просмотра (–1 к 1 в X и Y) в пространство текстуры (от 0 до 1 в X и от 1 до 0 в Y).

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

Рис. Второй проход базового сопоставления теней

второй проход базового сопоставления теней

Артефакты теневой карты

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

Псевдоним перспективы

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

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

Рис. 5. Псевдонимы с высокой перспективой (слева) и псевдонимы с низкой перспективой (справа)

Сглаживание с высокой перспективой (слева) и псевдонимы с низкой перспективой (справа)

Для изображения слева псевдоним перспективы выше; Слишком много пикселей пространства глаз сопоставляют с теми же текселями карты теней. На изображении справа псевдонимы перспективы низкие, так как между пикселями пространства глаз и текселями теневой карты существует сопоставление 1:1.

Рис. 6. Просмотр frustum с теневой картой

view frustum with shadow map (Представление frustum с теневой картой)

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

Разрешение теневой карты также может быть слишком высоким. Хотя более высокое разрешение менее заметно, тем не менее это может привести к тому, что небольшие объекты, такие как телефонные провода, не отбрасывает тени. Кроме того, слишком высокое разрешение может привести к серьезным проблемам с производительностью из-за шаблонов доступа к текстурам.

Карты теней (PSM) и карты перспективы светового пространства (LSPSM) пытаются устранить псевдонимы перспективы путем перекоса матрицы проекции света, чтобы разместить больше текселей рядом с глазом, где они необходимы. К сожалению, ни один из методов не может решить псевдонимы перспективы. Параметризация преобразования, необходимого для сопоставления пикселей пространства глаза с текселями на карте теней, не может быть привязана линейным отклонением. Требуется логарифмическая параметризация. ПМС положить слишком много деталей рядом с глазом, в результате чего далекие тени будут низкого качества или даже исчезнуть. LSPSMs лучше найти середину между увеличением разрешения вблизи глаза и оставлением достаточной детализации для объектов далеко. В некоторых конфигурациях сцен оба метода дегенерируются до орфографических теней. Этому вырождению можно противодействовать, отрисовав отдельную карту теней для каждого лица фрустума зрения, хотя это дорого. Логарифмические теневые карты перспективы (LogPSMs) также отрисовывают отдельную карту для каждой стороны объекта представления. Этот метод использует нелинейную растеризацию, чтобы разместить больше текселей рядом с глазом. Оборудование классов D3D10 и D3D11 не поддерживает нелинейную растеризацию. Дополнительные сведения об этих методах и алгоритмах см. в разделе Ссылки.

Каскадные карты теней (CSM) являются наиболее популярным методом для работы с псевдонимами перспективы. Хотя csm можно сочетать с PSM и LSPSM, они не нужны. Использование CMS для исправления ошибок псевдонима перспективы рассматривается в статье Каскадные карты теней.

Projective Aliasing

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

Рис. 7. Высокопроективные псевдонимы и низкопроективные псевдонимы

Высокопроективные псевдонимы и низкопроективные псевдонимы

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

Теневые акне и ошибочные Self-Shadowing

Тень акне (рис. 8), термин, синоним ошибочного самозатенения, возникает, когда карта тени квантует глубину по всему текселю. Когда шейдер сравнивает фактическую глубину с этим значением, он, скорее всего, будет самозатенен, как и незатененный.

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

Рис. 8. Артефакт теневого акне

артефакт теней акне

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

Питер Паннинг

Термин Питер Паннинг является производным от детского книжного персонажа, чья тень стала отрешеной и кто мог летать. Этот артефакт делает объекты с отсутствующими тенями отсоединяться от поверхности и плавать над ней (рис. 9).

Рис. 9. Артефакт Питера Паннинга

Питер панорамирование артефакт

На изображении слева тень отделяется от объекта, создавая плавающий эффект.

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

Методы улучшения карт теней

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

Смещение глубины Slope-Scale

Как упоминалось ранее, самозатенение может привести к теневой акне. Добавление слишком большого предвзятости может привести к Питеру Паннингу. Кроме того, многоугольников с крутыми склонами (относительно света) больше страдают от проективных псевдонимов, чем многоугольников с мелкими склонами (относительно света). Из-за этого каждому значению карты глубины может потребоваться разное смещение в зависимости от наклона многоугольника относительно света.

Оборудование Direct3D 10 имеет возможность смещения многоугольника на основе его наклона относительно направления просмотра. Это имеет эффект применения большого смещения к многоугольнику, который рассматривается краем к направлению света, но не применяется к многоугольнику, обращенном непосредственно к свету. На рисунке 10 показано, как два соседних пикселя могут чередоваться между затенениями и незатенениями при тестировании на одном и том же непредвзятом наклоне.

Рис. Наклон по масштабируемой глубине по сравнению с непредвзятой глубиной

наклон масштабируемой глубины по сравнению с непредвзятой глубиной

Вычисление жесткой проекции

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

Рис. 11. Произвольные тень frustum и shadow frustum подходят к сцене

произвольный frustum тени и тень frustum подходят к сцене

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

На рисунке 12 показаны правильно подходящие значения frustum. Чтобы вычислить проекцию, восемь точек, составляющих представление frustum, преобразуются в световое пространство. Затем будут найдены минимальное и максимальное значения в X и Y. Эти значения составляют границы для орфографической проекции.

Рис. 12. Теневая проекция, подходящая для просмотра frustum

теневая проекция, подходящая для просмотра frustum

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

Вычисление ближней и дальней плоскости

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

Буфер глубины может быть 16-разрядным, 24-разрядным или 32-разрядным со значениями от 0 до 1. Как правило, буферы глубины являются фиксированной точкой, при этом значения, близкие к ближней плоскости, группируются более тесно, чем значения, близкие к дальней плоскости. Степень точности буфера глубины определяется отношением ближней плоскости к дальней плоскости. Использование максимально жесткой ближней и дальней плоскости может позволить использовать 16-разрядный буфер глубины. 16-разрядный буфер глубины может сократить использование памяти при одновременном увеличении скорости обработки.

AABB-Based ближней и дальней плоскости

Простой и наивный способ вычисления ближней и дальней плоскости заключается в том, чтобы преобразовать ограничивающий объем сцены в световое пространство. Наименьшее значение Z-координат является ближней плоскостью, а наибольшее Z-координатное значение — дальняя плоскость. Для многих конфигураций сцены и света этого подхода достаточно. В худшем случае, однако, может привести к значительной потере точности в буфере глубины; На рисунке 13 показан такой сценарий. Здесь диапазон ближней плоскости до дальней плоскости в четыре раза больше, чем необходимо.

Представление на рис. 13 было намеренно выбрано как небольшое. Небольшой вид frustum показан в очень большой сцене, состоящей из столбов, простирающихся от камеры обзора. Использование сцены AABB для ближней и дальней плоскостей не является оптимальным. Алгоритм CSM, описанный в технической статье Каскадные карты теней , должен вычислять ближние и дальние плоскости для очень маленьких рывков.

Рис. 13. Ближние и дальние самолеты, основанные на сцене AABB

ближние и дальние плоскости, основанные на сцене aabb

Frustum-Based ближней и дальней плоскости

Другой метод вычисления ближней и дальней плоскостей заключается в преобразовании frustum в светлое пространство и использовании минимального и максимального значений в Z в качестве ближней и дальней плоскостей соответственно. На рисунке 14 показаны две проблемы, связанные с этим подходом. Во-первых, вычисление слишком консервативное, как показано, когда frustum выходит за пределы геометрии сцены. Во-вторых, ближний самолет может быть слишком тугой, в результате чего теневые литейщики будут обрезаны.

Рис. 14. Ближние и дальние плоскости, основанные исключительно на обзоре frustum

ближние и дальние плоскости, основанные исключительно на обзоре frustum

Свет Frustum пересекается со сценой для вычисления ближней и дальней плоскостей

Правильный способ вычисления ближней и дальней плоскостей показан на рис. 15. Четыре из плоскостей орфографической орфографической фрустумы были рассчитаны с использованием минимальной и максимальной координат X и Y представления frustum в световом пространстве. Последние две плоскости ортогонального обзора frustum являются ближней и дальней плоскостями. Чтобы найти эти плоскости, границы сцены обрезаются по четырем известным световым плоскостям frustum. Наименьшие и самые большие Z-значения из вновь обрезанной границы представляют ближней и дальней плоскости соответственно.

Код, выполняющий эту операцию, находится в примере CascadedShadowMaps11. Восемь точек, составляющих мир AABB, преобразуются в световое пространство. Преобразование точек в светлое пространство упрощает тесты обрезки. Четыре известные плоскости светлого фрестума теперь можно представить в виде линий. Сцены, ограничивающие объем в световом пространстве, можно представить в виде шести четырехугольника. Эти 6 четырехугольника можно затем превратить в 12 треугольников для вырезки на основе треугольников. Треугольники обрезаются на известных плоскостях фрустума обзора (это горизонтальные и вертикальные линии в X и Y в световом пространстве). При обнаружении точки пересечения в X и Y трехмерный треугольник обрезается в этой точке. Минимальное и максимальное Z-значения всех обрезанных треугольников — это ближней и дальней плоскости. В примере CascadedShadowMaps11 показано, как выполнить эту обрезку в функции ComputeNearAndFar .

Есть еще два метода, которые можно использовать для вычисления наиболее жестких возможных ближней и дальней плоскостей. Эти методы не показаны в примере CascadedShadowMaps.

  • Еще более тесной ближней и дальней плоскости можно вычислить путем пересечения иерархии сцены или отдельных объектов в сцене со светлой фрустумом. Это было бы сложнее с точки зрения вычислений. Хотя этот метод не показан в примере CascadedShadowMaps11, это может быть допустимым методом для некоторых плиток.

  • Дальней плоскости можно вычислить с помощью минимума:

    • Наибольшая глубина обзора frustum в световом пространстве.
    • Наибольшая глубина пересечения представления frustum и сцены AABB.

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

Рис. 15. Ближней и дальней плоскости, основанные на пересечении четырех вычисляемых плоскостей светового фрустума и ограничивающей геометрии сцены

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

Перемещение света с шагом Texel-Sized

Распространенным артефактом в теневых картах является мерцающий эффект края. По мере перемещения камеры пиксели вдоль краев теней ярче и темнеют. Это не видно на неподвижных изображениях, но это очень заметно и отвлекает в режиме реального времени. На рисунке 16 показана эта проблема, а на рис. 17 показано, как должны выглядеть края тени.

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

  • Размер представления frustum
  • Ориентация представления frustum
  • Расположение света
  • Расположение камеры

При каждом изменении матрицы края теней могут меняться.

Рис. 16. Мерцающие края тени

мерцающие края тени

Пиксели вдоль границы тени входят и выходят из тени при перемещении камеры слева направо.

Рис. 17. Тени без мерцающих краев

тени без мерцающих краев

Края тени остаются постоянными при перемещении камеры слева направо.

Для направленных огней решением этой проблемы является округление минимального и максимального значений в X и Y (которые составляют границы орфографической проекции) до приращения размера пикселей. Это можно сделать с помощью операции деления, операции floor и умножения.

        vLightCameraOrthographicMin /= vWorldUnitsPerTexel;
        vLightCameraOrthographicMin = XMVectorFloor( vLightCameraOrthographicMin );
        vLightCameraOrthographicMin *= vWorldUnitsPerTexel;
        vLightCameraOrthographicMax /= vWorldUnitsPerTexel;
        vLightCameraOrthographicMax = XMVectorFloor( vLightCameraOrthographicMax );
        vLightCameraOrthographicMax *= vWorldUnitsPerTexel;

Значение vWorldUnitsPerTexel вычисляется путем принятия границы представления frustum и деления на размер буфера.

        FLOAT fWorldUnitsPerTexel = fCascadeBound /
        (float)m_CopyOfCascadeConfig.m_iBufferSize;
        vWorldUnitsPerTexel = XMVectorSet( fWorldUnitsPerTexel, fWorldUnitsPerTexel,                            0.0f, 0.0f );

Ограничение максимального размера представления frustum приводит к более слабому подходу к орфографической проекции.

Важно отметить, что при использовании этого метода текстура на 1 пиксель больше по ширине и высоте. Это предотвращает индексирование теневых координат за пределами теневой карты.

Заднее лицо и переднее лицо

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

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

Теневая карта — удобная геометрия

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

Жесткие края являются проблематичными для самозатенения. Разница в глубине у кончика края очень мала. Даже небольшое смещение может привести к потере тени объектов (рис. 18).

Рис. 18. Острые края вызывают артефакты, вытекающие из низкой глубины несоответствия со смещениями

острые края вызывают артефакты, вытекающие из низкой глубины несоответствия со смещениями

Узкие объекты, такие как стены, должны иметь спинки, даже если они никогда не видны. Это увеличит неравенство глубины.

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

Сводка

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

Доннелли, У., и Лоуицен, A. Дисперсии теневых карт. Symposium on Interactive 3D Graphics, Proceedings of the 2006 Symposium on Interactive 3D Graphics and Games. 2006, стр. 161–165.

Engel, Woflgang F. Раздел 4. Каскадные карты теней. ShaderX5, Advanced Rendering Techniques, Wolfgang F. Engel, Ed. Чарльз Ривер Медиа, Бостон, Штат Массачусетс. 2006. стр. 197–206.

Заммингер, Марк и Дреттакис, Джордж. Карты теней перспективы. Международная конференция по компьютерной графике и интерактивным методам, материалы 29-й ежегодной конференции по компьютерной графике и интерактивным методам. 2002, стр. 557–562.

Wimmer, M., Scherzer, D., and Purgathofer, W. Light Space Perspective Shadow Maps. Eurographics Symposium on Rendering. 2004. Изменено 10 июня 2005 г. Technische Universität Wien.