stringtranslate.com

Отображение теней

Сцена с картой теней
Сцена без теней

Наложение теней или проекция теней — это процесс, с помощью которого тени добавляются к 3D-компьютерной графике . Эта концепция была представлена ​​Лэнсом Уильямсом в 1978 году в статье под названием «Отбрасывание изогнутых теней на изогнутые поверхности». [1] С тех пор он использовался как в предварительно отрисованных сценах, так и в сценах в реальном времени во многих консольных и компьютерных играх.

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

Принцип тени и карта теней

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

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

Обзор алгоритма

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

Создание карты теней

Сцена визуализирована с учетом света.
Сцена со светового ракурса, карта глубины.

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

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

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

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

Затенение сцены

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

Координаты светового пространства

Визуализация карты глубины, проецируемой на сцену

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

Матрица, используемая для преобразования мировых координат в координаты просмотра источника света, такая же, как та, которая использовалась для рендеринга карты теней на первом этапе (в OpenGL это произведение матриц вида модели и проекции). Это создаст набор однородных координат , которые требуют разделения в перспективе ( см. 3D-проекцию ), чтобы стать нормализованными координатами устройства , в которых каждый компонент ( x , y или z ) попадает в диапазон от −1 до 1 (если он виден со света). вид). Многие реализации (такие как OpenGL и Direct3D ) требуют дополнительного умножения матрицы масштаба и смещения для сопоставления этих значений от -1 до 1 с значениями от 0 до 1, которые являются более обычными координатами для поиска карты глубины (карты текстуры). Это масштабирование можно выполнить перед разделением перспективы, и его легко включить в предыдущие вычисления преобразования, умножив эту матрицу на следующую:

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

Тест карты глубины

Сбои при тестировании карты глубины.

После того, как координаты светового пространства найдены, значения x и y обычно соответствуют местоположению в текстуре карты глубины, а значение z соответствует связанной с ней глубине, которую теперь можно проверить на основе карты глубины.

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

Если местоположение ( x , y ) выходит за пределы карты глубины, программист должен либо решить, что поверхность должна быть освещена или затенена по умолчанию (обычно освещена).

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

Можно изменить тест карты глубины для создания теней с мягким краем, используя диапазон значений (в зависимости от близости к краю тени), а не просто пройти или не пройти.

Технику отображения теней также можно модифицировать для рисования текстуры на освещенных областях, имитируя эффект проектора . Изображение выше с подписью «Визуализация карты глубины, проецируемой на сцену», является примером такого процесса.

Рисуем сцену

Финальная сцена, визуализированная с использованием окружающих теней.

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

Если шейдеры недоступны, выполнение теста карты глубины обычно должно быть реализовано с помощью некоторого аппаратного расширения (например, GL_ARB_shadow), которое обычно не позволяет выбирать между двумя моделями освещения (освещенным и затененным) и требует большего количества проходов рендеринга:

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

В примерах изображений в этой статье использовалось расширение OpenGL GL_ARB_shadow_ambient для выполнения процесса создания карты теней за два прохода.

Реализация карты теней в реальном времени

Одним из ключевых недостатков карт теней в реальном времени является то, что размер и глубина карты теней определяют качество конечных теней. Обычно это проявляется в виде сбоев сглаживания или непрерывности теней. Простой способ обойти это ограничение — увеличить размер карты теней, но из-за ограничений памяти, вычислительных или аппаратных средств это не всегда возможно. Чтобы обойти это ограничение, были разработаны широко используемые методы картирования теней в реальном времени. К ним относятся карты каскадных теней, [3] карты трапециевидных теней, [4] карты теней с перспективой светового пространства, [5] или карты теней с параллельным разделением. [6]

Также примечательно то, что сгенерированные тени, даже если они не содержат псевдонимов, имеют резкие края, что не всегда желательно. Для эмуляции мягких теней реального мира было разработано несколько решений: либо путем выполнения нескольких поисков по карте теней, создания геометрии, предназначенной для эмуляции мягких краев, либо создания нестандартных карт теней глубины. Яркими примерами являются процентная более близкая фильтрация, [7] Smoothies, [8] и карты теней дисперсии. [9]

Методы отображения теней

Простой

Разделение

Деформация

Сглаживание

Фильтрация

Мягкие тени

Ассорти

Разнообразный

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

дальнейшее чтение

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

  1. ^ Лэнс Уильямс. «Отбрасывание изогнутых теней на изогнутые поверхности» (PDF) . Проверено 22 декабря 2020 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  2. ^ Акенин-Мёллер, Томас; Хейнс, Эрик; Хоффман, Нати (6 августа 2018 г.). Рендеринг в реальном времени, четвертое издание. ЦРК Пресс. ISBN 978-1-351-81615-1.
  3. ^ «Каскадные карты теней» (PDF) . НВидиа . Проверено 14 февраля 2008 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  4. ^ Тобиас Мартин; Тиоу-Сенг Тан. «Сглаживание и непрерывность с трапециевидными картами теней» . Проверено 14 февраля 2008 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  5. ^ Майкл Виммер; Дэниел Шерцер; Вернер Пургатофер. «Карты теней в перспективе светового пространства» . Проверено 14 февраля 2008 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  6. ^ Фань Чжан; Ханьцю Сунь; Оскари Найман. «Карты теней с параллельным разделением на программируемых графических процессорах». Драгоценные камни графического процессора 3 . Архивировано из оригинала 17 января 2010 года . Проверено 14 февраля 2008 г.
  7. ^ «Сглаживание карты теней». НВидиа . Проверено 14 февраля 2008 г.
  8. ^ Эрик Чан, Фредо Дюран, Марко Корбетта . «Рендеринг фальшивых мягких теней с помощью смузи» . Проверено 14 февраля 2008 г. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )CS1 maint: несколько имен: список авторов ( ссылка )
  9. ^ Уильям Доннелли; Эндрю Лауритцен. «Карты теней дисперсии» . Проверено 14 февраля 2008 г.
  10. ^ «Общие методы улучшения карт глубины теней». Msdn.microsoft.com . Проверено 7 ноября 2021 г.
  11. ^ «Каскадные карты теней». Msdn.microsoft.com . Проверено 7 ноября 2021 г.
  12. ^ Доннелли, Уильям; Лауритцен, Эндрю (14 марта 2006 г.). «Карты теней дисперсии». Материалы симпозиума 2006 г. по интерактивной 3D-графике и играм — SI3D '06 . Ассоциация вычислительной техники. стр. 161–165. дои : 10.1145/1111411.1111440. ISBN 159593295X. S2CID  538139 . Проверено 7 ноября 2021 г. - из цифровой библиотеки ACM.

Внешние ссылки