Override dello stato gerarchico
In molti casi, è necessario modificare in modo dinamico l'aspetto di parti di un modello, ad esempio nascondere sottografi o passare parti al rendering trasparente. La modifica dei materiali di ogni parte interessata non è pratica perché richiede di scorrere l'intero grafico della scena e gestire la clonazione e l'assegnazione dei materiali in ogni nodo.
Per completare questo caso d'uso con il minor sovraccarico possibile, utilizzare HierarchicalStateOverrideComponent
. Questo componente implementa gli aggiornamenti dello stato gerarchico in rami arbitrari del grafo della scena. Ciò significa che uno stato può essere definito in qualsiasi livello del grafico della scena e si insidia nella gerarchia fino a quando non viene sottoposto a override da un nuovo stato o applicato a un oggetto foglia.
Nel caso del modello di un'automobile, ad esempio, è possibile rendere l’intera automobile trasparente, ad eccezione della parte interna del motore. Questo caso d'uso coinvolge solo due istanze del componente:
- Il primo componente viene assegnato al nodo radice del modello e attiva il rendering trasparente per l'intera automobile.
- Il secondo componente viene assegnato al nodo radice del motore e sostituisce di nuovo lo stato disattivando in modo esplicito la modalità trasparente.
Nota
Le nuvole di punti non espongono un grafico a scena completa (vedere differenze tra i tipi di mesh), quindi l'assegnazione di un override gerarchico all'entità radice di un modello cloud di punti applicherà lo stato al cloud del punto completo. Inoltre, alcune funzionalità di override dello stato non sono supportate per i cloud di punti, come indicato nella rispettiva sezione.
Funzionalità
Il set fisso di stati di cui è possibile eseguire l'override sono:
Hidden
: le rispettive mesh nel grafico della scena sono nascoste o visualizzate.Tint color
: un oggetto di cui è stato eseguito il rendering può essere colorato con il colore e il peso della tinta individuali. L'immagine seguente mostra la colorazione del cerchione di una ruota.See-through
: viene eseguito il rendering semitrasparente della geometria, ad esempio per rivelare le parti interne di un oggetto. Nell'immagine seguente viene mostrata l'intera automobile sottoposta a rendering in modalità trasparente, ad eccezione della pinza del freno rossa:Importante
L'effetto trasparente funziona solo quando viene usata la modalità di rendering TileBasedComposition.
Nota
L'effetto see-through viene ignorato per le nuvole di punti.
Shell
: viene eseguito il rendering della geometria come shell trasparente e desaturata. Questa modalità consente di dissolvere parti non importanti di una scena mantenendo comunque un senso di forma e posizionamento relativo. Per modificare l'aspetto del rendering della shell, usare lo stato ShellRenderingSettings . Vedere l'immagine seguente per il modello di auto di cui viene eseguito il rendering interamente in shell, ad eccezione delle sorgenti blu:Importante
L'effetto shell funziona solo quando viene usata la modalità di rendering TileBasedComposition.
Nota
L'effetto shell viene ignorato per le nuvole di punti.
Selected
: viene eseguito il rendering della geometria con un contorno di selezione.Nota
Il rendering della struttura di selezione viene ignorato per le nuvole di punti.
DisableCollision
: la geometria è esente da query spaziali. IlHidden
flag non influisce sul flag di stato di collisione, quindi questi due flag vengono spesso impostati insieme.TransparencyWritesDepth
: attiva la scrittura approfondita perSee-through
le trasparenze materiali e nell'albero della scena dell'entità del componente. Usando questo flag,See-through
le trasparenze possono avere una scrittura approfondita abilitata o disabilitata in un sottoalbero, anche seTransparencyWritesDepth
è forzata a livello globale. Per la trasparenza del materiale, il flag si comporta in modo inclusivo, ovvero seTransparencyWritesDepth
è abilitato con override, forzato a livello globale o tramite i flag del materiale, la scrittura di profondità è abilitata per gli oggetti sottoposti a rendering con questo materiale.UseCutPlaneFilterMask
: usare una maschera di bit di filtro singola per controllare la selezione del piano di taglio. Questo flag determina se la maschera di filtro singola deve essere utilizzata o ereditata dal relativo elemento padre. La maschera di bit del filtro viene impostata tramite laCutPlaneFilterMask
proprietà . Per informazioni dettagliate sul funzionamento del filtro, vedere il paragrafo Piani di taglio selettivo. Vedere l'esempio seguente in cui solo il pneumatico e il bordo vengono tagliati mentre il resto della scena rimane invariato.UseOverrideMaterial
: se abilitato, il materiale archiviato inOverrideMaterial
viene usato per eseguire il rendering della geometria con tale materiale. È un modo efficiente per cambiare il rendering delle parti del modello più grandi in un materiale dedicato senza effettivamente spostare singoli materiali di parte. I materiali a colori possono sostituire i materiali PBR e viceversa. Tuttavia, deve essere garantito che il modello fornisca flussi di vertici obbligatori, ad esempio, la normale vertice nel caso in cui il materiale sottoposto a override sia un materiale PBR. Inoltre, esegue l'override dell'interruttore sulla trasparenza, funziona solo in modo affidabile nella modalità di rendering TileBasedComposition.Nota
Il materiale di override viene ignorato per le nuvole di punti.
Suggerimento
In alternativa alla disattivazione della visibilità e delle query spaziali per un sottografo completo, è possibile attivare/disattivare lo enabled
stato di un oggetto gioco. Se una gerarchia è disabilitata, questa preferenza è rispetto a qualsiasi HierarchicalStateOverrideComponent
oggetto .
Override gerarchici
HierarchicalStateOverrideComponent
può essere collegato a più livelli di una gerarchia di oggetti. Poiché può essere presente solo un componente di ciascun tipo in un'entità, ogni HierarchicalStateOverrideComponent
gestisce gli stati per hidden, see-through, selected, color tint e collision.
Pertanto, ogni stato può essere impostato su uno dei seguenti:
ForceOn
- lo stato è abilitato per tutte le mesh su questo nodo e sotto di essoForceOff
- lo stato è disabilitato per tutte le mesh su questo nodo e sotto di essoInheritFromParent
- lo stato non è interessato da questo componente di override
È possibile modificare gli stati direttamente o tramite la funzione 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);
Colore tinta
L'override tint color
è leggermente speciale in quanto è presente sia uno stato on/off/inherit che una proprietà colore tinta. La parte alfa del colore della tinta definisce il peso dell'effetto tinta: se impostato su 0,0, non è visibile alcun colore di tinta e se impostato su 1,0 viene eseguito il rendering dell'oggetto con colore tinta puro. Per i valori compresi tra valori, il colore finale viene misto al colore della tinta. Il colore tinta può essere modificato per i singoli frame per ottenere un'animazione di colori.
Considerazioni sulle prestazioni
Un'istanza di HierarchicalStateOverrideComponent
non aggiunge molto sovraccarico in fase di esecuzione. Tuttavia, è sempre consigliabile fare in modo che il numero di componenti attivi sia basso. Ad esempio, quando si implementa un sistema di selezione che evidenzia l'oggetto selezionato, è consigliabile eliminare il componente quando l'evidenziazione viene rimossa. Il mantenimento di componenti con funzionalità neutre può aggiungere rapidamente sovraccarico.
Il rendering trasparente aggiunge un carico di lavoro maggiore sulle GPU del server rispetto al rendering standard. Se parti di grandi dimensioni del grafo della scena sono impostate come see-through, con molti livelli di geometria visibili, si potrebbe verificare un collo di bottiglia nelle prestazioni. Lo stesso vale per gli oggetti con contorni di selezione e per il rendering della shell .