Baked lightmaps

Introduction

Les Baked lightmaps sont un flux de travail alternatif pour ajouter un éclairage indirect (ou préparé) à une scène. Contrairement à l'approche Utilisation de GIProbe, les Baked lightmaps fonctionnent très bien sur les PC et les appareils mobiles bas de gamme, car elles ne consomment pratiquement pas de ressources en temps réel. De plus, contrairement à GIProbe, les baked lightmaps peuvent être utilisées pour stocker l'éclairage direct, ce qui permet de gagner encore en performance.

Contrairement aux GIProbes, les Baked lightmaps sont complètement statiques. Une fois préparées, elles ne peuvent pas être modifiées du tout. Elles ne fournissent pas non plus de reflets à la scène, donc l'utilisation de Reflection probes avec elle à l'intérieur (ou l'utilisation d'un Sky à l'extérieur) est une condition pour obtenir une bonne qualité.

Comme elles sont préparées, elles ont moins de problèmes que GIProbe en ce qui concerne le saignement de lumière, et la lumière indirecte aura souvent un meilleur aspect. L'inconvénient est que la préparation des lightmaps prend beaucoup plus de temps que la préparation d'une GIProbe. Alors que la préparation d'une GIProbe peut être faite en quelques secondes, la préparation des lightmaps prendra plusieurs minutes, voire plus. Cela peut ralentir considérablement la vitesse d'itération, il est donc recommandé de ne préparer les lightmaps que lorsque vous avez réellement besoin de voir les changements d'éclairage.

La préparation des lightmaps réservera également le slot UV2 des matériaux préparés, ce qui signifie que vous ne pourrez plus l'utiliser à d'autres fins dans les matériaux (que ce soit dans le Spatial Material intégré ou dans les shaders personnalisés).

En fin de compte, le choix de l'approche d'éclairage indirect qui convient le mieux dépend de votre cas d'utilisation. En général, GIProbe est plus facile à configurer et fonctionne mieux avec les objets dynamiques. Pour une compatibilité mobile ou bas de gamme, cependant, les baked lightmaps sont votre seul choix.

Comparaison visuelle

Voici quelques comparaisons entre Baked Lightmaps et GIProbe. Notez que les lightmaps sont plus précises, mais souffrent aussi du fait que l'éclairage est sur une unwrapped texture, donc les transitions et la résolution peuvent ne pas être aussi bonnes. GIProbe semble moins précis (car c'est une approximation), mais globalement plus lisse.

../../_images/baked_light_comparison.png

Mise en place

Tout d’abord, pour que le Lightmapper puisse faire quoi que ce soit, les objets à préparer ont besoin d’un calque UV2 et d’une taille de texture. Une couche UV2 est un ensemble de coordonnées de texture secondaires garantissant que chaque face de l'objet a sa propre place dans la carte UV. Les faces ne doivent pas partager de pixels dans la texture.

Il y a plusieurs façons de s'assurer qu'un objet dispose d'un calque UV2 et une taille de texture unique :

Dépliage d'une scène importée

C'est probablement la meilleure approche dans l'ensemble. Le seul inconvénient est que, sur les grands modèles, le dépliage(unwrapping) peut prendre un certain temps à l'importation. Néanmoins, Godot mettra en cache l'UV2 à travers les réimportations, de sorte qu'il ne sera régénéré que lorsque cela sera nécessaire.

Sélectionnez la scène importée dans le dock filesystem, puis allez dans le dock Import. Là, l'option suivante peut être modifiée :

../../_images/baked_light_import.png

Le mode Light Baking doit être réglé sur Gen Lightmaps. Une taille de texel en unités mondiales doit également être fournie, car cela déterminera la taille finale de la texture lightmap (et, par conséquent, le remplissage UV de la carte).

L’effet du réglage de cette option est que toutes les mailles (meshes) au sein de la scène auront leurs cartes UV2 correctement générés.

Avertissement

