Dela via


Å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.

    Färgton som används för att göra ett objekt grönt

  • 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:

    Genomskinligt läge som används för att göra markerade objekt transparenta

    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:

    Gränssnittsläge som används för att tona ut specifika objekt

    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.

    Dispositionsalternativ som används för att markera en markerad del

    Kommentar

    Återgivning av markeringsdisposition ignoreras för punktmoln.

  • DisableCollision: Geometrin är undantagen från rumsliga frågor. Flaggan Hidden påverkar inte kollisionstillståndsflaggan, så dessa två flaggor ställs ofta in tillsammans.

  • TransparencyWritesDepth: Aktiverar djupskrivning för See-through och materialtransparenser i komponentens entitets scenträd. Med den här flaggan See-through kan transparenter ha djupskrivning aktiverat eller inaktiverat i ett underträd, även om TransparencyWritesDepth de är globalt framtvingade. För materialtransparens beter sig flaggan inkluderande, vilket innebär att om TransparencyWritesDepth 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 egenskapen CutPlaneFilterMask . 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. Selektiva skärplan

  • UseOverrideMaterial: Om det är aktiverat används materialet som lagras i OverrideMaterial 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 noden
  • ForceOff – tillståndet är inaktiverat för alla nät på och under den här noden
  • InheritFromParent – 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 .

API-dokumentation

Nästa steg