Объем тени

редактировать
Техника компьютерной графики Пример трафарета Кармака в Doom 3.

Объем тени - это техника, используемая в 3D компьютерной графике для добавления теней к визуализированной сцене. Впервые они были предложены Фрэнком Кроу в 1977 году как геометрия, описывающая трехмерную форму области, закрытой от источника света. Теневой объем делит виртуальный мир на две части: области, которые находятся в тени, и области, которые не находятся.

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

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

Содержание
  • 1 Конструкция
  • 2 Реализации буфера трафарета
    • 2.1 Глубинный проход
    • 2.2 Ошибка глубины
    • 2.3 Исключающее или
  • 3 Оптимизация
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки
    • 6.1 Относительно патентов с недостаточной глубиной
Конструкция

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

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

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

Основные шаги для формирования теневого объема:

  1. Найти все края силуэта (края, которые отделяют лицевую сторону от противоположных граней)
  2. Расширить все края силуэта в направлении от источника света
  3. Добавьте переднюю крышку и / или заднюю крышку к каждой поверхности, чтобы сформировать замкнутый объем (может быть необязательно, в зависимости от используемой реализации)
Иллюстрация теневых объемов. На изображении выше слева показана сцена, затененная с использованием теневых объемов. Справа теневые объемы показаны в каркасе. Обратите внимание на то, как тени образуют большую коническую область, направленную от источника света (яркая белая точка).
Реализации буфера трафарета

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

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

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

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

Глубинный проход

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

  1. Отключить запись в глубину и буферы цвета.
  2. Использовать отбраковку обратной стороны.
  3. Установите для операции трафарета значение приращение при проходе глубины (только подсчет теней перед объектом).
  4. Визуализация теневых объемов (из-за отсечения визуализируются только их передние грани).
  5. Использовать отсечение лицевых граней.
  6. Установить операцию трафарета на уменьшение при проходе глубины.
  7. Визуализируйте теневые объемы (визуализируются только их задние грани).

После этого все освещенные поверхности будут соответствовать 0 в буфере трафарета, где числа передней и задней поверхностей всех теневых объемов между глазом и этой поверхностью равны.

У этого подхода есть проблемы, когда глаз сам находится внутри теневого объема (например, когда источник света движется за объектом). С этой точки зрения глаз видит обратную сторону этого теневого объема прежде всего, и это добавляет смещение -1 ко всему буферу трафарета, эффективно инвертируя тени. Это можно исправить, добавив поверхность «шапочку» к передней части теневого объема, обращенной к глазу, например, на передней плоскости отсечения. Существует еще одна ситуация, когда глаз может находиться в тени объема, отбрасываемого объектом за камерой, который также необходимо каким-то образом закрыть, чтобы предотвратить аналогичную проблему. В большинстве распространенных реализаций, поскольку правильное ограничение прохода по глубине может быть затруднено, для этих особых ситуаций может быть лицензирован метод сбоя глубины (см. Ниже). В качестве альтернативы можно дать буферу трафарета смещение +1 для каждого теневого объема, внутри которого находится камера, хотя обнаружение может быть медленным.

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

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

Ошибка глубины

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

  1. Отключить запись в буферы глубины и цвета.
  2. Использовать отбраковку лицевой стороны.
  3. Установить операцию трафарета на увеличение при сбое глубины (только подсчет теней за объектом).
  4. Визуализируйте теневые объемы.
  5. Использовать отбраковку задней поверхности.
  6. Установите операцию трафарета на уменьшение при сбое глубины.
  7. Визуализируйте теневые объемы.

Метод отказа глубины учитывает те же соображения относительно точности буфера трафарета, что и метод прохода глубины. Кроме того, аналогично проходу глубины, его иногда называют методом z-fail .

Уильям Билодо и Майкл Сонги открыли эту технику в октябре 1998 года и представили ее на конференции разработчиков Creative Labs в 1999 году. Представили эту технику на обоих GDC в марте 1999 года. и в Creativity в конце 1999 года. Несколько месяцев спустя Уильям Билодо и Майкл Сонги в том же году подали заявку на патент США на этот метод, US 6384822, озаглавленный «Метод визуализации теней. с использованием теневого тома и буфера трафарета », выпущенного в 2002 году и истекшего в октябре 2019 года. Джон Кармак из id Software независимо обнаружил алгоритм в 2000 году во время разработки Doom 3.

Exclusive-or

Любой из вышеперечисленных типов может быть аппроксимирован вариацией Exclusive-or, которая не работает должным образом с пересекающимися теневыми объемами, но сохраняет один проход рендеринга ( если не время заполнения) и требует только 1-битного буфера трафарета. Следующие шаги относятся к версии с проходом глубины:

  1. Отключить запись в буферы глубины и цвета.
  2. Установить операцию трафарета на XOR при проходе глубины (перевернуть на любой теневой поверхности).
  3. Визуализируйте теневые объемы.
Оптимизация
  • Один из методов ускорения вычислений геометрии теневого объема - использовать существующие части конвейера визуализации для выполнения некоторых вычислений. Например, используя однородные координаты, w-координата может быть установлена ​​в ноль, чтобы расширить точку до бесконечности. Это должно сопровождаться усеченной пирамидой, которая имеет дальнюю плоскость отсечения, которая простирается до бесконечности для размещения этих точек, что достигается с помощью специальной матрицы проекции. Этот метод немного снижает точность буфера глубины, но разница обычно незначительна. См. Статью 2002 г. «Практические и надежные объемы теней для аппаратно-ускоренного рендеринга», C. Everitt и M. Килгарда, для подробной реализации.
  • Время растеризации теневых объемов можно уменьшить, используя аппаратный тест ножниц, чтобы ограничить тени конкретным экранным прямоугольником.
  • NVIDIA реализовал аппаратную возможность под названием тест границ глубины, которая предназначена для удаления частей теневых объемов, которые не влияют на видимую сцену. (Это было доступно, начиная с модели GeForce FX 5900.) Обсуждение этой возможности и ее использования с теневыми объемами было представлено на конференции разработчиков игр в 2005 году.
  • Так как метод отсутствия глубины дает преимущество перед проходом по глубине только в том особом случае, когда глаз находится в теневом объеме, в этом случае предпочтительно проверять и использовать проход глубины, где это возможно. Это позволяет избежать как ненужного обратного ограничения (и связанной с ним растеризации) для случаев, когда нет необходимости в отказе по глубине, так и проблемы надлежащего предварительного ограничения для особых случаев прохода по глубине.
  • В более поздних версиях Конвейеры графического процессора, геометрические шейдеры могут использоваться для генерации теневых объемов.
  • В системах, которые не поддерживают геометрические шейдеры, вершинные шейдеры также могут использоваться для создания тени объемы путем выборочного выдавливания вершин, которые уже находятся в памяти графического процессора.
См. также
Ссылки
Внешние ссылки

Что касается глубины- фальсификация патентов

Последняя правка сделана 2021-06-08 02:43:13
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте