Invalidación de estado jerárquico
En muchos casos, es necesario cambiar de forma dinámica el aspecto de partes de un modelo, por ejemplo, ocultar subgráficos o cambiar partes a una representación transparente. No es práctico cambiar los materiales de cada parte implicada, ya que requiere recorrer en iteración todo el gráfico de la escena y administrar la clonación y asignación de materiales en cada nodo.
Para completar este caso de uso con la menor sobrecarga posible, use HierarchicalStateOverrideComponent
. Este componente implementa las actualizaciones de estado jerárquico en ramas arbitrarias del gráfico de escena. Esto significa que un estado se puede definir en cualquier nivel del gráfico de escena y se filtra en la jerarquía hasta que se reemplaza por un estado nuevo o se aplica a un objeto hoja.
Como ejemplo, considere el modelo de un automóvil y que quiere cambiar el vehículo completo para que sea transparente, excepto la parte del motor interno. Este caso de uso solo implica dos instancias del componente:
- El primer componente se asigna al nodo raíz del modelo y activa la representación transparente para todo el automóvil.
- El segundo componente se asigna al nodo raíz del motor y reemplaza el estado de nuevo al desactivar explícitamente el modo transparente.
Nota:
Las nubes de puntos no exponen un gráfico de escena completo (consulte las diferencias de los tipos de malla), por lo que la asignación de una invalidación jerárquica a la entidad raíz de un modelo de nube de puntos aplicará el estado a toda la nube de puntos. Además, algunas características de invalidación de estado no se admiten para nubes de puntos, como se mencionó en la sección correspondiente.
Características
El conjunto fijo de estados que se pueden invalidar es:
Hidden
: las mallas respectivas del gráfico de escena se ocultan o se muestran.Tint color
: un objeto representado se puede teñir con su intensidad y color de tono individual. En la imagen siguiente se muestra el tinte de color del borde de una rueda.See-through
: la geometría se representa de modo semitransparente; por ejemplo, para mostrar las partes internas de un objeto. En la imagen siguiente se muestra el coche completo que se representa en el modo transparente, excepto la mordaza de freno roja:Importante
El efecto transparente solo funciona cuando se usa el modo de representación TileBasedComposition.
Nota:
El efecto transparente se omite para las nubes de puntos.
Shell
: la geometría se representa como un shell transparente y desaturado. Este modo permite atenuar las partes no importantes de una escena mientras mantiene una sensación de forma y posicionamiento relativo. Para cambiar la apariencia de la representación del shell, use el estado ShellRenderingSettings. Vea la imagen siguiente del modelo de automóvil representado completamente en el shell, excepto los amortiguadores azules:Importante
El efecto de shell solo funciona cuando se usa el modo de representación TileBasedComposition.
Nota:
El efecto del shell se omite para las nubes de puntos.
Selected
: La geometría se representa con un contorno de selección.Nota:
La representación del esquema de selección se omite para las nubes de puntos.
DisableCollision
: La geometría está exenta de consultas espaciales. La marcaHidden
no afecta a la marca del estado de las colisiones, por lo que estas dos marcas se suelen establecer juntas.TransparencyWritesDepth
: activa la escritura de profundidad para las transparencias deSee-through
y material en el árbol de escena de la entidad del componente. Con esta marca, las transparenciasSee-through
pueden tener habilitada o deshabilitada la escritura en profundidad en un subárbol, incluso siTransparencyWritesDepth
se fuerza globalmente. Para la transparencia del material, la marca se comporta de forma inclusiva, lo que significa que siTransparencyWritesDepth
está habilitado con invalidación, forzada globalmente o a través de las marcas del material, la escritura en profundidad está habilitada para los objetos representados con este material.UseCutPlaneFilterMask
: use una máscara de bits de filtro individual para controlar la selección del plano de corte. Esta marca determina si se debe usar la máscara de filtro individual o si se hereda de su elemento primario. La máscara de bits de filtro se establece mediante la propiedadCutPlaneFilterMask
. Para obtener información detallada sobre cómo funciona el filtrado, vea el párrafo Planos de corte selectivos. En el ejemplo siguiente solo están cortados el neumático y la llanta, mientras que el resto de la escena permanece intacta.UseOverrideMaterial
: si está habilitado, el material almacenado enOverrideMaterial
se usa para representar la geometría con ese material. Es una manera eficaz de cambiar la representación de piezas de modelo más grandes a un material dedicado sin cambiar realmente materiales individuales de piezas. Los materiales de color pueden anular los materiales PBR y viceversa. Sin embargo, debe garantizarse que el modelo proporciona secuencias de vértices obligatorias, por ejemplo, el vértice normal en caso de que el material invalidado sea un material PBR. Además, invalida ese botón de alternancia en la transparencia, solo funciona de forma confiable en el modo de representación TileBasedComposition.Nota:
El material de invalidación se omite para las nubes de punto.
Sugerencia
Como alternativa a desactivar las consultas espaciales y de visibilidad de un subgráfico completo, se puede alternar el estado enabled
de un objeto de juego. Si una jerarquía está deshabilitada, esto tiene preferencia sobre cualquier HierarchicalStateOverrideComponent
.
Invalidaciones jerárquicas
HierarchicalStateOverrideComponent
se puede adjuntar en varios niveles de una jerarquía de objetos. Puesto que solo puede haber un componente de cada tipo en una entidad, cada objeto HierarchicalStateOverrideComponent
administra los estados oculto, transparente, selección, tono de color y colisión.
Por lo tanto, cada estado se puede establecer como:
ForceOn
: el estado está habilitado para todas las mallas de este nodo y niveles inferiores.ForceOff
: el estado está deshabilitado para todas las mallas de este nodo y niveles inferiores.InheritFromParent
: el estado no se ve afectado por este componente de invalidación.
Puede cambiar los estados directamente o mediante la función 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);
Color de tono
La invalidación de tint color
es ligeramente especial, ya que hay tanto un estado activado/desactivado/heredado como una propiedad de color de tono. La parte alfa del color de tono define el peso del efecto de tinción: si se establece en 0,0, no hay ningún color de tono visible y, si se establece en 1,0, el objeto se representa con color de tono puro. Para los valores entre ellos, el color final se mezcla con el color de tono. El color del tono se puede cambiar en cada fotograma para lograr una animación de color.
Consideraciones de rendimiento
Una instancia de HierarchicalStateOverrideComponent
no agrega mucha sobrecarga en tiempo de ejecución. Sin embargo, siempre es recomendable mantener un número bajo de componentes activos. Por ejemplo, al implementar un sistema de selección que resalta el objeto seleccionado, se recomienda eliminar el componente al quitar el resaltado. El mantenimiento de los componentes en torno a características neutras puede sumar rápidamente.
La representación transparente coloca más carga de trabajo en las GPU del servidor que la representación estándar. Si las partes grandes del gráfico de escena cambian a transparente, con muchas capas de geometría visibles, puede convertirse en un cuello de botella de rendimiento. Todo esto se puede aplicar a los objetos con contornos de selección y para la representación del shell .