Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Устранение неполадок с тенью

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

Тени в реальном времени имеют довольно высокую рендерингпроцесс отрисовки графики на экран (или текстуру рендеринга) . По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь
в заголовке; любые GameObjectsФундаментальный объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь
, которые могут отбрасывать тени, должны быть сначала отрисованы в карте теней, а затем эта карта будет использоваться для визуализации объектов, которые могут получить тени.

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

Если рендеринг теней в реальном времени для сложной геометрии слишком дорог, рассмотрите возможность использования низкого LODУровня детализации (LOD) метод — это оптимизация, которая уменьшает количество треугольников, которые Unity должна отображать для GameObject, когда его расстояние от камеры увеличивается. Подробнее
Посмотрите в Словарь
меши или даже примитивы для отбрасывания теней.

Если это слишком ресурсоемко, вы можете имитировать тени, используя размытую текстуру, примененную к простой сеткеосновной графике примитив единства. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
См. в Словарь
или quadПримитивный объект, напоминающий плоскость, но его ребра имеют длину всего одну единицу, он использует только 4 вершины, а поверхность ориентирована в плоскости XY локальное координатное пространство. Подробнее
Посмотрите в Словарь
под вашими персонажами или создайте тени от капель с помощью пользовательских шейдеров.

Теневые прыщи

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

Теневые прыщи в виде ложных артефактов самозатенения
Теневые прыщи в виде ложных артефактов самозатенения

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

Чтобы предотвратить появление теневых прыщей, можно настроить параметры смещения освещения.

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

Во встроенном конвейере рендеринга эти значения можно задать с помощью свойств Bias и Normal Bias в Light InspectorОкно Unity, в котором отображается информация о текущем выбранном GameObject, активе или настройках проекта, позволяя вам проверять и редактировать значения. Подробнее
Посмотреть в окне Словарь
, когда тени включены.

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

Высокое значение смещения делает тень отсоединенной от игрового объекта.
Высокое значение смещения делает тень отсоединенной от игрового объекта.

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

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

В некоторых ситуациях Обычный уклон может вызвать нежелательный эффект, называемый "световым кровотечением", когда свет просачивается из близлежащих геометрических объектов в области, которые должны быть затемнены. Возможным решением является открытие Mesh Rendererкомпонента сетки GameObject, который принимает геометрию из Mesh Filter и визуализирует ее в положении, определенном компонентом Transform объекта. Подробнее
См. в Словарь
и измените Отбрасываемые тени на Двусторонний. Иногда это может помочь, хотя это может быть более ресурсоемким и увеличить нагрузку на производительность при рендеринге СценыСцена содержит среды и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь
.

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

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

Блинчики с тенью

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

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

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

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

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

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

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

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

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

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

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

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

  • Тени отбрасываются и получают только непрозрачные объекты, поэтому объекты, использующие встроенные шейдеры Transparent или Particle, не будут ни отбрасывать, ни получать тени. Как правило, вы можете использовать шейдеры Прозрачный вырез вместо объектов с «пробелами», таких как заборы, растительность и т. д. Пользовательский ShadersПрограмма, работающая на графическом процессоре. Подробнее
    См. в Словарь
    должен быть пиксельным и использовать Очередь рендеринга геометрии.

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

  • Unity не может рассчитать тени для игровых объектов, материалы которых имеют шейдеры типа «Неосвещенный». Unity может рассчитывать тени только для материалов с шейдерами, поддерживающими освещение.

  • Во встроенном конвейере рендеринга с использованием прямого пути рендеринга некоторые шейдеры позволяют отбрасывать тени только самому яркому направленному свету. (в частности, это происходит с устаревшими встроенными шейдерами Unity из версий 4.x). Если вы хотите иметь более одного источника света, отбрасывающего тень, вам следует использовать Deferred ShadingA путь рендеринга во встроенном конвейере рендеринга, который не накладывает ограничений на количество источников света, которые могут воздействовать на GameObject. Все источники света оцениваются попиксельно, что означает, что все они корректно взаимодействуют с картами нормалей и так далее. Кроме того, все источники света могут иметь файлы cookie и тени. Подробнее
    См. в Словарь
    путь рендерингаТехника, которую Unity использует для рендеринга графики. Выбор другого пути влияет на производительность вашей игры и на то, как рассчитываются освещение и затенение. Некоторые пути больше подходят для разных платформ и оборудования, чем другие. Подробнее
    См. вместо этого Словарь
    . Вы можете включить поддержку «полных теней» в собственных шейдерах с помощью fullforwardshadows поверхностного шейдераУпрощенный способ написания шейдеров для встроенного конвейера рендеринга. Подробнее
    См. в директиве Словарь
    .

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3