Iluminación en juegos para dispositivos móviles con Unity

La iluminación es uno de los aspectos más importantes de un juego. Establece el ambiente, guía al jugador e identifica amenazas y objetivos, y mucho más. La iluminación puede determinar el éxito o el fracaso de las imágenes de un juego. Por ejemplo, una buena iluminación puede hacer que un modelo malo se vea mejor en el juego, mientras que la mala iluminación puede perjudicar cómo se ve un modelo excelente.

En esta guía, se proporciona información para lograr un mejor rendimiento de la iluminación en un juego para dispositivos móviles. La forma en que decides usar la iluminación afecta el rendimiento del juego para dispositivos móviles. Es importante usarla de manera eficiente a fin de asegurar de que el juego funcione de la mejor manera posible.

Partes de este artículo se basan en el trabajo aportado y protegido por derechos de autor de Arm Limited.

Opciones de canalización de renderizaciones

La canalización de renderizaciones heredada de Unity incluye las siguientes rutas de renderización:

  • Renderización directa
  • Sombreado diferido

Renderización directa

En la renderización directa, las luces en tiempo real son muy costosas. Si reduces la cantidad de luces presentes por píxel, podrás compensar este costo.

Sombreado diferido

El sombreado diferido requiere compatibilidad con GPU. En el hardware compatible, el sombreado diferido puede renderizar una gran cantidad de luces en tiempo real con un nivel alto de fidelidad de iluminación. Lamentablemente, el sombreado diferido no funciona bien en las GPU de dispositivos móviles porque tienen un ancho de banda más bajo.

Cuando creas un título para dispositivos móviles, es importante que el juego se ejecute sin problemas en la mayor cantidad de dispositivos posible.

Canalización universal de renderizaciones

Unity desarrolló la canalización universal de renderizaciones (URP). Te recomendamos que uses la URP en tus juegos para dispositivos móviles.

Modos de luz

Según cómo se mueva o se use la luz en una Escena, se usarán diferentes modos de luz. Los tipos de modo claro tienen diferentes características de rendimiento. Cuando implementes luces, ten en cuenta lo siguiente:

  • Usa la iluminación preparada en casos de iluminación estática. Esto es ideal para los objetos que no cambian su iluminación durante el tiempo de ejecución. La preparación de luces es el procedimiento de procesamiento previo y almacenamiento de datos de iluminación en mapas de texturas denominados mapas de luz.
    • La iluminación preparada no se puede modificar en el tiempo de ejecución. La luz y las sombras de los mapas de luz son estáticas. Dado que toda la iluminación se procesó previamente en Unity, no hay ningún cálculo de iluminación en el tiempo de ejecución que afecte el rendimiento.
    • Las sombras dinámicas no se pueden crear con iluminación preparada. Esto puede parecer extraño con objetos dinámicos o en movimiento.
  • Usa la opción mixta para las luces fijas que quieras que interactúen con objetos en movimiento. Por ejemplo, una antorcha que emite luz sobre un jugador y genera una sombra a medida que este se mueve.
    • La iluminación mixta crea luces y sombras directas y dinámicas.
    • Puedes incluir iluminación mixta en cálculos de mapas de luz para objetos estáticos.
    • Puedes cambiar la intensidad en el tiempo de ejecución. Solo se actualizará la luz directa.
    • Es costoso.
  • Usa el tiempo real para las luces dinámicas o móviles, como la luz que emite una bola de fuego que se eleva desde el suelo y explota.
    • Las propiedades dinámicas de las luces y sombras se pueden modificar durante el tiempo de ejecución.
    • Las luces en tiempo real no están incluidas en los mapas de luz.
    • Es muy costoso.

Si deseas obtener más información, consulta Canalización de iluminación en Unity.

Cuando sea posible, usa iluminación estática y evita la dinámica

La iluminación dinámica o en tiempo real se calcula y actualiza en cada fotograma. Esta es ideal para objetos en movimiento y la interacción con ellos, así como para crear emociones.

En cambio, la información de luces estáticas se incluye en los mapas de luz. El uso de texturas de mapas de luz permite que un objeto evite los cálculos costosos de la iluminación por vértice o por píxel. El costo de renderización de una textura de mapa de luz es siempre mucho más económico que el de la iluminación dinámica. Recomendamos que la iluminación preparada sea tu primera opción a los efectos de implementarla en un juego para dispositivos móviles.

