Отображение теней или проекция теней - это процесс, с помощью которого тени добавляются к трехмерной компьютерной графике . Эта концепция была представлена Лэнсом Уильямсом в 1978 году в статье под названием «Отбрасывание изогнутых теней на изогнутые поверхности». [1] С тех пор он использовался как в предварительно обработанных сценах, так и в сценах в реальном времени во многих консольных и компьютерных играх.
Тени создаются путем проверки того , виден ли пиксель из источника света, путем сравнения пикселя с z-буфером [2] или изображением глубины обзора источника света, сохраненным в виде текстуры .
Принцип тени и карта теней
Если вы выглядываете из источника света, все объекты, которые вы видите, появятся в свете. Однако все, что находится за этими объектами, будет в тени. Это основной принцип, используемый для создания карты теней. Вид источника света визуализируется, сохраняя глубину каждой поверхности, которую он видит (карта теней). Затем визуализируется обычная сцена, сравнивая глубину каждой нарисованной точки (как если бы она была видна свету, а не глазам) с этой картой глубины.
Этот метод менее точен, чем теневые объемы , но карта теней может быть более быстрой альтернативой в зависимости от того, сколько времени требуется для любого метода в конкретном приложении, и поэтому может быть более подходящим для приложений реального времени. Кроме того, карты теней не требуют использования дополнительного буфера трафарета и могут быть изменены для создания теней с мягкими краями. Однако, в отличие от теневых объемов, точность карты теней ограничена ее разрешением.
Обзор алгоритма
Визуализация затененной сцены включает два основных этапа рисования. Первый создает саму карту теней, а второй применяет ее к сцене. В зависимости от реализации (и количества источников света) для этого может потребоваться два или более проходов рисования.
Создание карты теней
Первый шаг визуализирует сцену с точки зрения света. Для точечного источника света вид должен быть перспективной проекцией с желаемым углом воздействия (это будет своего рода квадратный прожектор). Для направленного света (например, от Солнца ) следует использовать ортогональную проекцию .
Из этого рендеринга извлекается и сохраняется буфер глубины. Поскольку важна только информация о глубине, принято избегать обновления цветовых буферов и отключать все вычисления освещения и текстуры для этого рендеринга, чтобы сэкономить время отрисовки. Эта карта глубины часто сохраняется в виде текстуры в графической памяти.
Эта карта глубины должна обновляться каждый раз, когда происходят изменения либо в источнике света, либо в объектах сцены, но ее можно повторно использовать в других ситуациях, например, когда движется только камера наблюдения. (Если есть несколько источников света, для каждого источника должна использоваться отдельная карта глубины.)
Во многих реализациях практично визуализировать только подмножество объектов в сцене на карту теней, чтобы сэкономить время, необходимое для перерисовки карты. Кроме того, смещение глубины, которое смещает объекты от света, может применяться к рендерингу карты теней в попытке решить проблемы сшивания, когда значение карты глубины близко к глубине рисуемой поверхности (т. Е. Отбрасывание тени поверхность) на следующем шаге. В качестве альтернативы для получения аналогичного результата иногда используется отбраковка лицевых граней и визуализация только задней части объектов на карте теней.
Затенение сцены
Второй шаг - нарисовать сцену с обычной точки обзора камеры , применив карту теней. Этот процесс состоит из трех основных компонентов: первый - найти координаты объекта, видимого со стороны света, второй - это тест, который сравнивает эту координату с картой глубины, и, наконец, после завершения объект должен быть нарисован либо в в тени или в свете.
Координаты светового пространства
Чтобы проверить точку на карте глубины, ее положение в координатах сцены должно быть преобразовано в эквивалентное положение, видимое светом. Это достигается умножением матриц . Расположение объекта на экране определяется обычным преобразованием координат , но для определения местоположения объекта в световом пространстве необходимо сгенерировать второй набор координат.
Матрица, используемая для преобразования мировых координат в координаты обзора источника света, такая же, как и матрица, используемая для визуализации карты теней на первом этапе (в OpenGL это произведение матриц вида модели и проекции). Это создаст набор однородных координат , требующих перспективного деления ( см. 3D-проекцию ), чтобы стать нормализованными координатами устройства , в которых каждый компонент ( x , y или z ) находится между -1 и 1 (если он виден из источника света). Посмотреть). Многие реализации (такие как OpenGL и Direct3D ) требуют дополнительного масштабирования и умножения матрицы смещения для сопоставления этих значений от -1 до 1 с 0 до 1, которые являются более обычными координатами для поиска карты глубины (карты текстуры). Это масштабирование может быть выполнено до разделения перспективы, и его легко включить в предыдущий расчет преобразования, умножив эту матрицу на следующее:
Если выполняется с помощью шейдера или другого аппаратного расширения графики, это преобразование обычно применяется на уровне вершины, а сгенерированное значение интерполируется между другими вершинами и передается на уровень фрагмента.
Тест карты глубины
Как только координаты светового пространства найдены, значения x и y обычно соответствуют местоположению в текстуре карты глубины, а значение z соответствует связанной с ним глубине, которая теперь может быть проверена по карте глубины.
Если значение z больше, чем значение, хранящееся в карте глубины в соответствующем месте ( x , y ), объект считается находящимся за закрывающим объектом и должен быть помечен как сбой , чтобы рисунок отображался в тени. процесс. В противном случае его следует рисовать освещенным.
Если местоположение ( x , y ) выходит за пределы карты глубины, программист должен решить, что поверхность должна быть освещена или затенена по умолчанию (обычно освещена).
В реализации шейдера этот тест будет выполняться на уровне фрагмента. Кроме того, необходимо соблюдать осторожность при выборе типа хранилища текстурной карты, которое будет использоваться оборудованием: если интерполяция не может быть выполнена, тень будет иметь резкий, неровный край (эффект, который можно уменьшить с помощью большей карты теней). разрешающая способность).
Можно изменить тест карты глубины для создания теней с мягкими краями, используя диапазон значений (в зависимости от близости к краю тени), а не просто пройти или не пройти.
Технику наложения теней также можно изменить, чтобы нарисовать текстуру на освещенных областях, имитируя эффект проектора . Изображение выше, озаглавленное «Визуализация карты глубины, спроецированной на сцену», является примером такого процесса.
Рисуем сцену
Нарисовать сцену с тенями можно несколькими способами. Если доступны программируемые шейдеры , тест карты глубины может выполняться фрагментным шейдером, который просто рисует объект в тени или освещении в зависимости от результата, отрисовывая сцену за один проход (после начального более раннего прохода для создания карты теней) .
Если шейдеры недоступны, выполнение теста карты глубины обычно должно быть реализовано с помощью некоторого аппаратного расширения (например, GL_ARB_shadow ), которое обычно не позволяет выбирать между двумя моделями освещения (освещенным и затененным) и требует большего количества проходов рендеринга:
- Визуализируйте всю сцену в тени. Для наиболее распространенных моделей освещения ( см. Модель отражения Фонга ) это технически должно выполняться с использованием только окружающего компонента света, но обычно это регулируется, чтобы также включать тусклый рассеянный свет, чтобы искривленные поверхности не выглядели плоскими в тени.
- Включите тест карты глубины и визуализируйте сцену освещенной. Области, в которых тест карты глубины не проходит, не будут перезаписаны и останутся затененными.
- Для каждого дополнительного источника света можно использовать дополнительный проход, используя аддитивное смешивание, чтобы объединить их эффект с уже нарисованными источниками света. (Каждый из этих проходов требует дополнительного предыдущего прохода для создания связанной карты теней.)
Примеры изображений в этой статье использовали расширение OpenGL GL_ARB_shadow_ambient для выполнения процесса карты теней за два прохода.
Реализации карты теней в реальном времени
Одним из ключевых недостатков карты теней в реальном времени является то, что размер и глубина карты теней определяют качество окончательных теней. Обычно это проявляется в виде сбоев наложения спектров или непрерывности тени. Простой способ преодолеть это ограничение - увеличить размер карты теней, но из-за ограничений памяти, вычислительных или аппаратных средств это не всегда возможно. Для обхода этого ограничения были разработаны широко используемые методы отображения теней в реальном времени. К ним относятся каскадные карты теней, [3] трапециевидные карты теней, [4] карты теней с перспективой в световом пространстве, [5] или карты теней с параллельным разделением. [6]
Также примечательно то, что сгенерированные тени, даже без наложения спектров, имеют резкие края, что не всегда желательно. Для имитации мягких теней в реальном мире было разработано несколько решений: либо путем выполнения нескольких поисков на карте теней, либо создания геометрии, предназначенной для имитации мягких краев, либо создания карт теней с нестандартной глубиной. Яркими примерами этого являются Процентная более близкая фильтрация, [7] Smoothies, [8] и карты дисперсии теней. [9]
Методы отображения теней
Простой
- ССМ "Простой"
Расщепление
- PSSM «Параллельное разделение» https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html
- CSM "Каскадный" http://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf
Искривление
- LiSPSM "Световая космическая перспектива" https://www.cg.tuwien.ac.at/research/vr/lispsm/
- ТСМ "Трапеция" http://www.comp.nus.edu.sg/~tants/tsm.html
- ПСМ "Перспектива" http://www-sop.inria.fr/reves/Marc.Stamminger/psm/
- CSSM "Camera Space" http://bib.irb.hr/datoteka/570987.12_CSSM.pdf
Сглаживание
- PCF «Процент более близкой фильтрации» https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html
Фильтрация
- ESM "Exponential" http://www.cad.zju.edu.cn/home/jqfeng/papers/Exponential%20Soft%20Shadow%20Mapping.pdf
- CSM "Свертка" https://doclib.uhasselt.be/dspace/bitstream/1942/8040/1/3227.pdf
- VSM "Дисперсия" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.2569&rep=rep1&type=pdf
- SAVSM «Суммированная дисперсия площади» http://http.developer.nvidia.com/GPUGems3/gpugems3_ch08.html
- SMSR "Рекекторизация силуэта карты теней" http://bondarev.nl/?p=326
Мягкие тени
- PCSS "Процент ближе" http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
- СССС "Мягкие тени экранного пространства" http://www.crcnetbase.com/doi/abs/10.1201/b10648-36
- FIV "Полносферный вектор освещенности" http://getlab.org/publications/FIV/
Ассорти
- ASM «Адаптивный» http://www.cs.cornell.edu/~kb/publications/ASM.pdf
- AVSM «Адаптивный объемный» https://web.archive.org/web/20101208213624/http://visual-computing.intel-research.net/art/publications/avsm/
- CSSM "Camera Space" http://free-zg.t-com.hr/cssm/
- DASM "Deep Adaptive"
- DPSM "Двойной параболоид" http://sites.google.com/site/osmanbrian2/dpsm.pdf
- DSM "Deep" http://graphics.pixar.com/library/DeepShadows/paper.pdf
- ФШМ "Вперед" http://www.cs.unc.edu/~zhangh/technotes/shadow/shadow.ps
- ЛПСМ "Логарифмический" http://gamma.cs.unc.edu/LOGSM/
- MDSM "Multiple Depth" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.3376&rep=rep1&type=pdf
- RTW "Прямолинейный" http://www.cspaul.com/wiki/doku.php?id=publications:rosen.2012.i3d
- RMSM «Разрешение согласовано» http://www.idav.ucdavis.edu/func/return_pdf?pub_id=919
- SDSM «Образец распространения» https://web.archive.org/web/20101208212121/http://visual-computing.intel-research.net/art/publications/sdsm/
- СППСМ "Разделяющая плоскостная перспектива" http://image.diku.dk/projects/media/morten.mikkelsen.07.pdf
- СССМ «Теневой силуэт» http://graphics.stanford.edu/papers/silmap/silmap.pdf
Разнообразный
- Карты глубины тени (SDM) [10]
- Карты перспективных теней (PSM)
- Карты теней в перспективе светлого пространства (LSPSM)
- Каскадные карты теней (CSM) [11]
- Карты дисперсии теней (VSM) [12]
Смотрите также
- Объем тени , еще одна техника затенения
- Кастинг лучей , более медленная техника, часто используемая при трассировке лучей.
- Фотонное картирование , гораздо более медленная техника, способная обеспечить очень реалистичное освещение.
- Сияние , еще одна очень медленная, но очень реалистичная техника
дальнейшее чтение
- Плавные переходы полутени с помощью карт теней Виллем Х. де Бур
- Прямое отображение теней выполняет тест теней в пространстве глаз, а не в пространстве света, чтобы обеспечить более последовательный доступ к текстурам.
Рекомендации
- ^ Лэнс Уильямс. «Создание изогнутых теней на изогнутых поверхностях» (PDF) . Проверено 22 декабря 2020 . Цитировать журнал требует
|journal=
( помощь )CS1 maint: обескураженный параметр ( ссылка ) - ^ Акенин-Мёллер, Томас; Хейнс, Эрик; Хоффман, Нэти (2018-08-06). Рендеринг в реальном времени, четвертое издание . CRC Press. ISBN 978-1-351-81615-1.
- ^ «Каскадные карты теней» (PDF) . NVidia . Проверено 14 февраля 2008 г. {{несогласованные цитаты}} Цитировать журнал требует
|journal=
( помощь )CS1 maint: обескураженный параметр ( ссылка ) CS1 maint: postscript ( ссылка ) - ^ Тобиас Мартин; Tiow-Seng Tan. «Сглаживание и непрерывность с трапециевидными картами теней» . Проверено 14 февраля 2008 . Цитировать журнал требует
|journal=
( помощь )CS1 maint: обескураженный параметр ( ссылка ) - ^ Майкл Виммер; Даниэль Шерцер; Вернер Пургатхофер. "Карты теней в перспективе светлого пространства" . Проверено 14 февраля 2008 . Цитировать журнал требует
|journal=
( помощь )CS1 maint: обескураженный параметр ( ссылка ) - ^ Фань Чжан; Ханцю Сунь; Оскари Найман. «Карты теней с параллельным разделением на программируемых графических процессорах» . Самоцветы GPU 3 . Архивировано из оригинала на 17 января 2010 года . Проверено 14 февраля 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ «Сглаживание карты теней» . NVidia . Проверено 14 февраля 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Эрик Чан, Фредо Дюран, Марко Корбетта . «Рендеринг поддельных мягких теней с помощью смузи» . Проверено 14 февраля 2008 . Цитировать журнал требует
|journal=
( помощь )CS1 maint: не рекомендуется параметр ( ссылка ) CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Уильям Доннелли; Эндрю Лауритцен. «Карты дисперсии теней» . Проверено 14 февраля 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx
- ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416307(v=vs.85).aspx
- ^ http://dl.acm.org/citation.cfm?doid=1111411.1111440
Внешние ссылки
- Аппаратное отображение теней , nVidia
- Отображение теней с помощью современного оборудования OpenGL , nVidia
- Пошаговое руководство Римера по реализации Shadow Mapping с HLSL и DirectX
- Улучшения для отображения теней с использованием GLSL
- Алгоритмы и методы теней в реальном времени NVIDIA
- Реализация Shadow Mapping с использованием Java и OpenGL