Объем тени
Эта статья нуждается в дополнительных цитатах для проверки . ( июль 2024 г. ) |
Объем теней — это метод, используемый в компьютерной 3D-графике для добавления теней к визуализированной сцене. Впервые они были предложены Фрэнком Кроу в 1977 году. [ 1 ] как геометрия, описывающая трехмерную форму области, закрытой от источника света. Теневой объем делит виртуальный мир на две части: области, находящиеся в тени, и области, которые нет.
Реализация теневых объемов в трафаретном буфере обычно считается одним из наиболее практичных методов затенения общего назначения в реальном времени для использования на современном оборудовании для 3D-графики. [ нужна ссылка ] . Он был популяризирован видеоигрой Doom 3 , а конкретный вариант техники, использованной в этой игре, стал известен как «Реверс Кармака» .
Теневые тома стали популярным инструментом для затенения в реальном времени наряду с более почтенными картами теней . Основное преимущество объемов теней заключается в том, что они точны до пикселя (хотя во многих реализациях есть небольшая проблема с самозатенением вдоль края силуэта, см. построение ниже), тогда как точность карты теней зависит от выделенной ей текстурной памяти. а также угол, под которым отбрасываются тени (под некоторыми углами точность карты теней неизбежно страдает). Однако этот метод требует создания теневой геометрии, которая может сильно нагружать процессор (в зависимости от реализации). Преимущество карт теней в том, что они часто выполняются быстрее, поскольку полигоны объема теней часто очень велики по размеру экрана и требуют много времени на заливку (особенно для выпуклых объектов), тогда как карты теней не имеют этого ограничения.
Строительство
[ редактировать ]Чтобы создать теневой объем, спроецируйте луч от источника света через каждую вершину объекта, отбрасывающего тень, в некоторую точку (обычно на бесконечность). Эти проекции вместе образуют объем; любая точка внутри этого объема находится в тени, все снаружи освещено светом.
Для многоугольной модели объем обычно формируется путем классификации каждой грани в модели как обращенной к источнику света или обращенной от источника света. Набор всех ребер, соединяющих обращенную сторону с противоположной стороной, образует силуэт относительно источника света. Края, образующие силуэт, вытянуты в сторону от света, чтобы создать грани теневого объема. Этот объем должен охватывать всю видимую сцену; часто для этого размеры теневого объема расширяются до бесконечности (см. оптимизацию ниже). Чтобы сформировать закрытый объем, передняя и задняя часть этого выдавливания должны быть закрыты. Эти покрытия называются «шапками». В зависимости от метода, используемого для создания теневого объема, передняя часть может быть закрыта самим объектом, а задняя часть иногда может быть опущена (см. проход глубины ниже).
Также существует проблема с тенью: лица вдоль края силуэта относительно неглубокие. В этом случае тень, которую объект отбрасывает сам на себя, будет резкой, раскрывающей его полигональные грани, тогда как обычная модель освещения будет иметь постепенное изменение освещения вдоль грани. Это оставляет грубую тень возле края силуэта, которую трудно исправить. Увеличение плотности полигонов минимизирует проблему, но не устранит ее. Если передняя часть теневого объема ограничена, весь теневой объем может быть слегка смещен в сторону от источника света, чтобы удалить любые самопересечения теней в пределах расстояния смещения края силуэта (это решение чаще используется при отображении теней ).
Основные этапы формирования теневого объема:
- Найдите все ребра силуэта (ребра, которые отделяют лицевые грани от обращенных назад).
- Расширьте все края силуэта в направлении от источника света.
- Добавьте переднюю крышку и/или заднюю крышку к каждой поверхности, чтобы сформировать закрытый объем (может не потребоваться, в зависимости от используемой реализации).
Реализации трафаретного буфера
[ редактировать ]После Кроу в 1991 году Тим Хайдманн показал, как использовать трафаретный буфер для рендеринга теней с теневыми объемами достаточно быстро для использования в приложениях реального времени. Существует три распространенных варианта этого метода: проход глубины , провал глубины и исключающее-или , но все они используют один и тот же процесс:
- Отобразите сцену так, как если бы она была полностью в тени.
- Для каждого источника света:
- Используя информацию о глубине из этой сцены, создайте в буфере трафарета маску, в которой есть отверстия только там, где видимая поверхность не находится в тени.
- Снова визуализируйте сцену, как если бы она была полностью освещена, используя трафаретный буфер, чтобы замаскировать затененные области. Используйте аддитивное смешивание, чтобы добавить этот рендер в сцену.
Разница между этими тремя методами заключается в создании маски на втором этапе. Некоторые требуют двух проходов, некоторые — только одного; некоторые требуют меньшей точности в буфере трафарета.
Теневые объемы, как правило, покрывают большие части видимой сцены и в результате отнимают ценное время растеризации (время заполнения) на оборудовании 3D-графики. Эта проблема усугубляется сложностью объектов, отбрасывающих тени, поскольку каждый объект может отбрасывать на экран свой собственный объем тени любого потенциального размера. См. раздел «Оптимизация» ниже, где обсуждаются методы, используемые для решения проблемы времени заполнения.
Глубина прохода
[ редактировать ]Хейдманн предположил, что если передние и задние поверхности теней визуализировались за отдельные проходы, количество передних и задних граней перед объектом можно подсчитать с помощью трафаретного буфера. Если поверхность объекта находится в тени, между ним и глазом будет больше теневых поверхностей, обращенных вперед, чем теневых поверхностей, обращенных назад. Однако если их количество одинаково, поверхность объекта не находится в тени. Генерация трафаретной маски работает следующим образом:
- Отключите запись в буферы глубины и цвета.
- Используйте отбраковку обратной грани .
- Установите операцию трафарета на приращение при проходе глубины (считать только тени перед объектом).
- Рендеринг теневых объемов (из-за отсеивания визуализируются только их передние грани).
- Используйте отсечение передней поверхности.
- Установите операцию трафарета на уменьшение при проходе по глубине.
- Рендеринг теневых объемов (рендерится только их обратная сторона).
После того, как это будет выполнено, все освещенные поверхности будут соответствовать 0 в трафаретном буфере, где количество передних и задних поверхностей всех теневых объемов между глазом и этой поверхностью одинаково.
У этого подхода возникают проблемы, когда сам глаз находится внутри теневого объема (например, когда источник света движется за объектом). С этой точки зрения глаз видит обратную сторону этого теневого объема раньше всего остального, и это добавляет смещение -1 ко всему буферу трафарета, эффективно инвертируя тени. Это можно исправить, добавив поверхность «шапочки» к передней части теневого объема, обращенной к глазу, например, к передней плоскости отсечения . Существует еще одна ситуация, когда глаз может находиться в тени объема, отбрасываемого объектом за камерой, который также необходимо каким-то образом закрыть, чтобы предотвратить подобную проблему. В большинстве распространенных реализаций, поскольку правильное ограничение прохода глубины может быть затруднено, для этих особых ситуаций может быть лицензирован метод отказа глубины (см. ниже). В качестве альтернативы можно задать буферу трафарета смещение +1 для каждого теневого объема, внутри которого находится камера, хотя обнаружение может быть медленным.
Существует еще одна потенциальная проблема, если в буфере трафарета недостаточно битов для размещения количества теней, видимых между глазом и поверхностью объекта, поскольку он использует арифметику насыщения . (Если бы вместо этого они использовали арифметическое переполнение , проблема была бы незначительной.)
Тестирование глубины также известно как тестирование z-прохода , поскольку буфер глубины часто называют z-буфером.
Ошибка глубины
[ редактировать ]Примерно в 2000 году несколько человек обнаружили, что метод Хайдмана можно заставить работать для всех положений камеры, изменив глубину. Вместо подсчета теневых поверхностей перед поверхностью объекта можно так же легко подсчитать поверхности за ним, с тем же конечным результатом. Это решает проблему нахождения глаза в тени, поскольку объемы тени между глазом и объектом не учитываются, но вводит условие, что задний конец объема тени должен быть ограничен, иначе тени в конечном итоге будут отсутствовать там, где указывает объем. назад в бесконечность.
- Отключите запись в буферы глубины и цвета.
- Используйте отсечение передней поверхности.
- Установите операцию трафарета на увеличение при сбое глубины (считать только тени позади объекта).
- Рендеринг теневых объемов.
- Используйте отбраковку обратной грани.
- Установите операцию трафарета на уменьшение при сбое глубины.
- Рендеринг теневых объемов.
Метод провала глубины имеет те же соображения относительно точности буфера трафарета, что и метод прохода глубины. Кроме того, как и при проходе по глубине, его иногда называют методом z-fail .
Уильям Билодо и Майкл Сонги открыли эту технику в октябре 1998 года и представили ее на Creativity, конференции разработчиков Creative Labs, в 1999 году. [ 2 ] Сим Дитрих представил эту технику на GDC в марте 1999 года и на Creativity в конце 1999 года. [ 3 ] [ 4 ] Несколько месяцев спустя Уильям Билодо и Майкл Сонги в том же году подали заявку на патент США на эту технику под названием «Метод рендеринга теней с использованием теневого объема и трафаретного буфера». [ 5 ] Джон Кармак из id Software независимо обнаружил алгоритм в 2000 году во время разработки Doom 3 . [ 6 ]
Эксклюзивное-или
[ редактировать ]Любой из вышеупомянутых типов может быть аппроксимирован с помощью варианта исключающего или , который не обрабатывает должным образом пересекающиеся теневые объемы, но экономит один проход рендеринга (если не время заполнения) и требует только 1-битного буфера трафарета. Следующие шаги относятся к версии с проходом по глубине:
- Отключите запись в буферы глубины и цвета.
- Установите операцию трафарета на XOR при проходе глубины (переворот на любой теневой поверхности).
- Рендеринг теневых объемов.
Оптимизация
[ редактировать ]- Одним из методов ускорения вычислений геометрии теневого объема является использование существующих частей конвейера рендеринга для выполнения некоторых вычислений. Например, при использовании однородных координат координата w может быть установлена в ноль, чтобы продлить точку до бесконечности. Это должно сопровождаться усеченной пирамидой просмотра , имеющей дальнюю плоскость отсечения, простирающуюся до бесконечности для размещения этих точек, что достигается с помощью специализированной матрицы проекции. Этот метод немного снижает точность буфера глубины, но разница обычно незначительна. см. в статье 2002 года «Практические и надежные трафаретные теневые объемы для аппаратно-ускоренного рендеринга», К. Эверитт и М. Килгард . Подробную реализацию
- Время растеризации теневых объемов можно сократить, используя аппаратный ножничный тест, ограничивающий тени определенным экранным прямоугольником.
- NVIDIA реализовала аппаратную возможность, называемую тестом границ глубины , которая предназначена для удаления частей теневых объемов, которые не влияют на видимую сцену. (Это было доступно начиная с модели GeForce FX 5900.) Обсуждение этой возможности и ее использования с теневыми томами было представлено на конференции разработчиков игр в 2005 году. [ 7 ]
- Поскольку метод определения глубины дает преимущество перед проходом по глубине только в том особом случае, когда глаз находится в пределах теневого объема, предпочтительно проверить этот случай и использовать проход по глубине везде, где это возможно. Это позволяет избежать как ненужного обратного ограничения (и связанной с ним растеризации) в случаях, когда ошибка глубины не нужна, так и проблемы надлежащего переднего ограничения для особых случаев прохода глубины. [ нужна ссылка ] .
- В более поздних конвейерах графических процессоров геометрические шейдеры . для создания теневых объемов можно использовать [ 8 ] [ 9 ]
- В системах, которые не поддерживают геометрические шейдеры, вершинные шейдеры также можно использовать для создания теневых объемов путем выборочного вытягивания вершин, которые уже находятся в памяти графического процессора. [ 10 ]
См. также
[ редактировать ]- Край силуэта
- Отображение теней , альтернативный алгоритм затенения.
- Трафаретный буфер
- Буфер глубины
- Список патентов на программное обеспечение
Ссылки
[ редактировать ]- ^ Кроу, Франклин С: « Теневые алгоритмы для компьютерной графики », Компьютерная графика (SIGGRAPH '77 Proceedings) , том. 11, нет. 2, 242–248.
- ^ Йен, Хун (3 декабря 2002 г.). «Теория трафаретных теневых объемов» . GameDev.net . Проверено 12 сентября 2010 г.
- ^ «Запатентованы трафаретные тени!? Что за черт! - GameDev.net» . 29 июля 2004 г. Проверено 28 марта 2012 г.
- ^ «Творческие патенты на реверсе Кармака» . Технический отчет. 29 июля 2004 г. Архивировано из оригинала 31 января 2010 г. Проверено 12 сентября 2010 г.
- ^ США 6384822 , Билодо, Уильям и Сонги, Майкл, «Метод рендеринга теней с использованием теневого объема и трафаретного буфера», опубликовано 7 мая 2002 г., передано Creative Technology Ltd.
- ^ Килгард, Марк; Джон Кармак. «Джон Кармак о теневых томах...» Страница практичных и надежных теневых томов в зоне разработчиков NVIDIA . archive.org: NVIDIA. Архивировано из оригинала 27 января 2009 года . Проверено 18 октября 2012 г.
- ^ Лендьел, Эрик. «Продвинутая трафаретная тень и рендеринг полутеневых клиньев» (PDF) . Конференция разработчиков игр 2005 . 2005 . Проверено 18 октября 2012 г.
- ^ «GPU Gems 3: Глава 11. Эффективные и надежные теневые объемы с использованием иерархической фильтрации окклюзии и геометрических шейдеров | Зона разработчиков NVIDIA» . Developer.nvidia.com . Архивировано из оригинала 16 мая 2011 года . Проверено 12 января 2022 г.
- ^ Стич, Мартин; Карстен Вехтер; Александр Келлер (2007). «Глава 11 «Эффективные и надежные объемы теней с использованием иерархической фильтрации окклюзии и шейдеров геометрии» » . Драгоценные камни графического процессора 3 . archive.org: nVidia/Addison-Wesley. Архивировано из оригинала 16 мая 2011 года . Проверено 18 октября 2012 г.
- ^ Бреннан, Крис. «Экструзия теневого объема с использованием вершинного шейдера» (PDF) . АМД . Проверено 14 февраля 2018 г.