Gestion de l'éclairage pour les jeux mobiles avec Unity

L'éclairage est l'un des aspects les plus importants d'un jeu. Il peut créer une atmosphère, guider le joueur, identifier les menaces ou les objectifs et plus encore. L'éclairage peut aussi bien sauver que gâcher les éléments visuels d'un jeu. Par exemple, une luminosité bien pensée peut améliorer le rendu d'un modèle médiocre, tandis qu'un mauvais éclairage peut faire perdre toutes ses qualités à un excellent modèle.

Ce guide vous permet de découvrir comment améliorer les performances d'éclairage dans un jeu mobile. La façon dont vous utilisez l'éclairage a une incidence sur les performances de votre jeu mobile. Il est important de faire preuve d'efficacité pour que votre jeu fonctionne aussi bien que possible.

Des parties de cet article sont basées sur un document fourni par Arm Limited, qui en détient les droits d'auteur.

Options de pipeline de rendu

L'ancien pipeline de rendu d'Unity inclut les chemins de rendu suivants :

  • Rendu direct
  • Rendu différé

Rendu direct

Avec le rendu direct, le rendu des lumières en temps réel est très coûteux en ressources. On peut alléger ce processus en réduisant le nombre de lumières présentes par pixel.

Rendu différé

Le rendu différé nécessite des GPU compatibles. Sur les composants matériels compatibles, le rendu différé peut assurer le rendu d'un grand nombre de lumières en temps réel avec un haut niveau de fidélité de l'éclairage. Malheureusement, le rendu différé n'est pas adapté aux GPU mobiles, car ils ne disposent pas de la bande passante requise.

Lorsque vous créez un titre pour mobile, il est important que votre jeu fonctionne correctement sur autant d'appareils que possible.

Pipeline de rendu universel

Unity a développé le pipeline de rendu universel (URP). Nous vous recommandons vivement d'utiliser le format URP pour vos jeux mobiles.

Modes d'éclairage

Différents modes d'éclairage sont disponibles, selon la façon dont une lumière évolue ou est utilisée dans une scène. Chaque type de mode d'éclairage présente des caractéristiques de performances différentes. Lorsque vous concevez l'éclairage de votre jeu, tenez compte des points suivants :

  • Utilisez le mode intégré ("baked") pour un éclairage statique. C'est la solution idéale pour les objets ne subissant pas de modification d'éclairage pendant l'exécution. Le "baking" est un processus de précalcul et d'intégration des données d'éclairage dans des cartes de texture appelées lightmaps (cartes de luminosité).
    • Ce type d'éclairage ne peut pas être modifié au moment de l'exécution. La lumière et les ombres sur les lightmaps sont statiques. Étant donné que l'intégralité de l'éclairage a été prétraitée dans Unity, aucun calcul de l'éclairage n'affecte les performances de l'environnement d'exécution.
    • Vous ne pouvez pas créer d'ombres dynamiques avec un éclairage intégré. Le résultat risque d'être étrange en présence d'objets dynamiques ou en mouvement.
  • Utilisez le mode mixte pour les éclairages fixes lorsque vous souhaitez interagir avec des objets en mouvement. Par exemple, une torche qui projette de la lumière sur un personnage contrôlé par le joueur et génère une ombre lorsque celui-ci se déplace.
    • Le mode mixte crée un éclairage et des ombres directs et dynamiques.
    • Vous pouvez inclure un éclairage mixte dans les calculs d'un lightmap pour les objets statiques.
    • L'intensité peut être modifiée au moment de l'exécution. Seule la lumière directe est actualisée.
    • Coûteux en ressources.
  • Utilisez le mode en temps réel pour un éclairage dynamique ou mobile, comme pour la lumière d'une boule de feu qui s'élève au-dessus du sol, puis explose.
    • Les propriétés dynamiques de l'ombre et de la lumière peuvent être modifiées au moment de l'exécution.
    • Les éclairages en temps réel ne sont pas intégrés aux lightmaps.
    • Très coûteux en ressources.

