Объем тени - Shadow volume

Пример трафарета Кармака в Судьба 3.

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

В трафаретный буфер реализация теневых объемов обычно считается одним из наиболее практичных методов затенения в реальном времени общего назначения для использования на современном оборудовании для 3D-графики[нужна цитата ]. Это было популяризировано видео игра Судьба 3, а особый вариант техники, используемой в этой игре, стал известен как Реверс Кармака.

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

Строительство

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

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

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

Основные этапы формирования теневого объема:

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

Реализации буфера трафарета

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

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

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

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

Глубина прохода

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

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

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

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

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

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

Глубина провала

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

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

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

Уильям Билодо и Майкл Сонги открыли эту технику в октябре 1998 года и представили ее на конференции разработчиков Creative Labs в 1999 году.[2] Сим Дитрих представили эту технику на обоих GDC в марте 1999 г. и в Creativity в конце 1999 г.[3][4] Несколько месяцев спустя Уильям Билодо и Майкл Сонги подали Заявка на патент США для техники того же года, США 6384822 "Метод рендеринга теней с использованием теневого объема и буфера трафарета", выпущенный в 2002 году, срок действия которого истек в октябре 2019 года. Джон Кармак из id Программное обеспечение независимо открыл алгоритм в 2000 году во время разработки Судьба 3.[5]

Эксклюзивный или

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

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

Оптимизация

  • Одним из методов ускорения вычислений геометрии теневого объема является использование существующих частей конвейера рендеринга для выполнения некоторых вычислений. Например, используя однородные координаты, то ш-координата может быть установлена ​​на ноль, чтобы расширить точку до бесконечности. Это должно сопровождаться просмотр усечённой пирамиды который имеет дальнюю плоскость отсечения, которая простирается до бесконечности для размещения этих точек, что достигается с помощью специальной матрицы проекции. Этот метод немного снижает точность буфера глубины, но разница обычно незначительна. См. Статью 2002 г. «Практичные и надежные трафаретные объемы теней для аппаратно-ускоренного рендеринга», К. Эверит и М. Килгард, для детальной реализации.
  • Время растеризации теневых объемов можно уменьшить, используя аппаратный тест ножниц, чтобы ограничить тени определенным прямоугольником на экране.
  • NVIDIA реализовал аппаратную возможность, называемую проверка границ глубины который предназначен для удаления частей теневых объемов, которые не влияют на видимую сцену. (Это было доступно с GeForce Модель FX 5900). Обсуждение этой возможности и ее использования с теневыми объемами было представлено на Конференция разработчиков игр в 2005 году.[6]
  • Поскольку метод отсутствия глубины дает преимущество перед проходом по глубине только в особом случае, когда глаз находится в теневом объеме, предпочтительно проверить этот случай и по возможности использовать проход по глубине. Это позволяет избежать как ненужного обратного каскадирования (и связанной с ним растеризации) для случаев, когда отказ по глубине не нужен, так и проблемы надлежащего переднего заглушки для особых случаев прохождения глубины.[нужна цитата ].
  • На более поздних конвейерах GPU геометрические шейдеры может использоваться для создания теневых объемов.[7][8]
  • В системах, которые не поддерживают геометрические шейдеры, вершинные шейдеры также может использоваться для создания теневых объемов путем выборочного выдавливания вершин, которые уже находятся в памяти графического процессора.[9]

Смотрите также

Рекомендации

  1. ^ Ворона, Франклин К. "Алгоритмы теней для компьютерной графики ", Компьютерная графика (Материалы SIGGRAPH '77), т. 11, вып. 2, 242-248.
  2. ^ Йена, Хун (2002-12-03). "Теория трафаретных теневых объемов". GameDev.net. Получено 2010-09-12.
  3. ^ «Запатентованные трафареты теней !? Черт возьми! - GameDev.net». 2004-07-29. Получено 2012-03-28.
  4. ^ «Креативные патенты реверс Кармака». Технический отчет. 2004-07-29. Получено 2010-09-12.
  5. ^ Килгард, Марк; Джон Кармак. "Джон Кармак о теневых объемах ..." Страница практичных и надежных теневых томов в NVIDIA Developer Zone. archive.org: NVIDIA. Архивировано 27 января 2009 года.. Получено 18 октября 2012.CS1 maint: неподходящий URL (связь)
  6. ^ Lengyel, Эрик. «Улучшенная визуализация трафаретных теней и полутеневого клина» (PDF). Конференция разработчиков игр 2005 г.. 2005. Получено 18 октября 2012.
  7. ^ https://web.archive.org/web/20110516024500/http://developer.nvidia.com/node/168
  8. ^ Стич, Мартин; Карстен Вехтер; Александр Келлер (2007). "Глава 11" Эффективные и надежные объемы теней с использованием иерархического отсечения окклюзии и геометрических шейдеров"". Камни GPU 3. archive.org: nVidia / Addison-Wesley. Архивировано 16 мая 2011 года.. Получено 18 октября 2012.CS1 maint: неподходящий URL (связь)
  9. ^ Бреннан, Крис. «Экструзия теневого объема с использованием вершинного шейдера» (PDF). AMD. Получено 2018-02-14.

внешняя ссылка

Относительно патентов на глубину