Preparación de mapas de luz

El cálculo previo de los efectos de la luz se conoce como preparación de mapas de luz. El efecto de la luz se almacena en una textura aparte, llamada mapa de luz. Se puede usar este mapa a fin de aumentar la apariencia de los objetos. La preparación de mapas de luz solo debe realizarse una vez por cada iteración de tu Escena. Si cambias la geometría de la Escena o los parámetros de la iluminación preparada, deberás volver a preparar los mapas de luz. Excepto por la sobrecarga de la textura del mapa de luz, no se generan costos adicionales de rendimiento durante el tiempo de ejecución. Este es el mejor enfoque inicial a los efectos de implementar la iluminación en una plataforma móvil.

La luz preparada no resulta afectada por ningún aspecto dinámico ni móvil de tu Escena. Esta iluminación incluye Baked Global Illumination para todos los elementos estáticos. Esto significa que los cálculos de mapas de luz incluyen luz indirecta que rebota de otros objetos estáticos, además de las luces preparadas que se emiten sobre el objeto de forma directa.

Figura 1: Configuración del sistema de iluminación preparado que se utiliza en la demostración de tecnología de los ejércitos.

Para preparar las luces, sigue los tres pasos siguientes.

Paso 1: Configura las luces como mixtas o preparadas

Establece el Modo de las luces en Mixed (mixtas) o Baked (preparadas). En el caso de los títulos para dispositivos móviles, lo mejor es usar luces preparadas y no mixtas. La preparación es la forma menos costosa de renderizar la luz.

Figura 2: Configuración del Modo de la luz en Unity.

Paso 2: Haz que los objetos sean estáticos

Haz que cualquier objeto afectado por las luces preparadas sea estático. Hay muchas optimizaciones para un objeto marcado como estático, pero, por lo general, es mejor seleccionar Everything en la lista desplegable Static. Con el objeto marcado como estático, Unity sabrá que debe incluirlo en la preparación de las luces.

Figura 3: Menú estático de ejemplo.

Paso 3: Preparación de las luces

Puedes preparar las luces en el menú Lighting que se encuentra en Window > Rendering > Lighting Settings.

Cuando preparas luces, los datos guardados se basan en la Escena que estaba activa cuando empezaste la preparación. Se generará una carpeta con el mismo nombre que la Escena preparada. Esta carpeta almacenará todos los componentes de los datos de iluminación. Si tu proyecto carga varios Ambientes a la vez, deberás preparar las luces de cada uno. Si ajustas el Ambiente, deberás volver a preparar las luces.

Figura 4: Ejemplo de mapas de luz preparados.

Optimiza los mapas de luz

Después de establecer las luces que se prepararán, asegúrate de que los mapas preparados estén optimizados. El tamaño de los mapas de luz varía según su configuración cuando estos se preparan. Debes mantener al mínimo el uso de memoria en dispositivos móviles, por lo que se debe supervisar el tamaño de los mapas de luz.

En el siguiente ejemplo de la demostración de los ejércitos, hay siete mapas de luz de 1,024 píxeles por 1,024 píxeles. En la vista previa del mapa, podrás ver mallas desplegadas sobre el mapa de luz. Las mallas seleccionadas se encuentran destacadas.

Figura 5: Este es un ejemplo de un mapa de luz. Las secciones azules son las mallas seleccionadas.

Hay muchos ajustes en la Configuración de los mapas de luz, además del tamaño de los mapas, que determinan la cantidad de memoria y el espacio de almacenamiento que usa cada mapa. En las secciones siguientes, se destacan algunas opciones de configuración importantes.

Generadores de mapas de luz

Unity ofrece los siguientes tres métodos a fin de preparar las luces en tu Escena:

  • Deslumbrar: Solo es compatible hasta la versión 2020 de asistencia a largo plazo. No la uses en proyectos nuevos.
  • CPU progresiva: Ahorra mucho tiempo porque crea mapas de luz de forma incremental. Si se selecciona Prioritize View, se priorizarán las áreas de la vista de la Escena. Esto puede reducir el tiempo de iteración para configurar la luz de tu Escena.
  • GPU progresiva: Funciona de la misma manera que la CPU progresiva, pero genera el mapa de luz en la GPU en lugar de hacerlo en la CPU. En hardware compatible, este método puede reducir en gran medida el tiempo de preparación en comparación con el caso en que se use la CPU. Existen requisitos adicionales para configurar la GPU progresiva. Obtén más información sobre esos requisitos en la página del Generador de mapas de luz de GPU progresiva.

