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

редактировать
Сцена с отображением теней Сцена без теней

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

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

Содержание

  • 1 Принцип тени и карта теней
  • 2 Обзор алгоритма
    • 2.1 Создание карты теней
    • 2.2 Затенение сцены
      • 2.2.1 Координаты светового пространства
      • 2.2.2 Тест карты глубины
      • 2.2.3 Рисование сцены
  • 3 Реализация карты теней в реальном времени
  • 4 Методы отображения теней
    • 4.1 Простой
    • 4.2 Разделение
    • 4.3 Деформация
    • 4.4 Сглаживание
    • 4.5 Фильтрация
    • 4.6 Мягкие тени
    • 4.7 Ассорти
  • 5 Разное
  • 6 См. Также
  • 7 Дополнительная литература
  • 8 Ссылки
  • 9 Внешние ссылки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[0,5 0 0 0,5 0 0,5 0 0,5 0 0 0,5 0,5 0 0 0 1] {\ displaystyle {\ begin {bmatrix} 0,5 0 0 0,5 \\ 0 0,5 0 0,5 \\ 0 0 0,5 0,5 \\ 0 0 0 1 \ end {bmatrix}}}{\ begin {bmatrix} 0,5 0 0 0,5 \\ 0 0,5 0 0,5 \\ 0 0 0,5 0,5 \\ 0 0 0 1 \ end {bmatrix}}

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

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

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

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

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

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

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

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

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

Рисование сцены

Окончательная сцена, визуализированная с окружающими тенями.

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

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

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

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

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

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

Также примечательно то, что сгенерированные тени, даже без наложения спектров, имеют жесткие края, что не всегда желательно. Чтобы имитировать мягкие тени в реальном мире, было разработано несколько решений: либо путем выполнения нескольких поисков на карте теней, либо создания геометрии, предназначенной для имитации мягких краев, либо создания карт теней с нестандартной глубиной. Яркими примерами этого являются карты Percentage Closer Filtering, Smoothies и Variance Shadow.

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

Simple

  • SSM "Simple"

Splitting

Warping

Smoothing

Filtering

Мягкие тени

Ассорти

Разное

  • Карты глубины теней (SDM)
  • Карты перспективных теней (PSM)
  • Свет Карты теней в космической перспективе (LSPSM)
  • Каскадные карты теней (CSM)
  • Карты дисперсии теней (VSM)

См. Также

  • Объем тени, другой метод затенения
  • Ray casting, более медленный метод, часто используемый в трассировке лучей
  • Photon mapping, гораздо более медленный метод, обеспечивающий очень реалистичное освещение
  • Radiosity, еще один очень медленный, но очень реалистичный техника

Дополнительная литература

Ссылки

  1. ^«Каскадные карты теней» (PDF). NVidia. Проверено 14 февраля 2008 г. {{несогласованные цитаты}} Для цитирования журнала требуется | journal =()
  2. ^Tobias Martin; Tiow-Seng Tan. "Anti-aliasing and Continuity with Trapezoidal Shadow Maps ». Проверено 14 февраля 2008 г. Cite journal требует | journal =()
  3. ^Майкл Виммер; Даниэль Шерцер; Вернер Пургатхофер. «Карты теней в перспективе светлого пространства». Проверено 14 февраля 2008 г. Для журнала Cite требуется | journal =()
  4. ^Fan Zhang; Hanqiu Sun; Оскари Найман. «Параллельно-разделенные карты теней на программируемых графических процессорах». Драгоценные камни графического процессора 3. Архивировано из оригинального 17 января 2010 г. Дата обращения 14 февраля 2010 г.
  5. ^«Сглаживание карты теней». NVidia. Проверено 14 февраля 2008 г.
  6. ^Эрик Чан, Фредо Дюран, Марко Корбетта. «Рендеринг поддельных мягких теней with Smoothies ". Проверено 14 февраля 2008 г. Для цитирования журнала требуется | journal =() CS1 maint: multiple names: авторы список (ссылка )
  7. ^Уильям Доннелли; И rew Lauritzen. "Карты теней отклонения". Проверено 14 февраля 2008 г.
  8. ^http://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx
  9. ^http://msdn.microsoft.com / en-us / library / windows / desktop / ee416307 (v = vs.85).aspx
  10. ^http://dl.acm.org/citation.cfm?doid=1111411.1111440

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

Последняя правка сделана 2021-06-08 02:42:30
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте