Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Пример трафарета Кармака в Doom 3 .

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

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

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

Строительство [ править ]

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

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

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

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

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

Реализации буфера трафарета [ править ]

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

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

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

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

Глубинный проход [ править ]

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

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

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

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

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

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

Ошибка глубины [ править ]

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

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

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

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

Эксклюзивное или [ править ]

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

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

Оптимизация [ править ]

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

См. Также [ править ]

  • Край силуэта
  • Отображение теней , альтернативный алгоритм затенения
  • Буфер трафарета
  • Буфер глубины
  • Список патентов на программное обеспечение

Ссылки [ править ]

  1. ^ Кроу, Франклин C: « Алгоритмы теней для компьютерной графики », Computer Graphics (SIGGRAPH '77 Proceedings) , vol. 11, вып. 2, 242-248.
  2. Йен, Хун (2002-12-03). «Теория трафаретных теневых объемов» . GameDev.net . Проверено 12 сентября 2010 . CS1 maint: обескураженный параметр ( ссылка )
  3. ^ "Трафаретные тени запатентованы !? WTF! - GameDev.net" . 2004-07-29 . Проверено 28 марта 2012 . CS1 maint: обескураженный параметр ( ссылка )
  4. ^ "Творческие патенты реверс Кармака" . Технический отчет. 2004-07-29 . Проверено 12 сентября 2010 . CS1 maint: обескураженный параметр ( ссылка )
  5. ^ Килгард, Марк; Джон Кармак. «Джон Кармак о теневых объемах ...» Страница « Практические и надежные теневые тома» в NVIDIA Developer Zone . archive.org: NVIDIA. Архивировано 27 января 2009 года . Проверено 18 октября 2012 года . CS1 maint: discouraged parameter (link) CS1 maint: unfit URL (link)
  6. ^ Lengyel, Эрик. «Продвинутая визуализация трафаретных теней и полутеневого клина» (PDF) . Game Developers Conference 2005 . 2005 . Проверено 18 октября 2012 года . CS1 maint: discouraged parameter (link)
  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: discouraged parameter (link) CS1 maint: unfit URL (link)
  9. ^ Бреннан, Крис. «Экструзия теневого объема с использованием вершинного шейдера» (PDF) . AMD . Проверено 14 февраля 2018 .

Внешние ссылки [ править ]

  • Теория трафаретных теневых объемов
  • Механика устойчивых трафаретных теней
  • Введение в объемы трафаретных теней
  • Отображение теней и теневые объемы
  • Трафаретные объемы теней в OpenGL
  • Учебник по теням объема [ мертвая ссылка ]
  • Быстрые теневые объемы на NVIDIA
  • Надежные теневые тома в NVIDIA
  • Улучшенная визуализация теней и теней с помощью трафарета
  • Реалистичные мягкие тени от смешивания Penumbra-Wedges
  • Мягкий текстурированный объем теней
  • Правильные объемы теней трафарета Z-Pass

Относительно патентов, не имеющих глубины [ править ]

  • «Программное обеспечение Creative Pressures id с патентами» . Slashdot . 28 июля 2004 . Проверено 16 мая 2006 . CS1 maint: discouraged parameter (link)
  • «Креативные патенты реверса Кармака» . Технический отчет . 29 июля 2004 . Проверено 16 мая 2006 . CS1 maint: discouraged parameter (link)
  • «Креатив дает предысторию теневой истории Doom III» . Спрашивающий . 29 июля 2004 . Проверено 16 мая 2006 . CS1 maint: discouraged parameter (link)