Udostępnij za pośrednictwem


Hierarchiczne zastępowanie stanu

W wielu przypadkach konieczne jest dynamiczne zmienianie wyglądu części modelu, na przykład ukrywanie wykresów podrzędnych lub przełączanie części do przezroczystego renderowania. Zmiana materiałów każdej z zaangażowanych części nie jest praktyczna, ponieważ wymaga iteracji na całym wykresie sceny oraz zarządzania klonowaniem i przypisywaniem materiałów w każdym węźle.

Aby osiągnąć ten przypadek użycia z najmniejszym możliwym obciążeniem, użyj elementu HierarchicalStateOverrideComponent. Ten składnik implementuje aktualizacje stanu hierarchicznego w dowolnych gałęziach grafu sceny. Oznacza to, że stan można zdefiniować na dowolnym poziomie grafu sceny i przechodzi w dół hierarchii, dopóki nie zostanie on zastąpiony przez nowy stan lub zastosowany do obiektu liścia.

Rozważmy na przykład model samochodu i chcesz przełączyć cały samochód na przezroczysty, z wyjątkiem części silnika wewnętrznego. Ten przypadek użycia obejmuje tylko dwa wystąpienia składnika:

  • Pierwszy składnik jest przypisywany do węzła głównego modelu i włącza przezroczyste renderowanie całego samochodu.
  • Drugi składnik jest przypisywany do węzła głównego aparatu i ponownie zastępuje stan, jawnie wyłączając tryb wyświetlania.

Uwaga

Chmury punktów nie uwidaczniają wykresu pełnej sceny (zobacz różnice typu siatki), dlatego przypisanie hierarchicznego zastąpienia do jednostki głównej modelu chmury punktów spowoduje zastosowanie stanu do chmury pełnego punktu. Ponadto niektóre funkcje przesłonięcia stanu nie są obsługiwane w przypadku chmur punktowych, jak wspomniano w odpowiedniej sekcji.

Funkcje

Stały zestaw stanów, które można zastąpić, to:

  • Hidden: Odpowiednie siatki na wykresie sceny są ukryte lub wyświetlane.

  • Tint color: Renderowany obiekt może być przyciemniany kolorem i wagą odcieni. Na poniższym obrazie przedstawiono kolor barwiący obręcz koła.

    Kolor odcieni używany do obracania obiektu na zielono

  • See-through: Geometria jest renderowana częściowo przezroczystie, na przykład w celu ujawnienia części wewnętrznych obiektu. Na poniższej ilustracji przedstawiono cały samochód renderowany w trybie patrzenia, z wyjątkiem czerwonego zacisku hamulca:

    Tryb wyświetlania używany do wyświetlania zaznaczonych obiektów jako przezroczysty

    Ważne

    Efekt wyświetlania działa tylko wtedy, gdy jest używany tryb renderowania TileBasedComposition.

    Uwaga

    Efekt see-through jest ignorowany dla chmur punktowych.

  • Shell: Geometria jest renderowana jako przezroczysta, odsysadowana powłoka. Ten tryb umożliwia zanikanie nieistotnych części sceny, zachowując jednocześnie poczucie kształtu i względnego pozycjonowania. Aby zmienić wygląd renderowania powłoki, użyj stanu ShellRenderingSettings . Zobacz następujący obraz przedstawiający model samochodu, który jest całkowicie renderowany w powłoce, z wyjątkiem niebieskich sprężyn:

    Tryb powłoki używany do zanikania określonych obiektów

    Ważne

    Efekt powłoki działa tylko wtedy, gdy jest używany tryb renderowania TileBasedComposition.

    Uwaga

    Efekt powłoki jest ignorowany dla chmur punktowych.

  • Selected: Geometria jest renderowana za pomocą konturu zaznaczenia.

    Opcja konspektu używana do wyróżniania wybranej części

    Uwaga

    Renderowanie konspektu zaznaczenia jest ignorowane dla chmur punktowych.

  • DisableCollision: Geometria jest wykluczony z zapytań przestrzennych. Flaga Hidden nie wpływa na flagę stanu kolizji, więc te dwie flagi są często ustawiane razem.

  • TransparencyWritesDepth: Aktywuje zapis głębokości dla See-through i transparencji materiałowych w drzewie sceny jednostki składnika. Korzystając z tej flagi, See-through transparencie mogą mieć włączone lub wyłączone zapisywanie głębokości w poddrzewie, nawet jeśli TransparencyWritesDepth jest wymuszone globalnie. W przypadku przezroczystości materiału flaga zachowuje się włącznie, co oznacza, że jeśli TransparencyWritesDepth jest włączona z przesłonięciami, globalnie wymuszonymi lub za pomocą flag materiału, zapis głębokości jest włączony dla obiektów renderowanych z tym materiałem.

  • UseCutPlaneFilterMask: użyj pojedynczej maski bitów filtru, aby sterować wyborem płaszczyzny wycinania. Ta flaga określa, czy należy użyć lub odziedziczyć pojedynczą maskę filtru z jego elementu nadrzędnego. Sama maska bitów filtru CutPlaneFilterMask jest ustawiana za pośrednictwem właściwości . Aby uzyskać szczegółowe informacje o sposobie działania filtrowania, zapoznaj się z akapitem Selektywne płaszczyzny wycinania. Zobacz poniższy przykład, w którym tylko opona i obręcz są wycinane, podczas gdy reszta sceny pozostaje nienaruszona. Selektywne płaszczyzny wycinania

  • UseOverrideMaterial: W przypadku włączenia materiału przechowywanego w OverrideMaterial obiekcie jest używany do renderowania geometrii z tym materiałem. Jest to wydajny sposób przełączania renderowania większych części modelu na dedykowany materiał bez faktycznego przełączania poszczególnych materiałów częściowych. Materiały kolorowe mogą zastępować materiały PBR i na odwrót. Należy jednak zagwarantować, że model zapewnia obowiązkowe strumienie wierzchołków, na przykład normalny wierzchołek w przypadku, gdy przesłonięty materiał jest materiałem PBR. Ponadto przesłonięcia, które przełączają przezroczystość, działają niezawodnie tylko w trybie renderowania TileBasedComposition.

    Uwaga

    Przesłonięć materiał jest ignorowany dla chmur punktowych.

