Поделиться через


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

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

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

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

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

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

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

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

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

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

Передача 1

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

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

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

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

Pass 2

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

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

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

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

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

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

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

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

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

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

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

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

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

просмотр frustum с теневой картой

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

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

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

Каскадные карты тени (CSM) являются наиболее популярным способом для работы с псевдонимом перспективы. Хотя csms можно объединить с PSMs и LSPSMs, это не требуется. Использование CSM для устранения ошибок с псевдонимами перспективы рассматривается в следующей статье каскадные теневые карты.

Проецирование псевдонимов

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

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

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

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

Тень акне и ошибочное самотенение

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

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

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

тень акне артефакт

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

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

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

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

артефакт питера сдвига

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

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

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

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

Смещение глубины наклона

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

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

Рис. 10. Наклон масштабируемой глубины смещения по сравнению с неустраченной глубиной

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

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

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

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

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

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

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

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

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

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

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

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

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

AABB базирующаяся вблизи плоскости и дальней плоскости

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

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

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

близкие и дальние самолеты на основе сцены aabb

Frustum базируются вблизи плоскости и дальней плоскости

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

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

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

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

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

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

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

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

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

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

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

Рис. 15. Вблизи и далеко плоскостей, основанных на пересечении четырех вычисляемых плоскостей света frustum и ограничивающей геометрии сцены

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

Перемещение света в добавочных размерах Текселя

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

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

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

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

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

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

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

Рис. 17. Тени без сияния краев

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

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

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

        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. Острые края вызывают артефакты, исходящие из низкой глубины неравенства с смещениями

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

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

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

Каскадные карты теней

Также см . каскадные карты тени и пример приложения CascadedShadowMaps11. В примере демонстрируется алгоритм каскадной теневой карты (CSM), а также несколько методов, которые можно использовать для эффективного использования теневой карты.

Пример можно найти в пакете средств разработки программного обеспечения DirectX (SDK). Или вы можете выполнить поиск в Интернете, чтобы найти его на сайте GitHub.

Итоги

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

Доннелли, У. и Лауицен, А. Дисперсии теневых карт. Семинар по интерактивной трехмерной графике, материалы 2006 года по интерактивной трехмерной графике и играм. 2006, pp. 161–165.

Энгель, Woflgang F. Раздел 4. Каскадные теневые карты. ШейдерX5, расширенные методы отрисовки, Вольфганг Ф. Энгель, Эд. Чарльз Ривер Медиа, Бостон, Массачусетс. 2006. pp. 197–206.

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

Wimmer, M., Scherzer, D., и Purgathofer, W. Теневые карты с точки зрения светлого пространства. Еврографический симпозиум по отрисовке. 2004. Изменено 10 июня 2005 г. Technische Universität Wien.