Figura 6: La configuración del generador de mapas de luz te permite cambiar el método de preparación de tu Escena.

Téxeles

Un texel, o píxel de textura, es un píxel individual de un mapa de texturas. Los téxeles almacenan información de la iluminación en un mapa de luz para cada punto de luz que alcanza un objeto. La cantidad de téxeles por unidad de espacio afecta la calidad de la iluminación, el tiempo de procesamiento para la preparación, los costos de almacenamiento en disco y el costo de la VRAM de tus mapas de luz.

A fin de reducir la cantidad de datos requeridos de mapas de luz, ajusta la cantidad de téxeles por unidad de preparación en la Configuración de los mapas de luz.

Figura 7: Opciones de configuración disponibles para mapas de luz.

En la configuración de los mapas de luz, el parámetro Lightmap Resolution controla la cantidad de téxeles que se usarán por unidad en el mapa de luz. El siguiente es un ejemplo de un cubo con diferentes configuraciones de resolución de mapa de luz. Puedes ver cómo una resolución más alta aumenta con rapidez la cantidad de trabajo necesario.

Figura 8: El primer cubo tiene una resolución de mapa de luz de 1. El segundo cubo tiene una resolución de mapa de luz de 2. El tercer cubo tiene una resolución de mapa de luz de 5.

Para ver cómo se ubican los téxeles en la Escena selecciona la lista desplegable Draw Mode en la vista de la Escena y elige Baked Lightmap.

Los objetos preparados se cubrirán con una superposición con forma de tablero de ajedrez. Este patrón muestra la distribución de tus téxeles cuando preparas las luces.

En el siguiente ejemplo, reducir la resolución del mapa de luz de 15 a 12 en la demostración de los ejércitos reduce la cantidad de mapas de luz necesarios de siete a cuatro.

Figura 9: Demostración de los ejércitos con una resolución de mapas de luz de 12.

Uso de téxeles

Si bien puedes establecer la cantidad de téxeles por unidad en un Ambiente completo, a menudo hay objetos que no necesitan tantos téxeles.

Unity te permite controlar cuántos téxeles usa cada objeto. En Inspector > Mesh Renderer para un objeto, el valor del parámetro Scale In Lightmap controla la cantidad de téxeles que usa el objeto en el mapa de luz.

En el siguiente ejemplo, el cubo de la izquierda tiene cinco téxeles de información de luz por unidad de preparación. El recuadro de la derecha tiene la opción Scale In Lightmap configurada en 0.5. Esta configuración escala los téxeles de luz a 2.5, que requiere menos espacio en el mapa de luz en comparación con el recuadro de la izquierda.

Figura 10: Dos cubos con diferentes resoluciones de mapas de luz.

Figura 11: Puedes cambiar el parámetro Scale In Lightmap de modo que un objeto tenga menos téxeles.

Evitar gastar téxeles en los siguientes objetos:

  • Superficies y objetos que el jugador no verá (esto evita que se desperdicie memoria en mapas de luz para obtener detalles que no aparecerán en la pantalla)
  • Superficies con poca variación de luz (por ejemplo, los objetos que se encuentran en una sombra o son alcanzados por una sola fuente de luz)
  • Objetos pequeños o estrechos (la cantidad de luz que estos reciban no aportará tanto a la renderización final de la Escena)

Usa iluminación falsa tanto como sea posible

A fin de reducir los requisitos de procesamiento, puedes simular algunos elementos. Esto puede hacer que tu contenido parezca usar luz, aunque, en realidad, use métodos más eficientes.

Sombras falsas

Las sombras en tiempo real son costosas. Se generan con una técnica llamada asignación de sombras. El costo de renderizar la geometría de un Ambiente en el mapa de sombras es proporcional a la cantidad de vértices dibujados con las sombras habilitadas. Te recomendamos que limites la cantidad de geometría y de luces en tiempo real que proyectan sombras.

Puedes implementar sombras falsas para las sombras de objetos dinámicos sin luces dinámicas. Esto mantiene bajos los costos de renderización y puede lograr un efecto similar a las sombras dinámicas. Estas son algunas formas de implementar sombras falsas:

  • Usa una malla 3D, como un plano o cuadrante, colocada debajo del personaje y aplícale una textura desenfocada.
  • Puedes escribir tu propio sombreador personalizado para obtener sombras de BLOB más sofisticadas.