Lorsque de la réutilisation d'un maillage (meshe) dans une scène, gardez à l'esprit que les UVs sont générés pour la première instance trouvée. Si le maillage est réutilisée à différentes échelles (et que les échelles sont très différentes, plus de la moitié ou deux fois), cela se traduira par un lightmaps inefficace. Juste, ne réutilisez pas les maillages sources à différentes échelles si vous envisagez d’utiliser lightmapping.

De plus, les fichiers *.unwrap_cache ne doivent pas être ignorés dans le contrôle de version car ces fichiers garantissent que les réimportations d'UV2 sont cohérentes entre les plateformes et les versions du moteur.

Dépliage depuis Godot

Godot a une option pour déplier les maillages (meshes) et visualiser les chaîne UV. On peut la trouver dans le menu Mesh :

../../_images/baked_light_mesh_menu.png

Cela va générer un second ensemble de coordonné UV2 qui peut être utilisé pour un baking, et cela va aussi configurer automatiquement la taille de la texture.

Déplier depuis votre logiciel 3D

La dernière option consiste à le faire à partir de votre application 3D préférée. Cette approche n'est généralement pas recommandée, mais elle est expliquée en premier afin que vous sachiez qu'elle existe. L'avantage principal est que, sur les objets complexes que vous souhaitez réimporter souvent, le processus de génération de texture peut être assez coûteux dans Godot, de sorte que l' avoir unwrapped avant l'importation peut être plus rapide.

Il suffit simplement de dérouler la deuxième couche d’UV2.

../../_images/baked_light_blender.png

Ensuite, importez la scène 3D normalement. N'oubliez pas que vous devrez définir la taille de la texture sur le maillage après l'importation.

../../_images/baked_light_lmsize.png

Si vous utilisez des maillages (meshes) externes lors de l'importation, la taille sera conservée. Attention car la plupart des décompresseurs des logiciels 3D ne sont pas réglés pour la qualité mais pour la rapidité de traitement. Vous devrez surtout utiliser les coutures (seams) ou d’autres techniques pour créer un meilleur dépliage.

Vérification des UV2

Dans le menu de maillage mentionné précédemment, les coordonnées de texture UV2 peuvent être visualisées. S'assurer, si quelque chose ne fonctionne pas, que les mailles ont ces coordonnées UV2 :

../../_images/baked_light_uvchannel.png

Mise en place de la scène

Avant de faire quoi que ce soit, un nœud BakedLightmap doit être ajouté à une scène. Cela permettra le light baking sur tous les nœuds (et sous-nœuds) de cette scène, même sur les scènes instanciées.

../../_images/baked_light_scene.png