Pour en savoir plus, consultez la page Unity sur le pipeline d'éclairage.

Lorsque c'est possible, opter pour l'éclairage statique et éviter les lumières dynamiques

L'éclairage dynamique (ou en temps réel) est calculé et actualisé à chaque image. Il est parfait pour les objets en mouvement, l'interactivité et la dimension émotionnelle.

À l'inverse, les informations d'éclairage statique sont intégrées aux lightmaps. La texture de ces lightmaps permet à un objet d'éviter les calculs d'éclairage coûteux en ressources pour chaque vertex ou pixel. Le coût de rendu d'une texture de lightmap est toujours bien moins élevé que celui de l'éclairage dynamique. Nous vous recommandons donc de privilégier les éclairages intégrés pour la conception d'un jeu mobile.

Conception d'un lightmap

Le précalcul des effets de lumière est connu sous le nom de préparation du lightmap. L'effet de la lumière est stocké dans une texture distincte, appelée lightmap. Ce lightmap peut servir à enrichir l'apparence des objets. La préparation d'un lightmap ne doit être effectuée qu'une seule fois par itération de la scène concernée. Si vous modifiez la géométrie de cette scène ou les paramètres des lumières intégrées, vous devrez modifier les lightmaps en conséquence. À l'exception du coût en ressources de la texture du lightmap, cette méthode n'a pas d'impact supplémentaire sur les performances lors de l'exécution. C'est la meilleure approche initiale pour l'éclairage sur une plate-forme mobile.

L'éclairage intégré n'est pas affecté par les aspects dynamiques (c'est-à-dire mouvants) de votre scène. Ce mode comprend l'éclairage intégré global ("baked global illumination") pour tous les éléments statiques. Cela signifie que les calculs du lightmap incluent la lumière indirecte reflétée par d'autres objets statiques, ainsi que les lumières intégrées arrivant directement sur l'objet.

Figure 1 : La configuration d'éclairage intégré exclusif utilisée dans l'application de démonstration technique Armies.

Pour intégrer vos éclairages, effectuez les trois opérations suivantes.

Étape 1 : Définir les éclairages sur Mixte ou Intégré

Définissez le Mode d'éclairage sur Mixed (Mixte) ou Baked (Intégré). Pour les titres sur mobile, l'éclairage intégré est préférable au mode mixte. C'est le moyen le moins gourmand en ressources pour le rendu des lumières.

Figure 2 : Le paramètre Mode d'éclairage dans Unity.

Étape 2 : Rendre les objets statiques

Définissez tous les objets concernés par l'éclairage intégré comme étant statiques. Il existe de nombreuses optimisations pour un objet défini comme statique, mais il est généralement préférable de sélectionner Everything (Tout) dans la liste déroulante du menu Static. Une fois l'objet marqué comme statique, Unity sait qu'il doit être inclus dans l'intégration de la lumière.

Figure 3 : Exemple de menu Static

Étape 3 : Intégrer votre éclairage

Vous pouvez intégrer votre éclairage avec le menu Lighting (Éclairage) de la page Window > Rendering > Lighting Settings (Fenêtre > Rendu > Paramètres d'éclairage).

Lorsque vous intégrez l'éclairage, les données enregistrées sont basées sur la scène qui était active lorsque vous avez démarré l'opération. Un dossier est généré avec le même nom que la scène avec éclairage intégré. Ce dossier stocke tous les composants pour les données d'éclairage. Si votre projet charge plusieurs scènes en même temps, vous devez répéter l'intégration des effets lumineux pour chaque scène. Si vous modifiez votre scène, vous devrez recommencer l'intégration des effets lumineux.

Figure 4 : Exemple de lightmaps intégrés.

Optimiser les lightmaps

Une fois que l'éclairage est prêt à être intégré, assurez-vous que les lightmaps correspondants sont optimisés. La taille des lightmaps varie en fonction de leurs paramètres lors de l'intégration. Il est important de réduire l'utilisation de la mémoire sur les mobiles. Nous vous conseillons donc de surveiller la taille du lightmap.

Dans l'exemple suivant de l'application de démonstration Army, il y a sept lightmaps de 1 024 × 1 024 pixels. Dans l'aperçu du lightmap, vous pouvez voir les meshs disposés sur le lightmap. Certains meshs sont sélectionnés.

Figure 5 : Voici un exemple de lightmap. Les sections en bleu sont des meshs sélectionnés.

De nombreux paramètres sont disponibles dans les paramètres des lightmaps. Avec la taille des lightmaps, ils déterminent la quantité de mémoire et d'espace de stockage utilisée par chaque lightmap. Les sections suivantes présentent quelques paramètres importants.

Outils pour les lightmaps

Unity propose les trois méthodes suivantes pour intégrer des effets lumineux dans une scène :

  • Enlighten : uniquement disponible jusqu'à la version LTS (Long Term Support) de 2020. Ne l'utilisez pas pour de nouveaux projets.
  • Progressive CPU : ce mode permet de gagner beaucoup de temps, car il crée des lightmaps de manière incrémentielle. Si l'option Prioritize View (Accorder la priorité à la vue) est sélectionnée, les zones visibles de la scène sont traitées en priorité. Cela peut réduire le délai d'itération pour configurer l'éclairage de votre scène.
  • Progressive GPU : ce mode fonctionne de la même manière que le "Progressive CPU", génère l'éclairage sur le processeur graphique plutôt que sur le processeur principal. Sur un matériel compatible, cette méthode peut demander bien moins de temps pour la création des éclairages intégrés que celle qui s'appuie sur le processeur principal. Des exigences supplémentaires s'appliquent à la configuration "Progressive CPU". Pour en savoir plus sur les conditions requises, consultez la page consacrée aux outils Progressive CPU pour les lightmaps.

Figure 6 : Les paramètres des outils pour les lightmaps vous permettent de modifier la méthode d'intégration pour votre scène.

Texels

Un texel, ou pixel de texture, est un pixel individuel dans un map de texture. Les texels stockent les informations de lumière dans un lightmap pour chaque point de lumière touchant un objet. Plus il y a de texels utilisés par unité d'espace, plus la qualité de l'éclairage est élevée, et plus sont importants les délais de calcul nécessaires pour l'intégration, les quantités de stockage sur disque et la sollicitation de la VRAM pour vos lightmaps.

Pour réduire la quantité de données de lightmaps requises, ajustez le nombre de texels par unité d'éléments intégrés dans les paramètres des lightmaps.

Figure 7 : Paramètres disponibles pour les lightmaps.

Dans les paramètres des lightmaps, le paramètre Lightmap Resolution (Résolution du lightmap) contrôle le nombre de texels utilisés par unité dans le lightmap. Voici un exemple de cube avec différentes valeurs attribuées au paramètre Lightmap Resolution. Vous pouvez constater qu'une résolution plus élevée augmente rapidement la quantité de travail nécessaire.

Figure 8 : La valeur du paramètre Lightmap Resolution pour le premier cube est de 1. Pour le deuxième cube, la valeur de Lightmap Resolution est de 2. Le troisième cube a une valeur Lightmap Resolution de 5.

Pour voir comment les texels sont disposés dans votre scène, sélectionnez la liste déroulante Draw Mode (Mode de dessin) dans la vue de la scène et choisissez Baked Lightmap (Lightmap intégré).

Les objets intégrés sont recouverts d'un damier. Le motif en damier montre la façon dont les texels sont distribués lorsque vous intégrez les éclairages.

Dans l'exemple suivant, une réduction de la valeur Lightmap Resolution de 15 à 12 dans l'application de démonstration Armies réduit le nombre de lightmas requis de sept à quatre.

Figure 9 : L'application de démonstration Armies a une valeur de Lightmap Resolution égale à 12.

Utilisation des texels

Bien que vous puissiez définir le nombre de texels par unité dans une scène entière, il existe souvent des objets qui pour lesquels il en faut un nombre réduit.

Unity vous permet de contrôler le nombre de texels utilisés par chaque objet. Dans l'option Inspector > Mesh Renderer (Inspecteur > Moteur de rendu des meshs) d'un objet, la valeur du paramètre Scale In Lightmap (Redimensionnement du lightmap) contrôle le nombre de texels que l'objet utilise dans le lightmap.

Dans l'exemple suivant, le cube de gauche contient cinq texels d'informations d'éclairage par unité d'intégration. Pour la case de droite, la valeur "Scale In Lightmap" est définie sur 0,5. Ce paramètre redimensionne les texels d'éclairage à 2,5, ce qui occupe moins d'espace dans le lightmap que pour le cube de gauche.

Figure 10 : Deux cubes avec des résolutions de lightmap différentes

Figure 11 : Vous pouvez modifier le paramètre Scale In Lightmap pour diminuer le nombre de texels d'un objet.

Utilisez le moins de texels possible pour les éléments suivants :

  • Surfaces et objets que le joueur ne verra pas. Cela évite de gaspiller de la mémoire sur des lightmaps pour des éléments non visibles à l'écran.
  • Surfaces à faible variation de luminosité. C'est le cas, par exemple, d'objets situés dans une zone d'ombre ou touchés par une seule source de lumière.
  • Objets petits ou de faible épaisseur. L'éclairage de ces éléments ne changera pas grand-chose au rendu final de la scène.

Privilégier un éclairage factice chaque fois que possible

Pour mobiliser moins de ressources, vous pouvez recourir à des éléments d'éclairage factices. Cela peut donner l'impression que votre contenu utilise des effets lumineux alors qu'il exploite des méthodes plus efficaces.

Ombres factices

Le calcul des ombres en temps réel mobilise beaucoup de ressources. Ces ombres sont générées à l'aide d'une technique appelée mappage d'ombre. Le coût de rendu de la géométrie d'une scène sur le map des ombres est proportionnel au nombre de sommets affichés pour lesquels les ombres sont activées. Nous vous recommandons de limiter la quantité d'éléments géométriques projetant des ombres ainsi que le nombre d'éclairages qui créent des ombres portées en temps réel.

Vous pouvez implémenter des ombres factices sur des objets dynamiques sans lumière dynamique. Cela contribue à réduire les coûts en ressources pour le rendu tout en obtenant un effet semblable à celui des ombres dynamiques. Voici quelques façons d'implémenter des ombres factices :

  • Utilisez un mesh 3D, tel qu'une surface plane ou un carré, sous le personnage, puis appliquez-lui une texture floue.
  • Vous pouvez coder votre propre nuanceur personnalisé pour créer des ombres génériques plus sophistiquées.

L'exemple suivant montre le résultat si vous utilisez un mesh 3D pour une ombre :

Figure 12 : Implémentation d'ombre dans l'application de démonstration technique Armies.

Peindre les informations sur la lumière directement sur des textures

Si vous peignez des parties de l'ombre dans des textures, vous réduisez les calculs requis pour les autres sources d'éclairage. Cela économise ainsi de la mémoire lorsque vous créez les effets lumineux dans votre scène, puisqu'il faut moins de données sur les lightmaps.

Sondes d'éclairage

Lorsque vous utilisez des objets dynamiques avec un éclairage intégré, ils ne sont pas affectés par les lightmaps. Ces objets risquent de donner l'impression qu'ils ne font pas partie de la scène.

Vous pouvez résoudre ce problème avec des sondes d'éclairage, qui présentent des avantages semblables à ceux des lightmaps. Elles stockent un nombre relativement faible de données pouvant être calculées à l'avance et enregistrées pour être utilisées au moment de l'exécution. Cela déplace une grande partie des coûts de calcul à la phase de modification de la scène.

Un lightmap encode la lumière reçue dans un texel pour les surfaces, tandis qu'une sonde d'éclairage stocke la lumière qui traverse un espace vide. De telles données peuvent vous servir à éclairer des objets en mouvement. Les sondes d'éclairage permettent d'intégrer visuellement des objets dynamiques avec des objets associés à des lightmaps dans l'ensemble de votre scène.

Les sondes d'éclairage conviennent particulièrement aux objets lumineux qui se déplacent dans votre scène. Elles s'appuient sur les effets lumineux intégrés, ce qui permet à vos objets en mouvement d'apparaître éclairés de la même façon que le reste de la scène. Les effets lumineux sur des objets dynamiques avec des sondes l'éclairage sont moins gourmands en ressources que l'éclairage en temps réel.

Vous pouvez en savoir plus en consultant les pages sur les lumières statiques avec sondes d'éclairage et les sondes d'éclairage.

Figure 13 : Sondes d'éclairage placées pour éclairer la foule dynamique dans l'application de démonstration Armies.

Paramètres du moteur de rendu des meshs

Quel que soit le type de lumière utilisé par votre scène, il est important que vos paramètres de moteur de rendu des meshs soient corrects.

Désactivez tout ce que vous n'utilisez pas. Des paramètres tels que Cast Shadows (Ombres portées) consomment des ressources lors du rendu de la scène, même lorsque l'objet n'est pas éclairé. L'exemple suivant de paramètres Mesh Renderer (Moteur de rendu des meshs) correspond à un personnage de la figure 13. Le personnage utilise des données de sondes d'éclairage, mais pas de sonde de reflets.

Le paramètre Blend Probes (Combinaison des sondes) combine les informations de luminosité provenant des sondes d'éclairage les plus proches du personnage. À mesure que le personnage se déplace dans la scène, ses sondes d'éclairage se modifient. La fonctionnalité Cast Shadows (Ombres portées) est désactivée, car le rendu utilise la méthode des ombres génériques. La fonctionnalité Receive Shadows (Recevoir des ombres) est également désactivée, car les effets lumineux sont intégrés à la scène, qui ne contient pas d'ombres calculées en temps réel.

Figure 14 : Paramètres de Mesh Renderer (Moteur de rendu des meshs) pour le rendu de la figure 13.

Éclairage en temps réel et types de lumière

Nous vous recommandons de gérer les effets lumineux à l'aide d'éclairages intégrés et de sondes d'éclairage, ainsi que d'autres techniques d'éclairage artificielles, telle que des textures lumineuses ou des effets de nuanceurs sur les matériaux. Toutefois, si vous avez besoin d'éclairage en temps réel, vous devez choisir le type de lumière à utiliser.

Le coût en ressource des calculs d'éclairage est différent pour chaque type de lumière. La liste suivante présente les différents types de lumière :

  • Directionnel : la lumière est dirigée de manière uniforme, sans baisse d'intensité. La lumière directionnelle est la lumière en temps réel la moins gourmande en ressources. Il suffit souvent d'une seule lumière directionnelle par scène. Avec le rendu direct, qui est suggéré pour les mobiles, Unity inclut un éclairage directionnel par défaut en l'absence d'éclairages directionnels dans la scène.
  • Spot : les spots occultent les objets situés à l'extérieur de leur cône lumineux et ne les éclairent pas. Cela les rend moins gourmands en ressources que les sources de lumière ponctuelles sphériques. Pour obtenir des performances optimales, limitez la largeur du cône et n'éclairez que les objets souhaités.
  • Ponctuel : ces sources d'éclairage diffusent de la lumière dans toutes les directions. Un tel mode d'éclairage est pratique, mais il consomme beaucoup de ressources. Les éclairages ponctuels mobilisent beaucoup de ressources pour des espaces importants. En outre, les calculs associés aux ombres peuvent représenter la partie la plus coûteuse en ressources de l'éclairage d'une scène. Lorsque vous projetez de la lumière dans toutes les directions, vous obtenez plus d'ombres, donc plus de calculs.