Переопределение иерархического состояния
Во многих случаях необходимо динамически изменять внешний вид частей модели, например скрытие вложенных графов или переключение частей на прозрачную отрисовку. Изменение материалов каждой части не является практическим, так как требуется выполнить итерацию по всему графу сцены и управлять клонированием материалов и назначением на каждом узле.
Чтобы решить такую задачу с минимально возможными издержками, используйте HierarchicalStateOverrideComponent
. Этот компонент реализует обновление иерархического состояния для произвольных ветвей графа сцены. Это означает, что состояние можно определить на любом уровне в графе сцены, и оно усложняет иерархию, пока не переопределяется новым состоянием или применяется к конечному объекту.
В качестве примера мы рассмотрим модель автомобиля, который нам нужно сделать полностью прозрачным, за исключением внутренностей двигателя. Такой вариант использования требует всего двух экземпляров компонента:
- Первый компонент назначается корневому узлу модели, чтобы включить прозрачную отрисовку для всего автомобиля.
- Второй компонент назначается корневому узлу двигателя, где состояние явным образом переопределяется (режим прозрачности отключается).
Примечание.
Облака точек не предоставляют полный граф сцены (см . различия типов сетки), поэтому назначение иерархической переопределения корневой сущности облачной модели точки будет применять состояние к полной точке облака. Кроме того, некоторые функции переопределения состояния не поддерживаются для точек облака, как упоминалось в соответствующем разделе.
Функции
Ниже представлен полный фиксированный набор состояний, которые могут быть переопределены.
Hidden
: скрывает или отображает соответствующие сетки в графе сцены.Tint color
: отрисованный объект можно окрасить цветом с определенными значениями оттенка и насыщенности. На рисунке ниже демонстрируется выделение цветом обода колеса.See-through
: геометрия отрисовывается полупрозрачной, например для того, чтобы отобразить внутренние части объекта. На следующем рисунке мы видим, что весь автомобиль отрисовывается в режиме прозрачности, за исключением красного тормозного суппорта:Внимание
Эффект прозрачности работает, только если включен режим отрисовки TileBasedComposition.
Примечание.
Эффект просмотра игнорируется для облаков точек.
Shell
: геометрия отрисовывается в виде прозрачной денасыщенной оболочки. Этот режим позволяет увядать неуважимые части сцены, сохраняя чувство формы и относительного расположения. Чтобы изменить внешний вид отрисовки оболочки, используйте состояние ShellRenderingSettings. На рисунке ниже показано, что модель автомобиля полностью визуализирована оболочкой, за исключением синей пружины:Внимание
Эффект прозрачности работает, только если включен режим отрисовки TileBasedComposition.
Примечание.
Эффект оболочки игнорируется для облаков точек.
Selected
: геометрия отрисовывается с контуром выделенного фрагмента.Примечание.
Отрисовка структуры выбора игнорируется для облаков точек.
DisableCollision
: геометрия исключается из рассмотрения при пространственных запросах. ФлагHidden
не влияет на флаг состояния столкновений, поэтому эти два флага часто устанавливаются вместе.TransparencyWritesDepth
: активирует запись глубины иSee-through
прозрачность материала в дереве сцены компонента. С помощью этого флагаSee-through
прозрачность может содержать запись глубины либо включена, либо отключена в поддереве, даже еслиTransparencyWritesDepth
глобально принудительно. Для прозрачности материала флаг ведет себя включительно, то есть еслиTransparencyWritesDepth
он включен либо с переопределением, глобально принудительным или через флаги материала, запись глубины включена для объектов, отрисованных с этим материалом.UseCutPlaneFilterMask
: используйте отдельную битовую маску фильтра для управления выделением вырезанной плоскости. Этот флаг определяет, должна ли отдельная маска фильтра использоваться или наследоваться от ее родителя. Сама битовая маска фильтра задается с помощью свойстваCutPlaneFilterMask
. Подробные сведения о том, как работает фильтрация, см. в абзаце "Выборочное вырезание плоскостей". См. следующий пример, в котором только кирпич и борт вырезаются, а оставшаяся часть сцены остается без изменений.UseOverrideMaterial
: если этот параметр включен, материал, хранящийся вOverrideMaterial
ней, используется для отрисовки геометрии с помощью этого материала. Это эффективный способ переключения отрисовки более крупных частей модели на выделенный материал без фактического переключения отдельных материалов частей. Цветовые материалы могут переопределять материалы PBR и наоборот. Тем не менее, необходимо гарантировать, что модель предоставляет обязательные потоки вершин, например, нормальную вершину в случае, если переопределенный материал является материалом PBR. Кроме того, переопределения, которые переключаются на прозрачность, работают надежно только в режиме отрисовки TileBasedComposition.Примечание.
Материал переопределения игнорируется для точек облака.
Совет
В качестве альтернативы отключению видимости и пространственному запросу для полной вложенной диаграммы enabled
состояние игрового объекта можно переключить. Если иерархия отключена, это имеет приоритет над любым HierarchicalStateOverrideComponent
.
Иерархические переопределения
HierarchicalStateOverrideComponent
можно присоединить на нескольких уровнях иерархии объектов. Для каждого типа сущности может существовать только один компонент каждого типа, поэтому каждый HierarchicalStateOverrideComponent
управляет одновременно состояниями сокрытия, прозрачности, выбора, цветовых оттенков и столкновений.
Это означает, что каждое состояние определяется одним из следующих значений:
ForceOn
— состояние включено для всей сетки, начиная с этого узла и ниже;ForceOff
— состояние отключено для всей сетки, начиная с этого узла и ниже;InheritFromParent
— этот компонент переопределения не влияет на это состояние.
Состояния можно изменять напрямую или с помощью функции SetState
:
HierarchicalStateOverrideComponent component = ...;
// set one state directly
component.HiddenState = HierarchicalEnableState.ForceOn;
// set a state with the SetState function
component.SetState(HierarchicalStates.SeeThrough, HierarchicalEnableState.InheritFromParent);
// set multiple states at once with the SetState function
component.SetState(HierarchicalStates.Hidden | HierarchicalStates.DisableCollision, HierarchicalEnableState.ForceOff);
ApiHandle<HierarchicalStateOverrideComponent> component = ...;
// set one state directly
component->SetHiddenState(HierarchicalEnableState::ForceOn);
// or: set a state with the SetState function
component->SetState(HierarchicalStates::SeeThrough, HierarchicalEnableState::InheritFromParent);
// set multiple states at once with the SetState function
component->SetState(
(HierarchicalStates)((int32_t)HierarchicalStates::Hidden | (int32_t)HierarchicalStates::DisableCollision), HierarchicalEnableState::ForceOff);
Цвет оттенка
Переопределение tint color
имеет дополнительную особенность: кроме состояния включения, выключения и наследования, оно имеет еще одно свойство для цвета оттенка. Альфа-часть цвета оттенка определяет вес эффекта тонирования: если задано значение 0,0, цвет отрисовки объекта не отображается, а если задано значение 1,0, объект отрисовывается с чистым цветом оттенка. Для значений между значениями окончательный цвет смешан с цветом оттенка. Цвет оттенка можно изменять для каждого кадра, чтобы создать цветовую анимацию.
Замечания, связанные с быстродействием
Экземпляр HierarchicalStateOverrideComponent
сам по себе не требует много ресурсов в среде выполнения. Но мы рекомендуем не увеличивать без необходимости количество активных компонентов. Например, при реализации системы выбора, которая выделяет выбранный объект, рекомендуется удалить компонент при удалении выделения. Если вы будете хранить компоненты с нейтральными свойствами, нагрузка будет быстро повышаться.
Прозрачная отрисовка создает больше нагрузки на GPU сервера, чем стандартная отрисовка. Если прозрачность включена для больших частей графа сцены, и при этом несколько уровней геометрии остаются видимыми, это может существенно влиять на производительность. Это же справедливо и для объектов с контурами выделенного фрагмента, и для обработки оболочки.