Napiwek

Alternatywą dla wyłączenia widoczności i zapytań przestrzennych dla pełnego wykresu podrzędnego enabled może być przełączenie stanu obiektu gry. Jeśli hierarchia jest wyłączona, ma to preferencje dotyczące dowolnego HierarchicalStateOverrideComponentelementu .

Przesłonięcia hierarchiczne

Element HierarchicalStateOverrideComponent można dołączyć na wielu poziomach hierarchii obiektów. Ponieważ w jednostce może istnieć tylko jeden składnik każdego typu, każdy HierarchicalStateOverrideComponent zarządza stanami ukrytymi, widocznymi, wybranymi, odcieniami kolorów i kolizjami.

W związku z tym każdy stan można ustawić na jeden z:

  • ForceOn — stan jest włączony dla wszystkich siatki na i poniżej tego węzła
  • ForceOff — stan jest wyłączony dla wszystkich siatk w i pod tym węzłem
  • InheritFromParent — stan nie ma wpływu na ten składnik przesłonięcia

Stany można zmieniać bezpośrednio lub za pomocą SetState funkcji:

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);

Kolor odcieni

Przesłonięcia tint color są nieco specjalne w tym, że występuje zarówno stan on/off/inherit, jak i właściwość koloru odcienia. Część alfa koloru odcienia definiuje wagę efektu odcienia: Jeśli ustawiono wartość 0,0, kolor odcienia nie jest widoczny, a jeśli ustawiono wartość 1,0, obiekt jest renderowany z czystym kolorem odcienia. W przypadku wartości między ostatnim kolorem jest mieszany kolor odcienia. Kolor odcieni można zmienić na podstawie ramek, aby uzyskać animację kolorów.

Zagadnienia dotyczące wydajności

Wystąpienie samego siebie nie dodaje dużego nakładu HierarchicalStateOverrideComponent pracy w czasie wykonywania. Jednak zawsze dobrym rozwiązaniem jest utrzymanie niskiej liczby aktywnych składników. Na przykład podczas implementowania systemu wyboru, który wyróżnia wybrany obiekt, zaleca się usunięcie składnika po usunięciu wyróżnienia. Utrzymanie składników wokół z neutralnymi funkcjami może szybko się sumować.

Renderowanie przezroczyste powoduje zwiększenie obciążenia na procesorach GPU serwera niż standardowe renderowanie. Jeśli duże części wykresu sceny są przełączane w celu wyświetlenia, a wiele warstw geometrii jest widocznych, może to stać się wąskim gardłem wydajności. To samo jest prawidłowe w przypadku obiektów z konturami zaznaczenia i renderowania powłoki .

Dokumentacja interfejsu API

Następne kroki