Åsidosätta hierarkiskt tillstånd
I många fall är det nödvändigt att dynamiskt ändra utseendet på delar av en modell, till exempel dölja underdiagram eller växla delar till transparent återgivning. Det är inte praktiskt att ändra material för varje del eftersom det krävs iterera över hela scendiagrammet och hantera materialkloning och tilldelning på varje nod.
Om du vill utföra det här användningsfallet med minsta möjliga omkostnader använder du HierarchicalStateOverrideComponent
. Den här komponenten implementerar hierarkiska tillståndsuppdateringar på godtyckliga grenar i scendiagrammet. Det innebär att ett tillstånd kan definieras på valfri nivå i scendiagrammet och det sipprar ned i hierarkin tills det antingen åsidosätts av ett nytt tillstånd eller tillämpas på ett lövobjekt.
Tänk till exempel på modellen för en bil och du vill att hela bilen ska vara transparent, förutom den inre motordelen. Det här användningsfallet omfattar endast två instanser av komponenten:
- Den första komponenten tilldelas modellens rotnod och aktiverar transparent rendering för hela bilen.
- Den andra komponenten tilldelas till motorns rotnod och åsidosätter tillståndet igen genom att uttryckligen inaktivera genomskinlighetsläget.
Kommentar
Punktmoln exponerar inte ett fullständigt scendiagram (se skillnader mellan nättyper), så om du tilldelar en hierarkisk åsidosättning till rotentiteten för en punktmolnmodell tillämpas tillståndet på hela punktmolnet. Dessutom stöds inte vissa funktioner för åsidosättning av tillstånd för punktmoln, som nämns i respektive avsnitt.
Funktioner
Den fasta uppsättningen tillstånd som kan åsidosättas är:
Hidden
: Respektive nät i scendiagrammet är dolda eller visas.Tint color
: Ett renderat objekt kan färgtonas med sin individuella färgton och nyansvikt. Bilden nedan visar färgtonning av hjulets kant.See-through
: Geometrin återges halvtransparent, till exempel för att avslöja de inre delarna av ett objekt. Följande bild visar hela bilen återges i genomskinligt läge, förutom den röda bromsok:Viktigt!
Genomskinliga effekter fungerar bara när renderingsläget TileBasedComposition används.
Kommentar
Genomskinliga effekter ignoreras för punktmoln.
Shell
: Geometrin återges som ett transparent, desaturerat gränssnitt. Det här läget gör att oviktiga delar av en scen kan blekna samtidigt som en känsla av form och relativ positionering bevaras. Om du vill ändra skalåtergivningens utseende använder du shellRenderingSettings-tillståndet . Se följande bild för bilmodellen som är helt shell-renderad, förutom de blå fjädrarna:Viktigt!
Shell-effekten fungerar bara när renderingsläget TileBasedComposition används.
Kommentar
Shell-effekten ignoreras för punktmoln.
Selected
: Geometrin återges med en markeringsdisposition.Kommentar
Återgivning av markeringsdisposition ignoreras för punktmoln.
DisableCollision
: Geometrin är undantagen från rumsliga frågor. FlagganHidden
påverkar inte kollisionstillståndsflaggan, så dessa två flaggor ställs ofta in tillsammans.TransparencyWritesDepth
: Aktiverar djupskrivning förSee-through
och materialtransparenser i komponentens entitets scenträd. Med den här flagganSee-through
kan transparenter ha djupskrivning aktiverat eller inaktiverat i ett underträd, även omTransparencyWritesDepth
de är globalt framtvingade. För materialtransparens beter sig flaggan inkluderande, vilket innebär att omTransparencyWritesDepth
den aktiveras med antingen åsidosättning, globalt framtvingad eller via materialets flaggor, aktiveras djupskrivning för objekt som återges med detta material.UseCutPlaneFilterMask
: Använd en enskild filterbitmask för att styra valet av klippt plan. Den här flaggan avgör om den enskilda filtermasken ska användas eller ärvas från dess överordnade. Själva filterbitmasken anges via egenskapenCutPlaneFilterMask
. Detaljerad information om hur filtreringen fungerar finns i stycket Selective cut planes (Selektiv klipp ut plan). Se följande exempel där endast däcket och fälgen klipps medan resten av scenen förblir opåverkad.UseOverrideMaterial
: Om det är aktiverat används materialet som lagras iOverrideMaterial
för att återge geometrin med det materialet. Det är ett effektivt sätt att byta rendering av större modelldelar till ett dedikerat material utan att faktiskt byta enskilda delmaterial. Färgmaterial kan åsidosätta PBR-material och vice versa. Det måste dock garanteras att modellen tillhandahåller obligatoriska hörnströmmar, till exempel det hörn som är normalt om det åsidosatta materialet är ett PBR-material. Åsidosättningar som aktiverar transparens fungerar dessutom endast tillförlitligt i renderingsläget TileBasedComposition.Kommentar
Åsidosättningsmaterialet ignoreras för punktmoln.
Dricks
Som ett alternativ till att stänga av synlighet och rumsliga frågor för ett fullständigt underdiagram kan enabled
tillståndet för ett spelobjekt växlas. Om en hierarki är inaktiverad har detta företräde framför alla HierarchicalStateOverrideComponent
.
Hierarkiska åsidosättningar
HierarchicalStateOverrideComponent
Kan kopplas på flera nivåer i en objekthierarki. Eftersom det bara kan finnas en komponent av varje typ på en entitet, hanterar var och HierarchicalStateOverrideComponent
en tillstånden för dolda, genomskinliga, valda, färgton och kollision.
Därför kan varje tillstånd anges till något av:
ForceOn
– tillståndet är aktiverat för alla nät på och under den här nodenForceOff
– tillståndet är inaktiverat för alla nät på och under den här nodenInheritFromParent
– tillståndet påverkas inte av den här åsidosättningskomponenten
Du kan ändra tillstånd direkt eller via SetState
funktionen:
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);
Färgton
Åsidosättningen tint color
är något speciell eftersom det finns både ett på/av/ärvt tillstånd och en färgtonsegenskap. Alfadelen av färgtonen definierar toningseffektens vikt: Om den är inställd på 0,0 visas ingen färgton och om det är inställt på 1,0 återges objektet med ren nyansfärg. För mellanvärden blandas den slutliga färgen med färgtonen. Färgtonen kan ändras per bildruta för att uppnå en färganimation.
Prestandaöverväganden
En instans av HierarchicalStateOverrideComponent
sig själv lägger inte till mycket körningskostnader. Det är dock alltid bra att hålla antalet aktiva komponenter lågt. När du till exempel implementerar ett urvalssystem som markerar det markerade objektet rekommenderar vi att du tar bort komponenten när markeringen tas bort. Det går snabbt att lägga ihop komponenterna med neutrala funktioner.
Transparent rendering placerar mer arbetsbelastning på serverns GPU:er än standardåtergivning. Om stora delar av scendiagrammet växlas till genomskinlighet, med många lager av geometri synliga, kan det bli en prestandaflaskhals. Detsamma gäller för objekt med markeringsdispositioner och för skalåtergivning .