Hierarchische Zustandsüberschreibung
In vielen Fällen ist es notwendig, die Darstellung von Teilen eines Modells dynamisch zu ändern, z. B. das Ausblenden von Unterdiagrammen oder das Tauschen von Teilen für das transparente Rendering. Es ist nicht sehr praktikabel, die Materialien jedes involvierten Teils zu ändern, da es erforderlich ist, das gesamte Szenendiagramm zu durchlaufen und die Materialklonung sowie die Zuweisung auf jedem Knoten zu verwalten.
Verwenden Sie die Komponente HierarchicalStateOverrideComponent
, um diesen Anwendungsfall mit dem geringstmöglichen Aufwand zu lösen. Diese Komponente implementiert Updates für den hierarchischen Zustand für beliebige Branches des Szenendiagramms. Das bedeutet, dass der Zustand auf jeder Ebene im Szenendiagramm definiert werden kann. Die Hierarchie wird so lange durchsucht, bis der Zustand entweder von einem neuen Zustand überschrieben oder auf ein Blattobjekt angewendet wird.
Nehmen Sie als Beispiel das Modell eines Autos: Sie möchten, dass das gesamte Auto transparent dargestellt wird, mit Ausnahme des Motors. Der Anwendungsfall umfasst nur zwei Instanzen der Komponente:
- Die erste Komponente wird dem Stammknoten des Modells zugewiesen und aktiviert das transparente Rendering für das gesamte Auto.
- Die zweite Komponente wird dem Stammknoten des Motors zugewiesen und überschreibt den Zustand erneut, indem der durchsichtige Modus explizit überschrieben wird.
Hinweis
Punktwolken machen keinen vollständigen Szenengraph verfügbar (siehe Gittertypunterschiede), sodass eine hierarchische Außerkraftsetzung der Stammentität eines Punktwolkenmodells den Zustand auf die gesamte Punktwolke anwendet. Darüber hinaus werden einige Features zur Außerkraftsetzung von Zuständen für Punktwolken nicht unterstützt, wie im entsprechenden Abschnitt erwähnt.
Features
Die festgelegten Zustände, die überschrieben werden können, sind die folgenden:
Hidden
: Entsprechende Gittermodelle im Szenendiagramm werden ausgeblendet oder angezeigt.Tint color
: Ein gerendertes Objekt kann mit einzelnen Farben und Sättigung getönt werden. Im Bild unten ist die Felge eines Rads getönt dargestellt.See-through
: Die Geometrie wird semitransparent gerendert, um beispielsweise die inneren Teile eines Objekts anzuzeigen. Die folgende Abbildung zeigt das gesamte Auto, das mit Ausnahme des roten Bremssattels im durchsichtigen Modus gerendert wird:Wichtig
Der durchsichtige Effekt funktioniert nur, wenn der Renderingmodus TileBasedComposition verwendet wird.
Hinweis
Der Durchsichteffekt wird für Punktwolken ignoriert.
Shell
: Die Geometrie wird als transparente, entsättigte Shell gerendert. In diesem Modus können unwichtige Teile einer Szene ausgeblendet werden, während trotzdem ein Gefühl für die Form und relative Positionierung erhalten bleibt. Verwenden Sie den Status ShellRenderingSettings, um die Renderingdarstellung der Shell zu ändern. In der folgenden Abbildung sehen Sie das Automodell vollständig als Shell gerendert, mit Ausnahme der blauen Federn:Wichtig
Der Shellmodus funktioniert nur, wenn der Renderingmodus TileBasedComposition verwendet wird.
Hinweis
Der Shelleffekt wird für Punktwolken ignoriert.
Selected
: Die Geometrie wird mit einer Auswahlgliederung gerendert.Hinweis
Die Auswahl des Konturrenderings wird für Punktwolken ignoriert.
DisableCollision
: Die Geometrie ist von räumlichen Abfragen ausgenommen. DasHidden
-Flag wirkt sich nicht auf das Kollisionsstatus-Flag aus, deshalb werden diese beiden Flags häufig zusammen festgelegt.TransparencyWritesDepth
: Aktiviert tiefen Schreiben fürSee-through
- und Materialtransparenzen in der Szenenstruktur der Komponente. Bei Verwendung dieses Flags könnenSee-through
-Transparenzen in einer Unterstruktur entweder aktiviert oder deaktiviert sein, auch wennTransparencyWritesDepth
global erzwungen wird. Bei der materiellen Transparenz verhält sich das Flag inklusiv, d. h., wennTransparencyWritesDepth
entweder mit Außerkraftsetzung, global erzwungen oder über die Kennzeichnungen des Materials aktiviert ist, wird das tiefe Schreiben für Objekte aktiviert, die mit diesem Material gerendert werden.UseCutPlaneFilterMask
: Verwenden Sie eine einzelne Filterbitmaske, um die Auswahl der Schnittebene zu steuern. Dieses Flag bestimmt, ob die jeweilige Filtermaske verwendet oder von der übergeordneten Filtermaske geerbt werden soll. Die Filterbitmaske selbst wird mit derCutPlaneFilterMask
-Eigenschaft festgelegt. Ausführliche Informationen zur Funktionsweise der Filterung finden Sie im Abschnitt Selektive Schnittebenen. Im folgenden Beispiel sind nur der Reifen und die Felge angeschnitten, während der Rest der Szene unbeeinflusst bleibt.UseOverrideMaterial
: Wenn aktiviert, wird das inOverrideMaterial
gespeicherte Material verwendet, um die Geometrie mit diesem Material zu rendern. Dies ist eine effiziente Methode, das Rendern größerer Modellteile auf ein dediziertes Material umzustellen, ohne tatsächlich einzelne Teilematerialien auszuwechseln. Farbmaterialien können PBR-Materialien außer Kraft setzen und umgekehrt. Es muss jedoch sichergestellt werden, dass das Modell obligatorische Vertexströme bereitstellt, z. B. den Vertex normal, falls das außer Kraft gesetzte Material ein PBR-Material ist. Darüber hinaus funktionieren Außerkraftsetzungen, die auf Transparenz umschalten, nur zuverlässig im TileBasedComposition-Renderingmodus.Hinweis
Das Außerkraftsetzungsmaterial wird für Punktwolken ignoriert.
Tipp
Als Alternative zum Deaktivieren der Sichtbarkeit und räumlicher Abfragen für ein vollständiges Unterdiagramm kann der Status enabled
eines Spielobjekts umgeschaltet werden. Wenn eine Hierarchie deaktiviert ist, hat dies Vorrang vor jeder HierarchicalStateOverrideComponent
.
Hierarchische Überschreibungen
Die HierarchicalStateOverrideComponent
kann auf mehreren Ebenen einer Objekthierarchie angefügt werden. Da auf einer Entität nur eine Komponente jedes Typs vorhanden sein darf, verwaltet jede HierarchicalStateOverrideComponent
die Zustände für „ausgeblendet“, „durchsichtig“, „ausgewählt“, „getönt“ und „collision“
Deshalb kann jeder Zustand auf eine der folgenden Optionen festgelegt werden:
ForceOn
: Der Zustand wird für alle Gittermodelle auf und unterhalb dieses Knotens aktiviert.ForceOff
: Der Zustand wird für alle Gittermodelle auf und unterhalb dieses Knotens deaktiviert.InheritFromParent
: Der Zustand ist von dieser Überschreibungskomponente nicht betroffen.
Sie können Zustände direkt oder über die SetState
-Funktion ändern:
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);
Tönungsfarbe
Das Überschreiben der tint color
ist etwas Besonderes, da es sowohl den Zustand „ on/off/inherit“ (an, aus, erben) als auch eine Tönungsfarbeneigenschaft gibt. Der Alphateil der Farbtonfarbe definiert die Gewichtung des Farbtoneffekts: Wenn der Farbton auf 0,0 festgelegt ist, ist keine Farbtonfarbe sichtbar, und wenn das Objekt auf 1,0 festgelegt wird, wird das Objekt mit reiner Farbtonfarbe gerendert. Für Zwischenwerte wird die endgültige Farbe mit der Farbtonfarbe gemischt. Die Tönungsfarbe kann auf Pro-Frame-Basis geändert werden, um eine Farbanimation zu erreichen.
Überlegungen zur Leistung
Eine Instanz von HierarchicalStateOverrideComponent
selbst führt nicht zu einem großen Runtimemehraufwand. Jedoch bewährt es sich immer, die Anzahl der aktiven Komponenten niedrig zu halten. Wenn Sie beispielsweise ein Auswahlsystem implementieren, das das ausgewählte Objekt hervorhebt, wird empfohlen, die Komponente zu löschen, wenn die Hervorhebung entfernt wird. Die Beibehaltung der Komponenten mit neutralen Features kann sich schnell häufen.
Durch das transparente Rendering werden die GPUs des Servers durch mehr Workload belastet als beim Standardrendering. Wenn große Teile des Szenendiagramms zu durchsichtig wechseln und viele Geometrieebenen sichtbar sind, kann dies zu einem Leistungsengpass führen. Das gleiche gilt für Objekte mit Auswahlkonturen und für das Shell-Rendering .