Unity 6.3
0 онлайн 102 гостей 3 в системе
Вход
Освещение Шаг 88 из 173

Устранение неисправностей теней

Уменьшение мерцания тени

Тени могут мерцать, если они находятся далеко от камеры. См. Понимание View Frustum для дополнительной информации.

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

Чтобы включить удаление по отношению к камере, выполните следующие действия:

  1. Перейдите в Project Настройки > Графика > Настройки отбора > Camera-Относительное отбор.
  2. Включить Тени.

Теневое представление

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

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

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

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

Теневое акне

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

Теневое акне в форме ложного самозатенения артефактов
Теневое акне в форме ложного самозатенения артефактов

Настройка параметров тени

Настраивая значения отклонения тени, вы можете уменьшить или устранить такие артефакты тени, как акне тени, отделение тени (также известное как петер-паннинг), утечка света и самотени.

В Built-in Render Pipeline вы можете установить эти значения с помощью свойств Предвзятость и Нормальное смещение в окне Light Inspector, когда тени включены.

Не устанавливайте значение Предвзятость слишком высоко, потому что области вокруг тени вблизи GameObject, отбрасывающего её, иногда ложно освещаются. Это приводит к разъединенной тени, в результате чего GameObject выглядит, как будто он летит над землёй.

Высокое значение Bias делает тень выглядеть отрезанной от GameObject
Высокое значение Предвзятость заставляет тень выглядеть «отключенной» от GameObject

Аналогичным образом, установка значения Нормальное смещение слишком высокого делает тень слишком узкой для GameObject:

Высокое значение Normal Bias делает форму тени слишком узкой
Высокое значение Нормальное смещение делает форму тени слишком узкой

В некоторых ситуациях, Нормальное смещение может привести к нежелательному эффекту, называемому «световым кровотечением», когда свет просачивается из близлежащей геометрии в области, которые должны быть затенены. GameObject’s Рендерер сетки и изменить Тени свойства Двусторонний. Это иногда может помочь, хотя это может быть более ресурсоемким и увеличить накладные расходы на производительность при рендеринге Scene.

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

Низкое значение смещения тени вблизи плоскости создает видимость дыр в тени
Низкое значение смещения тени вблизи плоскости создает видимость дыр в тени
Правильное затенение
Правильное затенение

Теневое блины

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

Диаграмма, показывающая принцип теневого панкейка
Диаграмма, показывающая принцип теневого панкейка

На диаграмме выше:

  • Светло-голубые круги и представляют собой тени
  • Темно-синий прямоугольник и представляют собой первоначальное светлое пространство
  • Зелёная линия обозначает оптимизированную ближнюю плоскость (без учёта источников теней, не видимых во фрустуме камеры)

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

Задача о большом треугольнике
Задача о большом треугольнике

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

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

Тени не появляются

Если вы обнаружите, что один или несколько объектов не отбрасывают тени, то вы должны проверить следующие моменты:

  • Тени реального времени могут быть полностью отключены в окне Качество. Убедитесь, что у вас включен правильный уровень качества и что тени включены для этой настройки.

  • Все Mesh Renderers в сцене должны быть настроены с их Receive Shadows и Тени правильно установленными. Оба включены по умолчанию, но проверьте, что они не были случайно отключены.

  • Только непрозрачные объекты отбрасывают и получают тени, поэтому объекты, использующие встроенный прозрачный или Частичные шейдеры не будут ни передавать, ни получать. В целом, вы можете использовать Прозрачный вырез для объектов с «зазорами», таких как ограждения, растительность и т.д. Шейдеры должен быть пиксель-освещен и использовать Очередь отображения геометрии.

  • Объекты, использующие шейдеры VertexLit, не могут получать тени, но могут их отбрасывать.

  • Unity не может рассчитать тени для GameObjects, которые имеют материалы с “Unlit” типом шейдеров. Unity может рассчитать тени только для материалов с шейдерами, которые поддерживают освещение.

  • В течение Built-in Render Pipeline, используя Путь прямого отображения, некоторые шейдеры позволяют только яркий направленный свет, чтобы бросить тени (в частности, это происходит с Unity’s встроенные шейдеры от 4.x Если вы хотите иметь более одного тени-отбрасывающий свет, то вы должны использовать Отложенное затенение Вы можете включить свои собственные шейдеры для поддержки «полных теней», используя fullforwardshadows поверхностный шейдер Директива.

Дополнительные ресурсы