Отображение теней или проекция теней - это процесс, с помощью которого тени добавляются к трехмерной компьютерной графике. Эта концепция была введена Лэнсом Уильямсом в 1978 году в статье, озаглавленной «Отбрасывание кривых теней на искривленные поверхности». С тех пор он использовался как в предварительно обработанных сценах, так и в сценах в реальном времени во многих консольных и компьютерных играх.
Тени создаются путем проверки того, виден ли пиксель из источника света, путем сравнения пикселя с 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 ), которое обычно не позволяет выбирать между двумя моделями освещения (горит и затененный), и требует большего количества проходов рендеринга:
В примерах изображений в этой статье использовалось расширение OpenGL GL_ARB_shadow_ambient для выполнения процесса карты теней. в два прохода.
Одним из ключевых недостатков карты теней в реальном времени является то, что размер и глубина карты теней определяет качество окончательных теней. Обычно это видно как наложение или нарушение целостности тени. Простой способ преодолеть это ограничение - увеличить размер карты теней, но из-за ограничений памяти, вычислительных или аппаратных средств это не всегда возможно. Для обхода этого ограничения были разработаны широко используемые методы отображения теней в реальном времени. К ним относятся каскадные карты теней, трапециевидные карты теней, карты теней с перспективой в световом пространстве или карты теней с параллельным разделением.
Также примечательно то, что сгенерированные тени, даже без наложения спектров, имеют жесткие края, что не всегда желательно. Чтобы имитировать мягкие тени в реальном мире, было разработано несколько решений: либо путем выполнения нескольких поисков на карте теней, либо создания геометрии, предназначенной для имитации мягких краев, либо создания карт теней с нестандартной глубиной. Яркими примерами этого являются карты Percentage Closer Filtering, Smoothies и Variance Shadow.
| journal =
()| journal =
()| journal =
()| journal =
() CS1 maint: multiple names: авторы список (ссылка )