Guía Unity pantalla de carga Oculus
Descripción General
Descripción de la problemática.
En VR, al tener un muy bajo frame rate, el visor de realidad virtual muestra una pantalla de carga mientras la computadora no le manda suficiente información al visor, esto suele ocurrir al cargar una nueva escena, aún haciéndolo de manera asíncrona. Lo anterior resulta molesto para la experiencia de usuario y puede llegar a interrumpir la inmersión. Al igual que en SteamVR, Oculus implementa un módulo compositor encargado de componer la escena para su funcionamiento en VR, este compositor incluye el comportamiento mencionado anteriormente proteger al usuario del mareo causado por una tasa baja de cuadros por segundo.
Compositor:
El compositor en Oculus se compone principalmente de tres capas:
- Overlay: que se superpone a lo contenido en la escena.
- Eyebuffer: el contenido de la escena que la cámara renderiza para ser mostrado al usuario.
- Underlay: lo que se encuentra como fondo, visible cuando la escena no es renderizada.

[Capas principales del Compositor de Oculus]
Alcances
Se requiere de una alternativa para evitar la pantalla de carga por defecto o bien, poder personalizarla.
Proceso de Desarrollo
Solución:
En el caso de Oculus, tanto para Rift como para GearVR, el plugin nos ofrece un script llamado OVROverlay que nos ofrece algunas opciones para colocar elementos en las capas del compositor, lo que hace posible personalizar la sala por defecto que se muestra durante la carga de un nivel, su uso es muy sencillo:
- Colocar en un objeto vacío el componente OVROverlay desactivado.
- Especificar el tipo de capa a donde se va a agregar este objeto:
- Overlay: por ejemplo un cursor temporizador para la vista frontal.
- Underlay:por ejemplo un skybox para el fondo.
- None: por ejemplo algún objeto que se desee agregar a la vista de escena.
- Especificar el tipo de objeto a agregar a la capa, tomando en cuenta que:
- Quad (para Rift y Móviles)
- Cubemap (para Rift y Móviles)
- Cilindro (solo para Móviles)
- Especificar las texturas a colocar en el objeto: Sólo las texturas del tipo “Default” son soportadas, si no se especifica ninguna se tomará la textura del material que tiene el objeto (si lo tiene), si sólo se especifica una se renderizará monoscopicamente en ambos ojos (útil si se utiliza cilindro como tipo de objeto), si se especifican 2 texturas se renderizarán estereoscopicamente en el ojo correspondiente (recomendado si se trabaja con cubemaps).

OVR Screen Fade:
Oculus también cuenta con un sencillo script que nos permite hacer un un fade a la cámara útil para iniciar una escena de manera suave directamente desde el compositor sin depender de un objeto que cubra la cámara, simplemente hay que agregar el componente a la cámara central de VR y especificar los parámetros.

Enlaces de descarga
https://developer.oculus.com/downloads/unity/
Archivos Adjuntos
Comentarios
Recomendaciones:
Es posible agregar varios objetos a las diferentes capas del compositor con el componente OVROverlay, el orden en el que se mostrarán es el mismo orden en el que se vayan activando.
Siéntete libre de editar el código del script OVRScreenFade para agregar nuevos comportamientos a la transición de escena, por ejemplo, en este caso se ha creado un método FadeIn a partir del método FadeOut ya existente.
public void FadeIn()
{
StartCoroutine(Fade(1, 0));
}
El activar el componente OVROverlay en tiempo de ejecución no es inmediato, requiere de cierto tiempo para visualizarse en el HMD, por lo que hay que darle un pequeño tiempo de espera mediante código. Un ejemplo de funcionamiento para una carga de nivel con su respectiva transición de entrada y salida podría ser mediante el uso de una corrutina como la siguiente:
//Componente previamente configurado y asignado a un objeto vacío
public OVROverlay overlay;
//Componente previamente configurado y asignado a la cámara central de VR
public OVRScreenFade fade;
IEnumerator Loading() {
fade.FadeOut();
//Delay del fade de salida
yield return new WaitForSeconds(2f);
overlay.enabled = true;
//Delay de la activación del componente overlay,
//en este caso, un skybox en la capa overlay que
//cubre la vista del usuario mientras se termina
//de cargar el siguiente nivel.
yield return new WaitForSeconds(0.1f);
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(SceneManager.GetActiveScene().buildIndex + 1);
while (!asyncLoad.isDone) { yield return null; }
//Se desactiva el componente overlay y se dispara la transición de entrada en el nuevo nivel
overlay.enabled = false;
fade.FadeIn();
}
Ventajas
- Es posible personalizar la pantalla de carga tanto en Rift como en móviles.
- Es posible agregar diferentes objetos a las distintas capas del compositor.
- Es posible realizar transiciones de fade mas limpias.
Desventajas
- No es posible desactivar esta pantalla de carga.
- No permite personalizar mucho la transición de fade.
- En ocasiones es necesario editar el código de fade para personalizar la transición.
Ubicación Proyecto
Elaboró
Diego Alberto Tovar Razo.