Une sous-scène peut être instanciée plusieurs fois, car cela est supporté par le baker, et chacune se verra attribuer une lightmap (assurez-vous juste de respecter la règle de mise à l'échelle mentionnée précédemment) :

Configurer les limites

Le Lightmap a besoin d'un volume approximatif de la zone affectée, car elle l'utilise pour transférer la lumière aux objets dynamiques se trouvant à l'intérieur (plus de détails plus tard). Recouvrez simplement la scène avec le volume de la même manière que vous le faites avec GIProbe :

../../_images/baked_light_bounds.png

Mise en place des maillages

Pour qu'un nœud MeshInstance prenne part au processus de baking, la propriété Use in Baked Light doit être activée.

../../_images/baked_light_use.png

Lors de la génération automatique du lightmaps d'une scène importé, celle-ci est activé automatiquement.

Mise en place des lumières

Les lumières sont "baker" par défaut avec une lumière indirecte. Cela signifie que la shadowmapping (cartographie des ombres) et l'éclairage sont toujours dynamiques et affectent les objets en mouvement, mais la lumière rebondit à partir de cette lumière sera "baké".

Les lumières peuvent être désactivées (pas de baking) ou entièrement "baked" (directes et indirectes). Ceci peut être contrôlé à partir du menu Bake Mode dans les éclairages :

../../_images/baked_light_bake_mode.png

Les modes sont :

Désactivé

La lumière est ignorée lors du "baking". Gardez à l'esprit que cacher une lumière n'aura aucun effet sur le "baking", cela doit être utilisé à la place.

C'est le mode à utiliser pour les effets d'éclairage dynamiques tels que les explosions et les effets d'armes.

Indirect

C'est le mode par défaut, et c'est un compromis entre les performances et la convivialité en temps réel. Seul l'éclairage indirect sera préparé. La lumière directe et les ombres sont toujours en temps réel, comme elles le seraient sans BakedLightmap.

Ce mode permet d'apporter des modifications subtiles à la couleur, à l'énergie et à la position d'une lumière tout en conservant une apparence relativement correcte. Par exemple, vous pouvez l'utiliser pour créer des torches statiques vacillantes dont la lumière indirecte est préparée.

Tous

L'éclairage direct et indirect sera intégré. Étant donné que les surfaces statiques peuvent ignorer entièrement les calculs d'éclairage et d'ombres, ce mode offre les meilleures performances ainsi que des ombres fluides qui ne s'atténuent jamais en fonction de la distance. L'éclairage en temps réel n'affectera plus les surfaces préparées, mais il affectera toujours les objets dynamiques. Lorsque vous utilisez le mode d'écrasement All sur une lumière, les objets dynamiques ne projetteront pas d'ombres en temps réel sur les surfaces préparées, vous devez donc utiliser une approche différente, comme les ombres blob. Les ombres de type blob peuvent être mises en œuvre à l'aide d'une configuration Sprite3D + RayCast, ou d'une SpotLight négative pointant vers le bas et dont le mode de préparation est réglé sur Disabled.

La lumière ne sera pas du tout réglable pendant le jeu. Déplacer la lumière et changer sa couleur ou son énergie n'aura aucun effet sur les surfaces statiques.

Étant donné que les modes de préparation peuvent être réglés pour chaque lumière, il est possible de créer des configurations hybrides de lumière préparée. Une option populaire consiste à utiliser une DirectionalLight en temps réel dont le mode de préparation est réglé sur Indirect, et à utiliser le mode de préparation All pour les OmniLights et les SpotLights. Cela offre de bonnes performances tout en permettant aux objets dynamiques de projeter des ombres en temps réel dans les zones extérieures.

Après avoir sélectionné le mode de pré-calcul All sur une lumière, vous pouvez éventuellement spécifier une Size supérieure à 0 pour la lumière dans l'inspecteur. Cette taille est utilisée pour fournir des ombres plus douces en fonction de la distance entre la source de l'ombre et l'objet recevant l'ombre. Cela imite l'apparence de vrais ombres :

../../_images/baked_light_omnilight_size.png

La propriété Size de la lumière est ignorée pour les ombres en temps réel ; elle n'affectera que les ombres pré-calculées. Lorsque la propriété Size est modifiée, les lightmaps doivent être à nouveau pré-calculées pour que les changements soient visibles.

Pré-calcul

Pour pré-calculer les lumières, appuyer sur le bouton Bake Lightmaps en haut quand vous sélectionnez le nœud BakeLightmap :

../../_images/baked_light_bake.png

Cela peut prendre quelques secondes, voir des heures. La taille de la scène, la méthode de pré-calcul et sa qualité impacte le temps de calcul.

Équilibrer les temps de préparation et la qualité

Étant donné que les préparations de haute qualité peuvent prendre beaucoup de temps (jusqu'à plusieurs heures pour les grandes scènes complexes), il est recommandé d'utiliser des paramètres de qualité inférieure dans un premier temps. Ensuite, lorsque vous êtes sûr de la configuration de l'éclairage de votre scène, augmentez les paramètres de qualité et effectuez un bake "final" avant d'exporter votre projet.

Note

Par défaut, le baker lightmap utilise tous les cœurs logiques du processeur du système pour accélérer la compilation. Cela peut réduire la réactivité du système. Pour préserver la réactivité du système pendant la compilation des lightmaps, vous pouvez réduire le nombre de threads CPU utilisés pour la compilation des lightmaps. En gardant 1 ou 2 threads CPU libres, vous améliorerez la réactivité du système, ce qui est utile lorsque vous effectuez des tâches multiples pendant la compilation des lightmaps, au prix d'un léger ralentissement de la compilation des lightmaps.

Pour ce faire, ouvrez Éditeur > Paramètres de l'éditeur et ajustez Éditeurs > 3d > Lightmap Baking Number Of Cpu Threads. La valeur par défaut (0) utilise tous les cœurs logiques du CPU du système. Des valeurs positives spécifieront un nombre de threads à utiliser, tandis que des valeurs négatives soustrairont du nombre total de cœurs logiques du CPU dans le système. Par exemple, sur un système avec 8 cœurs logiques de processeur, en réglant le paramètre sur -1, 7 threads de processeur seront utilisés pour la compilation des cartes de lumière.

Configurer les pré-calculs

Différentes options sont disponibles pour le pré-calcul :

  • Bake Extents : La taille de la zone affectée. Elle peut être modifiée dans la fenêtre de l'éditeur 3D à l'aide des poignées. Tout objet qui peut avoir des lightmaps préparées et qui touche les extensions de préparation aura des lightmaps préparées pour lui, mais la capture d'objet dynamique ne fonctionnera que dans les extensions.

Ajustements

  • **Qualité : ** Quatres qualités de précalculation de lumières sont proposées : Basse, Moyenne, Haute et Ultra. Une qualité supérieure prend plus de temps, mais permet d'obtenir une texture de lumière (lightmap) de meilleure qualité avec moins de bruit. La différence est particulièrement visible avec les matériaux à émission ou dans les zones qui reçoivent peu ou pas d'éclairage direct.

  • Bounces : Le nombre de rebonds à utiliser pour l'éclairage indirect. La valeur par défaut (3) est un bon compromis entre le temps de préparation et la qualité. Des valeurs plus élevées feront rebondir la lumière plus de fois avant qu'elle ne s'arrête, ce qui rend l'éclairage indirect plus lisse (mais aussi plus lumineux). Pendant le travail initial d'itération de l'éclairage, il est recommandé de réduire le nombre de rebonds à 1 pour accélérer la préparation. N'oubliez pas que votre scène sera plus sombre lorsque vous diminuerez le nombre de rebonds.

  • Use Denoiser : Si cette option est activée, utilise OpenImageDenoise pour rendre la lightmap nettement moins parasitée. Cela augmente les temps de préparation et peut occasionnellement introduire des artefacts, mais le résultat en vaut souvent la peine.

  • Use Hdr : Si elle est désactivée, les lightmaps sont plus petites sur le disque, mais elles ne pourront pas capturer de lumière supérieure au blanc (1.0). Cela se traduira par un écrêtage visible si vous avez des lumières vives dans votre scène. Lorsque le HDR est désactivé, des bandes peuvent également être visibles dans la lightmap.

  • Use Color : Si elle est désactivée, les lightmaps sont plus petites sur le disque, mais la lightmap ne sera pas en mesure de stocker un éclairage coloré. Lors de la préparation de la lumière indirecte uniquement, la différence peut être à peine visible car la lumière indirecte n'est généralement pas très saturée. Cependant, lorsque vous préparez à la fois l'éclairage direct et indirect en utilisant le mode de préparation All sur une lumière, cela transformera l'éclairage coloré en éclairage en niveaux de gris. Ce mode peut être désactivé en même temps que le HDR pour obtenir le plus petit fichier de carte de lumière possible à une résolution donnée.

  • Bias : La valeur de décalage à utiliser pour les ombres en unités 3D. En général, il n'est pas nécessaire de modifier cette valeur, sauf si vous rencontrez des problèmes de saignement de lumière ou de taches sombres dans votre carte de lumière après la préparation. Ce paramètre n'affecte pas les ombres en temps réel projetées sur les surfaces préparées.

  • Default Texels Per Unit : Pour les maillages qui ne spécifient pas leur propre densité de texels de lightmap, cette valeur sera utilisée. Des valeurs plus élevées se traduisent par des lightmaps de faible résolution, ce qui permet d'accélérer les temps de préparation et de réduire la taille des fichiers, au prix d'un éclairage indirect et d'ombres plus flous.

Atlas

  • Generate : Si cette option est activée, un atlas de textures sera généré pour la lightmap. Cela permet un rendu plus efficace, mais n'est compatible qu'avec le backend de rendu GLES3. Désactivez ce paramètre si votre projet est autorisé à revenir à GLES2. (Ce n'est pas le cas par défaut et doit être activé dans les paramètres du projet). Ce paramètre est ignoré lorsque le projet est configuré pour utiliser GLES2 par défaut.

  • Max Size : La taille maximale de l'atlas en pixels. Des valeurs plus élevées donnent un atlas plus efficace, mais sont moins compatibles avec le matériel ancien/bas de gamme. En cas de doute, laissez ce paramètre sur sa valeur par défaut (4096).

Capturer

  • Enabled : Ce paramètre active la capture de sonde afin que les objets dynamiques puissent recevoir un éclairage indirect. Quelle que soit la valeur de ce paramètre, les objets dynamiques ne seront pas en mesure de contribuer un éclairage indirect à la scène. Il s'agit d'une limitation des lightmaps.

  • Cell Size : La distance entre les sondes de la carte de lumière en unités 3D. Des valeurs plus élevées entraînent un placement plus clairsemé des sondes, ce qui réduit les temps de préparation et la taille des fichiers au prix d'une précision d'éclairage moindre pour les objets dynamiques.

  • Quality : La qualité de génération de la sonde lightmap. Des valeurs plus élevées donnent un éclairage plus précis, mais prennent plus de temps à préparer. Ce paramètre n'affecte pas la densité des sondes lightmap, mais uniquement leur qualité.

  • Propagation : Similaire à la propriété Propagation de GIProbe. Des valeurs plus élevées donnent un éclairage indirect plus lumineux et plus diffus pour les objets dynamiques. Ajustez cette valeur en fonction de votre scène pour que les objets dynamiques correspondent mieux à l'éclairage statique préparé.

Données

  • Light Data : Contient les données de pré-calcul de lumière après le pré-calcul. Les textures sont sauvegardées sur le disque, mais il contient aussi les données de capture pour les objets dynamiques, qui peuvent être lourdes. Si vous utilisez une scène au format .tscn, vous devriez sauvegarder cette ressource dans un fichier binaire externe .lmbake pour éviter de gonfler la scène .tscn avec des données binaires encodées en Base64.

La ressource Light Data peut être modifiée pour ajuster deux propriétés supplémentaires :

  • Energy : Règle la luminosité de la lightmap. Des valeurs plus élevées donnent des lightmaps plus lumineuses. Cette valeur peut être ajustée au moment de l'exécution pour des effets dynamiques de courte durée comme les orages. Cependant, gardez à l'esprit que cela affectera toutes les lumières préparées.

  • Interior : Si cette option est activée, les objets dynamiques n'utilisent pas l'éclairage d'environnement et se servent exclusivement des sondes lumineuses pour l'éclairage ambiant. S'il est désactivé, l'éclairage d'environnement et les sondes lumineuses sont tous deux utilisés pour éclairer les objets dynamiques.

Astuce

Le fichier EXR généré peut être visualisé et même modifié à l'aide d'un éditeur d'images pour effectuer un post-traitement si nécessaire. Cependant, gardez à l'esprit que les modifications apportées au fichier EXR seront perdues lors d'une nouvelle préparation de lightmaps.

Objets dynamiques

Dans d'autres moteurs ou implémentations de lightmapper, vous devez généralement placer manuellement de petits objets appelés "lightprobes" tout autour du niveau pour générer des données de capture. Ces données sont ensuite utilisées pour transférer la lumière aux objets dynamiques qui se déplacent dans la scène.

Cependant, cette implementation de la cartographie de la lumière utilise une méthode différente. Le processus est automatique, vous n'avez donc rien à faire. Il suffit de déplacer vos objets, et ils seront éclairés en conséquence. Bien sûr, vous devez vous assurer que vous configurez vos limites de scène en conséquence ou cela ne fonctionnera pas.

../../_images/baked_light_indirect.gif