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.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: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: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.Uwaga
Renderowanie konspektu zaznaczenia jest ignorowane dla chmur punktowych.
DisableCollision
: Geometria jest wykluczony z zapytań przestrzennych. FlagaHidden
nie wpływa na flagę stanu kolizji, więc te dwie flagi są często ustawiane razem.TransparencyWritesDepth
: Aktywuje zapis głębokości dlaSee-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śliTransparencyWritesDepth
jest wymuszone globalnie. W przypadku przezroczystości materiału flaga zachowuje się włącznie, co oznacza, że jeśliTransparencyWritesDepth
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 filtruCutPlaneFilterMask
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.UseOverrideMaterial
: W przypadku włączenia materiału przechowywanego wOverrideMaterial
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 HierarchicalStateOverrideComponent
elementu .
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łaForceOff
— stan jest wyłączony dla wszystkich siatk w i pod tym węzłemInheritFromParent
— 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 .