Occlusion Culling es una característica que desactiva el renderizado de objetos cuando actualmente no estén visibles por la cámara puesto que están oscurecidos (occluded) por otros objetos. Esto no sucede automáticamente en gráficas computacionales 3D ya que la mayoría de veces los objetos que están más lejos de la cámara son dibujados primero y los objetos más cercanos son dibujados encima de estos (esto se llama “overdraW”). El Occlusion Culling es diferente del Frustum Culling. frustum Culling solamente desactiva los renderers para objetos que están afuera del área visible de la cámara pero no desactiva nada oculto de la vista por overdraw. Tenga en cuenta que cuando usted utilice Occlusion Culling usted todavía se beneficiaría de Frustum Culling.
El proceso de la eliminación selectiva de oclusión(occlusion culling) va a ir a través de la escena usando una cámara virtual para construir una jerarquía de un conjunto de objetos potencialmente visibles. Esta información es usada en el tiempo de ejecución por cada cámara para identificar qué es visible y qué no es. Equipado con esta información, Unity asegurará que solo los objetos visibles se van a enviar para ser renderizados. Esto reduce el número de las llamadas de dibujo(draw calls) y aumenta el rendimiento del juego.
La información para la eliminación selectiva de oclusión está compuesta por células. Cada célula es una subdivisión de la totalidad del volumen de delimitación de la escena. Más específicamente las células forman un árbol binario. La eliminación Selectiva de Oclusión usa dos árboles, uno para View Cells(Objetos estáticos) y la otra para Target Cells(Objetos en Movimiento).Las View Cells se asignan a una lista de índices que definen los objetos estáticos visibles que da un resultado de eliminación selectiva más preciso para objetos estáticos.
Es importante mantener esto en menta cuando cree sus objetos ya que usted necesita un buen balance entre el tamaño de sus objetos y el tamaños de sus casillas. Idealmente, usted no tendría casillas que son bastantes pequeñas en comparación a sus objetos pero de igual manera usted no debería tener objetos que cubren muchas casillas. Usted a veces puede mejorar el culling al romper objetos más grandes en unos más pequeños. Sin embargo, usted todavía puede fusionar objetos pequeños juntos para reducir draw calls y, con tal de que pertenezcan a la misma casilla, occlusion culling no será afectado.
Usted puede utilizar el modo de renderizado de la escena ‘overdraw’ para ver la cantidad de overdraw que está ocurriendo, y el panel de información estadístico en el game view para ver la cantidad de triángulos, verts y batches que están siendo renderizados. Abajo hay una comparación de estos antes y después de aplicar occlusion culling.
Con el fin de utilizar la Eliminación Selectiva de Oclusión, hay un ajuste manual involucrado. Primero, su nivel de geometría debe ser roto en piezas con un tamaño sensato. También es útil diseñar sus niveles en áreas pequeñas bien definidas, que están ocluidos entre sí por grandes objetos tales como paredes, edificios, etc. La idea aquí es que cada mesh individual sera prendido o apagado basado en la información de oclusión. Entonces si usted tiene un objeto que contiene todos los muebles de su cuarto, entonces, o todo o nada, del conjunto de muebles será eliminado. Esto no tiene casi tanto sentido como hacer que cada pieza de mueble sea su propio mesh, entonces cada uno individualmente puede ser eliminado basado el punto de vista de la cámara.
Usted necesita etiquetar todos los objetos de escena que quiere que sean parte del occlusion a Occluder Static en el Inspector. La manera más rápida para hacer esto es seleccionar varios objetos que usted quiere incluir en los cálculos de occlusion, y marquelos como Occluder Static y Occludee Static.
¿Cuándo debe usar Occludee Static? Los objetos completamente transparentes o translúcidos que no ocluyen, así como los objetos pequeños que probablemente no ocluyan otras cosas, deben marcarse como Occludees, pero no como ____Occluders__. Esto significa que serán considerados en oclusión por otros objetos, pero no serán considerados como oclusores, lo que ayudará a reducir el cálculo.
Cuando se usan grupos LOD, solo el objeto de nivel base (LOD0) se puede usar como un oclusor.
For most operations dealing with Occlusion Culling, you should use the Occlusion Culling Window (Window > Rendering > Occlusion Culling)
En la Ventana de la Eliminación Selectiva de Oclusión(Occlusion Culling Window), usted puede trabajar con meshes de oclusión, y Occlusion Areas.
Si usted está en la pestaña Object de la ventana de Occlusion Culling y tiene un Mesh Renderer seleccionado en la escena, usted puede modificar las flags estáticas relevantes:
Si usted no está en la pestaña Object de la Ventana de Occlusion Culling y tiene una Occlusion Area seleccionada, usted puede trabajar con propiedades OcclusionArea relevantes (para más detalles vaya a la sección Occlusion Area)
TENGA EN CUENTA: Por defecto si usted no crea ningún área de oclusión, occlusion culling será aplicada a toda la escena.
TENGA EN CUENTA: En cualquier momento que su cámara esté afuera del área de oclusión, la occlusion culling (eliminación selectiva de oclusión) no será aplicada. Es importante ajustar sus Áreas de Oclusión para cubrir los lugares en dónde la cámara puede potencialmente estar, pero hacer las áreas demasiado grandes incurre en un precio durante el baking.
La ventana bake de occlusion culling tiene un botón “Set Default Parameters” que le permite a usted re-iniciar los valores bake a los valores predeterminados de Unity. Estos son buenos para muchas escenas típicas, sin embargo, usted podrá obtener mejores resultados ajustando los valores para que encajen el contenido particular de su escena.
Propiedad | Función |
---|---|
Smallest Occluder | El tamaño del objeto más pequeño que será utilizado para ocultar otros objetos cuando se haga occlusion culling. Cualquier objeto más pequeño que esté tamaño nunca causará a los objetos que eran occluded por ellos en ser culled (cortados). Por ejemplo, con un valor de 5, todos los objetos que sean más altos o anchos que 6 meteros van a causar que los objetos detrás de ellos sean culled (cortados - no renderizados, ahorrando tiempo de renderizado). Para escoger un buen valor para esta propiedad hay que tener un balance entre la precisión de occlusion y el tamaño de almacenamiento para los datos de occlusion. |
Smallest Hole | Este valor representa la brecha más pequeña entre la geometría que la cámara supone que ve. El valor representa el diámetro de un objeto que puede encajar a través del hueco. Si su escena tiene pequeñas grietas, las cuales deberían ser capaz de ser vistas por la cámara, el valor Smallest Hole debe ser menor que la dimensión más estrecha de la brecha. |
Backface Threshold | El occlusion de Unity utiliza una optimización de tamaño de los datos lo cual reduce detalles innecesarios al probar backfaces. El valor predeterminado de 100 es robusto y nunca quita backfaces del conjunto de datos. Un valor de 5 reduciría agresivamente los datos basados en ubicaciones con backfaces visibles. La idea es que típicamente, las posiciones de cámara validas no verían normalmente backfaces - por ejemplo, la vista de la cara inferior de un terreno, o la vista dentro de un objeto sólido que usted no debería ser capaz de alcanzar. Con un umbral menor que 100, Unity va a quitar estas áreas del conjunto de datos completamente, por lo tanto reduciendo el tamaño de datos para la occlusion. |
Cuando usted haya terminado de ajustar estos valores haga click en el botón Bake para comenzar a procesar la información de la Eliminación Selectiva de Oclusión(Oclussion Culling). Si usted no está satisfecho con los resultados, haga click en el botón Clear para quitar información previamente calculada.
Todos los objetos en la escena afectan al tamaño del volumen de delimitación entonces trate de mantenerlos todos dentro de los límites visibles de la escena.
When you’re ready to generate the occlusion data, click the Bake button. The time taken to build the occlusion data will depend on the cell levels, the data size and the quality you have chosen.
Después de que el procesamiento es hecho, usted debería ver algunos cubos de color en el View Area. Las áreas coloreadas son regiones que comparten la misma información de oclusión.
Haga click en Clear si usted quiere quitar toda la información pre-calculada para la Eliminación Selectiva de Oclusión(Occlusion Culling).
Para aplicar occlussion culling a objetos en movimiento tienes que crear un Occlusion Area y luego modificar su tamaño para que se ajuste al espacio donde van a estar ubicados los objetos en movimientos (por supuesto, los objetos en movimiento no pueden ser marcados como static). Puede crear Occlusion Areas agregando el componente Occlusion Area a un Game Object vacío (Component -> Rendering -> Occlusion Area in the menus).
Después de crear una Occlusion Area, marque la casilla de verificación Is View Volume para occlude (ocultar/omitir) objetos en movimiento.
Propiedad: | Función: |
---|---|
Size | Define el tamaño del Occlusion Area. |
Center | Coloca el centro del Occlusion Area. Por defecto, será 0,0,0 y estará localizada en el centro de la caja. |
Is View Volume | Define en dónde puede estar la cámara. Verifica esto para ocluir objetos estáticos que están dentro de este Occlusion Area. |
Luego de que haya agregado el Occlusion Area, necesita ver cómo se divide la caja en celdas. Para ver cómo será calculado el Occlusion Area, seleccione Edit y active el botón View en el Occlusion Culling Preview Panel.
Después de que su occlusion esté configurada, puede probarla habilitando Occlusion Culling (en el Occlusion Culling Preview Panel en el modo Visualize) y moviendo la Main Camera alrededor de la vista de escena.
A medida que muevas la cámara principal alrededor (si estás o no en el modo Play), verás varios objetos deshabilitándose. Lo principal que tienes que estar viendo aquí es algún error en los datos de la oclusión. Reconocerás un error si ves objetos que de repente aparecen en la vista a medida que te mueves. Si esto ocurre, las opciones que tienes para corregir el error son cambiar la resolución (si estás ejecutando con target volumes) o mover los objetos alrededor para cubrir el erro. Para depurar problemas con la oclusión, puedes mover la cámara principal a la posición problemática para revisar sobre el terreno.
Cuando el procesamiento haya terminado, debe ver algunos cubos de colores en el View Area. Los cubos azules representan las divisiones por celdas para los Target Volumes. Los cubos blancos representan las divisiones por celdas para los View Volumes. Si los parámetros no estuvieran colocados correctamente, debe ver algunos objetos que no están siendo renderizados. Eso ocurre porque están por fuera del campo de visión de la cámara o porque ya está siendo ocluido de la vista porque está siendo tapado por otros objetos.
Después que la oclusión se complete, si no ves que nada esté siendo ocluido en tu escena, entonces prueba dividiendo tus objetos en pedazos pequeños para que puedan ser completamente contenidos dentro de las celdas.