El siguiente ejemplo muestra el resultado cuando utilizas una malla 3D para una sombra:

Figura 12: Implementación de sombras en la demostración de tecnología de los ejércitos.

Pinta la información sobre la luz directamente en las texturas

Si pintas parte de la sombra en las texturas, reducirás el procesamiento necesario para las luces adicionales. Esto ahorra memoria cuando preparas las luces de la Escena, ya que necesita menos datos del mapa de luz.

Sondas de luz

Cuando uses objetos dinámicos con iluminación preparada, no se verán afectados por los mapas de luz. Esto podría hacer que parezca que no forman parte del Ambiente.

Puedes solucionar este problema con las sondas de luz. Estos tienen beneficios similares a los de los mapas de luz. Almacenan datos de luz que se pueden calcular de manera anticipada y reservar para su uso en el tiempo de ejecución. Esto pasa gran parte de los costos de procesamiento al tiempo de edición.

Mientras un mapa de luz codifica la luz recibida en un téxel para superficies, una sonda de luz almacena la luz que atraviesa un espacio vacío. Puedes usar estos datos a fin de iluminar objetos móviles. Las sondas de luz ayudan a integrar objetos dinámicos de manera visual con objetos de los mapas de luz a través de todo tu Escena.

Las sondas de luz son la mejor opción a los efectos de iluminar objetos que se mueven en la Escena. Las sondas aprovechan tus luces preparadas, lo que permite que los objetos en movimiento tengan la misma luz que la Escena. La iluminación de objetos dinámicos con sondas de luz es menos costosa que las luces en tiempo real.

Puedes obtener más información en las páginas de Iluminación estática con sondas de luz y Sondas de luz.

Figura 13: Sondas de luz ubicadas para iluminar la multitud en la demostración de tecnología de los ejércitos.

Configuración del renderizador de mallas

Independientemente del tipo de luz que use la Escena, es importante que la configuración del renderizador de mallas sea la correcta.

Desactiva todo lo que no uses. Los parámetros de configuración como Cast Shadows agregan costo cuando renderizas la Escena, incluso si el objeto no está iluminado. El siguiente ejemplo de la configuración del renderizador de mallas corresponde a un personaje que se muestra en la Figura 13. El personaje usa datos de la sonda de luz, pero no de sondas de reflejos.

El parámetro de configuración Blend Probes de las sondas de luz combina la información de las sondas de luz más cercanas al personaje. A medida que este se mueve por la Escena, cambiarán las sondas de luz que lo afectan. El parámetro Cast Shadows está desactivado porque la renderización usa el método de BLOB. El parámetro Receive Shadows también está desactivado porque el Ambiente se preparó y no hay sombras en tiempo real.

Figura 14: Configuración del Renderizador de mallas para la renderización de la Figura 13.

Luces en tiempo real y tipos de luz

Te recomendamos que controles la luz con iluminación preparada, sondas de luz y técnicas de iluminación falsa, como texturas de iluminación pintadas o efectos materiales de sombreadores. Sin embargo, si necesitas luz en tiempo real, deberás tener en cuenta el tipo de luz que se usará.

Cada tipo de luz tiene un costo diferente para calcular la iluminación. La siguiente lista detalla los distintos tipos:

  • Luz direccional: Esta luz tiene una dirección uniforme y ninguna atenuación. La luz direccional es la luz en tiempo real menos costosa. Por lo general, solo necesitas una luz direccional por Ambiente. Mediante la renderización directa, la ruta de renderización sugerida para dispositivos móviles, Unity incluirá una luz direccional predeterminada si no hay luces direccionales en el Ambiente.
  • Reflector: Los reflectores sacrifican los objetos fuera de su cono y no los iluminan. Esto los hace menos costosos en términos de procesamiento respecto de los focos esféricos. A los efectos de obtener el mejor rendimiento, mantén un ancho estrecho del cono y solo alcanza los objetos deseados.
  • Foco: Los focos proyectan la luz en todas las direcciones. Proyectar luz en todas las direcciones es útil, pero muy costoso. Los focos son costosos y se extienden a lo largo de una región amplia. Además, el cálculo de la sombra puede ser la parte más costosa de la iluminación. Si transmites luz en todas las direcciones, habrá más sombras y más cálculos.