Отображение теней - Shadow mapping

Сцена с наложением теней
Сцена без теней

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисуем сцену

Финальная сцена, отрендеренная с окружающими тенями.

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

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

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

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

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

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

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

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

просто

  • ССМ "Простой"

Расщепление

Искривление

Сглаживание

Фильтрация

Мягкие тени

Ассорти

Разное

  • Карты глубины тени (SDM)[9]
  • Карты перспективных теней (PSM)
  • Карты теней в перспективе светлого пространства (LSPSM)
  • Каскадные карты теней (CSM)[10]
  • Карты дисперсии теней (VSM)[11]

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

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

использованная литература

  1. ^ Акенин-Мёллер, Томас; Хейнс, Эрик; Хоффман, Нэти (2018-08-06). Рендеринг в реальном времени, четвертое издание. CRC Press. ISBN  978-1-351-81615-1.
  2. ^ «Каскадные карты теней» (PDF). NVidia. Получено 2008-02-14{{противоречивые цитаты}} Цитировать журнал требует | журнал = (Помогите)
  3. ^ Тобиас Мартин; Tiow-Seng Tan. «Сглаживание и непрерывность с трапециевидными картами теней». Получено 2008-02-14. Цитировать журнал требует | журнал = (Помогите)
  4. ^ Майкл Виммер; Даниэль Шерцер; Вернер Пургатхофер. "Карты теней в перспективе светлого пространства". Получено 2008-02-14. Цитировать журнал требует | журнал = (Помогите)
  5. ^ Фань Чжан; Ханцю Сунь; Оскари Найман. «Карты теней с параллельным разделением на программируемых графических процессорах». Камни GPU 3. Архивировано из оригинал 17 января 2010 г.. Получено 2008-02-14.
  6. ^ "Сглаживание карты теней". NVidia. Получено 2008-02-14.
  7. ^ Эрик Чан, Фредо Дюран, Марко Корбетта. «Визуализация искусственных мягких теней с помощью смузи». Получено 2008-02-14. Цитировать журнал требует | журнал = (Помогите)CS1 maint: несколько имен: список авторов (ссылка на сайт)
  8. ^ Уильям Доннелли; Эндрю Лауритцен. "Карты теней дисперсии". Получено 2008-02-14.
  9. ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx
  10. ^ http://msdn.microsoft.com/en-us/library/windows/desktop/ee416307(v=vs.85).aspx
  11. ^ http://dl.acm.org/citation.cfm?doid=1111411.1111440

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