Диапазоны видимости (HLOD)
Наряду с Уровень детализации сетки (LOD) и Отбраковка окклюзии, диапазоны видимости — ещё один инструмент для повышения производительности в больших сложных 3D-сценах.
В этом руководстве вы узнаете:
Что могут делать диапазоны видимости и в каких сценариях они полезны.
Как настроить дальность видимости (ручной LOD) в Godot.
Как настроить дальность видимости для лучшей производительности и качества.
См. также
Если вам нужно только уменьшение детализации мешей с расстоянием без ручного создания LOD-мешей, используйте автоматический Уровень детализации сетки (LOD).
Обратите внимание, что автоматический LOD для мешей и диапазоны видимости можно использовать одновременно, даже на одном меше.
Как это работает
Диапазоны видимости работают с любыми узлами, унаследованными от GeometryInstance3D. Это включает не только MeshInstance3D и MultiMeshInstance3D для художнического HLOD, но также GPUParticles3D, CPUParticles3D, Label3D, Sprite3D, AnimatedSprite3D и CSGShape3D.
Поскольку диапазоны видимости настраиваются для каждого узла, можно использовать разные типы узлов в системе LOD. Например, можно отображать MeshInstance3D для дерева вблизи и заменять его на импостор Sprite3D на расстоянии для повышения производительности.
Преимущество HLOD перед традиционным LOD — в его иерархической природе. Один большой меш может заменить несколько мелких, уменьшая количество вызовов отрисовки на расстоянии, но сохраняя возможности отсечения вблизи. Например, группа домов может использовать отдельные узлы MeshInstance3D (по одному на дом) вблизи, а на расстоянии заменяться одним MeshInstance3D с упрощённой моделью группы домов (или MultiMeshInstance3D).
Наконец, диапазоны видимости могут полностью скрывать объекты при слишком близком или далёком расположении камеры. Это можно использовать для геймплея или уменьшения визуального шума. Например, узлы Label3D можно скрывать при удалении, когда текст становится нечитаемым или неактуальным.
Настройка диапазона видимости
Краткое руководство по настройке базовой системы LOD. После выполнения этих шагов система будет отображать SphereMesh вблизи и BoxMesh на расстоянии. Небольшая гистерезисная зона настраивается через свойства Begin Margin и End Margin, что предотвращает мерцание LOD при движении камеры на границе перехода.
Свойства диапазона видимости находятся в разделе Visibility Range инспектора GeometryInstance3D после выбора узла MeshInstance3D.
Добавьте узел Node3D для группировки двух узлов MeshInstance3D.
Добавьте первый узел MeshInstance3D как дочерний для Node3D. Назначьте новый SphereMesh его свойству Mesh.
Установите для первого MeshInstance3D значение End диапазона видимости
10.0и End Margin1.0.Добавьте второй узел MeshInstance3D как дочерний к Node3D. Назначьте новый BoxMesh его свойству Mesh.
Установите Ближнюю границу (Begin) диапазона видимости второго MeshInstance3D в
10.0и Ближний запас (Begin Margin) в1.0.Отодвиньте камеру от объекта и затем верните её обратно. Обратите внимание, как объект плавно сменится со сферы на куб при отдалении камеры.
Свойства диапазона видимости
В инспекторе любого узла, унаследованного от GeometryInstance3D, вы можете настроить следующие свойства в разделе Диапазон видимости (Visibility Range):
Ближняя граница (Begin): Объект будет скрыт, если камера находится ближе к его центру (origin), чем указанное значение (в 3D-единицах).
Ближний запас (Begin Margin): Расстояние перехода с использованием гистерезиса или альфа-плавления для смены при приближении (в 3D-единицах). Поведение этого свойства зависит от Режима перехода (Fade Mode).
Дальняя граница (End): Объект будет скрыт, если камера находится дальше от его центра (origin), чем указанное значение (в 3D-единицах).
Дальний запас (End Margin): Расстояние перехода с использованием гистерезиса или альфа-плавления для смены при отдалении (в 3D-единицах). Поведение этого свойства зависит от Режима перехода (Fade Mode).
Режим затухания (Fade Mode): Управляет тем, как выполняется переход между уровнями детализации (LOD). Подробности см. ниже.
Режим затухания
Примечание
Выбранный режим затухания оказывает видимое влияние только если значение Visibility Range > Begin Margin или Visibility Range > End Margin больше 0.0.
В разделе инспектора Диапазон видимости (Visibility Range) доступны 3 режима затухания:
Disabled: Использует гистерезис для мгновенного переключения между уровнями LOD. Это предотвращает ситуации, когда уровни LOD быстро переключаются туда и обратно, если игрок движется вперед-назад в точке перехода LOD. Расстояние гистерезиса определяется значениями Begin Margin и End Margin. Этот режим обеспечивает наилучшую производительность, так как не требует прозрачности рендеринга при затухании.
Self: Использует альфа-смешение для плавного затухания между уровнями LOD. Узел будет самостоятельно затухать при достижении пределов своего собственного диапазона видимости. Расстояние перехода затухания определяется Visibility Range > Begin Margin и Visibility Range > End Margin. Этот режим вынуждает прозрачный рендеринг объекта во время его перехода затухания, поэтому он оказывает влияние на производительность.
Dependencies (Зависимости): Использует альфа-смешивание для плавного перехода между уровнями LOD. Узел будет постепенно проявлять свои зависимости при достижении границ своего собственного диапазона видимости. Расстояние перехода с затуханием определяется Visibility Range > Begin Margin (Диапазон видимости > Начальное поле) и Visibility Range > End Margin (Диапазон видимости > Конечное поле). Этот режим принудительно выполняет прозрачную визуализацию объекта во время его перехода с затуханием, поэтому он влияет на производительность. Этот режим предназначен для иерархических систем LOD, использующих Visibility parent. Он действует так же, как Self, если диапазоны видимости используются для выполнения неиерархического LOD.
Видимость родителя
Свойство Visibility Parent упрощает настройку HLOD. Оно позволяет автоматически скрывать дочерние узлы, если его родительский узел виден, учитывая его текущие свойства диапазона видимости.
Примечание
Цель Visibility Parent должна наследоваться от GeometryInstance3D.
Несмотря на свое название, свойство Visibility Parent может указывать на узел, который не является родительским для узла в дереве сцены. Однако невозможно указать Visibility Parent на дочерний узел, так как это создает цикл зависимости (dependency cycle), который не поддерживается. Вы получите сообщение об ошибке на панели Output, если возникнет цикл зависимости.
Дано следующее дерево сцены (где все узлы наследуются от GeometryInstance3D):
┖╴BatchOfHouses
┠╴House1
┠╴House2
┠╴House3
┖╴House4
В этом примере BatchOfHouses — это большая сетка, предназначенная для представления всех дочерних узлов при просмотре на расстоянии. House1 для House4 — это меньшие MeshInstance3D, представляющие отдельные дома. Чтобы настроить HLOD в этом примере, нам нужно настроить только две вещи:
Установите Visibility Range Begin на число больше 0.0, чтобы BatchOfHouses отображался только на достаточно большом расстоянии от камеры. Ниже этого расстояния мы хотим, чтобы отображались House1 - House4.
От House1 до House4, назначьте свойство Visibility Parent для BatchOfHouses.
Это упрощает выполнение дальнейших корректировок, поскольку вам не нужно корректировать Visibility Range Begin (Начало диапазона видимости) для BatchOfHouses и Visibility Range End от House1 до House4.
Режим затухания автоматически обрабатывается свойством Visibility Parent, так что дочерние узлы становятся скрытыми только после того, как родительский узел полностью затухнет. Это делается для минимизации видимого всплывающего окна. В зависимости от вашей настройки HLOD, вы можете попробовать оба режима Self и Dependencies fade modes.
Примечание
Узлы, скрытые с помощью свойства Visible, по сути, удаляются из дерева зависимостей видимости, поэтому зависимые экземпляры не будут учитывать скрытый узел или его предков.
На практике это означает, что если цель узла Visibility Parent скрыта путем установки его свойства Visible в значение false, узел не будет скрыт в соответствии со значением Visibility Range Begin, указанным в видимости родителя.
Советы по настройке
Используйте более простые материалы на расстоянии для улучшения производительности
Один из способов дальнейшего повышения производительности — использовать более простые материалы для удаленных сеток LOD. Хотя использование сеток LOD сократит количество вершин, которые необходимо визуализировать, нагрузка затенения по пикселям для материалов останется прежней. Однако нагрузка затенения по пикселям регулярно становится узким местом на GPU в сложных 3D-сценах. Один из способов снизить нагрузку затенения на GPU — использовать более простые материалы, когда они не имеют большого визуального значения.
Прирост производительности при этом следует тщательно измерять, поскольку увеличение количества уникальных материалов в сцене само по себе имеет стоимость производительности. Тем не менее, использование более простых материалов для удаленных LOD-сеток все еще может привести к чистому приросту производительности в результате меньшего количества требуемых вычислений на пиксель.
Например, для материалов, используемых в удаленных сетках LOD, можно отключить ресурсоемкие функции материалов, такие как:
Normal Map (Карта нормалей) (особенно на мобильных платформах)
Обод
Прозрачное покрытие
Анизотропия
Высота
Подповерхностное рассеяние
Подсветка
Преломление (рефрацкция)
Затухание при приближении
Используйте дизеринг для переходов LOD
Godot в настоящее время поддерживает только альфа-базированное затухание для диапазонов видимости. Однако вы можете использовать дизеринг вместо этого, используя несколько разных материалов для разных уровней LOD.
Использование дизеринга по сравнению с альфа-смешиванием для переходов LOD имеет два преимущества:
Более высокая производительность, поскольку рендеринг сглаживания прозрачности выполняется быстрее по сравнению с альфа-смешением.
Никаких визуальных сбоев из-за transparency sorting issues во время переходов LOD.
Недостатком дизеринга является то, что во время переходов LOD-затухания виден "шумный" рисунок. Это может быть не так заметно при более высоких разрешениях области просмотра или при включенном временном сглаживании.
Кроме того, поскольку затухание на расстоянии в BaseMaterial3D поддерживает только затухание вблизи или затухание на большом расстоянии, эту настройку лучше всего использовать только с двумя LOD-ми (уровнями детализации) в качестве части настройки.
Убедитесь, что Begin Margin и End Margin установлены на
0.0на обоих узлах MeshInstance3D, так как гистерезис или альфа-затухание здесь нежелательны.На обоих узлах MeshInstance3D уменьшите Begin на желаемое расстояние перехода затухания и увеличьте End на то же расстояние. Это необходимо для того, чтобы переход с дизерингом был фактически видимым.
На MeshInstance3D, который отображается вблизи, отредактируйте его материал в инспекторе. Установите его режим Distance Fade на Object Dither. Установите Min Distance на то же значение, что и диапазон видимости End. Установите Max Distance на то же значение минус расстояние перехода затухания.
На MeshInstance3D, который отображается вдали, отредактируйте его материал в инспекторе. Установите его режим Distance Fade на Object Dither. Установите Min Distance на то же значение, что и диапазон видимости Begin. Установите Max Distance на то же значение плюс расстояние перехода затухания.