Les lumières et ombres 3D

Introduction

Les sources lumineuses émettent une lumière qui se mélange aux matériaux et produit un résultat visible. La lumière peut provenir de plusieurs types de sources dans une scène :

  • De la matière elle-même sous la forme de la couleur d'émission (bien qu'elle n'affecte pas les objets proches à moins qu'elle ne soit préparée).

  • Nœuds de lumière : Directional, Omni and Spot.

  • Lumière ambiante dans l'Environnement.

  • Lumière préparée (read Baked lightmaps).

La couleur d'émission est une propriété matérielle. Vous pouvez en savoir plus dans le tutoriel Spatial Material.

Nœuds de lumière

Il existe trois types de nœuds lumière : Directional light, Omni light et Spot light. Jetons un coup d’œil aux paramètres communs pour les lumières :

../../_images/light_params.png

Chacun a une fonction spécifique :

  • Color : Couleur de base de la lumière émise.

  • Energy : Multiplicateur d'énergie. Ceci est utile pour saturer les lumières ou travailler avec High dynamic range lighting.

  • Indirect Energy : Multiplicateur secondaire utilisé avec la lumière indirecte (rebond de la lumière). Cela fonctionne en lumière préparée ou en GIProbe.

  • Negative : La lumière devient soustractive au lieu d'être additive. Il est parfois utile de compenser manuellement certains coins sombres.

  • Specular : Affecte l'intensité de la tache spéculaire dans les objets affectés par cette lumière. A zéro, cette lumière devient une lumière pure et diffuse.

  • Bake Mode : Sélectionne le mode de calcul pour la lumière. Pour plus d'information voire Baked lightmaps

  • Cull Mask : Les objets qui se trouvent dans les couches(layers) sélectionnées en dessous seront affectés par cette lumière. Notez que les objets désactivés à l'aide de cull mask continueront à projeter des ombres. Si vous ne voulez pas que les objets désactivés projettent des ombres, ajustez la propriété cast_shadow de la GeometryInstance à la valeur souhaitée.

Cartographie des ombres

Les lumières peuvent optionnellement projeter des ombres. Cela leur donne plus de réalisme (la lumière n'atteint pas les zones occultées), mais cela peut entraîner un coût de performance plus élevé. Il existe une liste de paramètres d'ombre génériques, chacun ayant également une fonction spécifique :

  • Enabled : Cochez cette case pour activer la cartographie des ombres dans cette lumière.

  • Color : Les zones occultées sont multipliées par cette couleur. elle est noire par défaut, mais elle peut être changée pour teinter les ombres.

  • Biais: Si ce paramètre est trop bas, l'ombre de l'objet risque de se projeter sur lui-même. Si elle est trop élevée, l'ombre se sépare de l'objet à son origine. Régler pour obtenir le meilleur résultat visuel.

  • Contact : Effectue un raycast court dans l'espace de l'écran pour réduire l'espace généré par le biais. Les ombres de contact ne sont disponibles que lors de l'utilisation du backend GLES3.

  • Inverser la suppression des visages : Certaines scènes fonctionnent mieux lorsque le mappage d'ombres est rendu avec l'élimination des visages inversée.

Ci-dessous se trouve une image de ce à quoi ressemble un biais d'ajustement. Les valeurs par défaut fonctionnent dans la plupart des cas, mais en général cela dépend de la taille et de la complexité de la géométrie.

../../_images/shadow_bias.png

Enfin, si les lacunes ne peuvent être résolues, l'option Contact peut vous aider (moyennant un coût de performance) :

../../_images/shadow_contact.png

Tout problème de partialité peut toujours être résolu en augmentant la résolution de la carte des ombres, bien que cela puisse entraîner une baisse des performances.

Astuce

Si la polarisation des ombres est un problème dans votre scène, les paramètres suivants constituent un bon point de départ :

  • Activez Face cachée inversée. Cela permet de réduire considérablement le peter-panning des ombres et empêche les lumières de présenter une acné des ombres à des angles rasants. Le principal inconvénient est que cela peut provoquer des fuites d'éclairage dans certains coins. L'autre inconvénient est que les matériaux dont le mode de suppression est réglé sur Désactivé ou les MeshInstances dont l'ombre portée est réglée sur Double face peuvent présenter une acné de l'ombre.

  • Définissez Bias à -0.01. Le biais doit être une valeur négative lorsque Reverse Cull Face est activé, mais il doit être une valeur positive lorsqu'il est désactivé.

  • Pour DirectionalLight, réglez l'ombre directionnelle Normal Bias sur 0.0 et Bias Split Scale sur 0.0. En fonction de votre scène, vous pouvez également réduire davantage Bias à une valeur comprise entre -0,05 et -0,1.

En suivant les conseils ci-dessus, il devrait être possible d'éviter les trous dans les ombres sans avoir recours aux ombres de contact (qui présentent de nombreux problèmes elles mêmes). Si l'acné des ombres est toujours visible après avoir effectué les ajustements ci-dessus, essayez de subdiviser davantage vos mailles dans votre logiciel de modélisation 3D.

Directional light

C'est le type de lumière le plus courant et représente une source lumineuse très éloignée (comme le soleil). C'est aussi la lumière la moins chère à calculer et devrait être utilisée chaque fois que c'est possible (bien que ce ne soit pas la carte des ombres la moins chère à calculer, mais plus à ce sujet ultérieurement).

Directional light modélise un nombre infini de rayons lumineux parallèles couvrant l'ensemble de la scène. Le nœud Directional light est représenté par une grande flèche qui indique la direction des rayons lumineux. Cependant, la position du nœud n'affecte pas du tout l'éclairage et peut être n'importe où.

../../_images/light_directional.png

Chaque face dont l'avant est frappé par les rayons lumineux est éclairée, tandis que les autres restent sombres. La plupart des types d'éclairage ont des paramètres spécifiques, mais les Directional light sont assez simples par nature, donc ils n'en ont pas.

Cartographie des ombres directionnelles

Pour calculer les cartes des ombres, la scène est rendue (uniquement en profondeur) d'un point de vue orthogonal qui couvre toute la scène (ou jusqu'à la distance maximale). Il y a cependant un problème avec cette approche car les objets plus proches de la caméra reçoivent des ombres pixelisées.

../../_images/shadow_blocky.png

Pour résoudre ce problème, une technique appelée "Parallel Split Shadow Maps" (ou PSSM) est utilisée. Ceci divise le tronc de la vue en 2 ou 4 zones. Chaque région a sa propre carte de ombres. Cela permet à de petites zones proches du spectateur d'avoir la même résolution d'ombre qu'une grande zone éloignée.

../../_images/pssm_explained.png

Avec cela, les ombres deviennent plus détaillées :

../../_images/shadow_pssm.png

Pour contrôler le PSSM, un certain nombre de paramètres sont exposés :

../../_images/directional_shadow_params.png

Chaque distance divisée est contrôlée par rapport à la distance de la caméra (ou l'ombre Max Distance si supérieure à zéro), donc 0,0 est la position de l'œil et 1,0 est la position où l'ombre se termine à une distance. Les divisions sont entre les deux. Les valeurs par défaut fonctionnent généralement bien, mais il est courant d'ajuster un peu le premier fractionnement pour donner plus de détails aux objets proches (comme un personnage dans un jeu à la troisième personne).

Veillez toujours à définir une ombre Max Distance en fonction des besoins de la scène. Une distance maximale plus faible donnera de meilleures ombres.

Parfois, la transition entre une séparation et la suivante peut sembler mauvaise. Pour résoudre ce problème, l'option "Blend Splits " peut être activée, ce qui sacrifie les détails en échange de transitions plus fluides :

../../_images/blend_splits.png

Le paramètre "Normal Bias " peut être utilisé pour fixer des cas particuliers d'ombrage automatique lorsque les objets sont perpendiculaires à la lumière. Le seul inconvénient est que cela rend l'ombre un peu plus mince.

../../_images/normal_bias.png

Le paramètre "Bias Split Scale " permet de contrôler le biais supplémentaire pour les divisions éloignées. Si l'ombrage automatique ne se produit que sur les fentes éloignées, cette valeur peut arranger ça.

Enfin, la "Depth Range " a deux réglages :

  • Stable : Garde l'ombre stable pendant que la caméra se déplace, et les blocs qui apparaissent dans le contour à proximité des bords de l'ombre restent en place. C'est le réglage par défaut et généralement souhaité, mais il réduit la résolution effective de l'ombre.

  • Optimisé : Essaie d'atteindre la résolution maximale disponible à tout moment. Il peut en résulter un effet de "scie en mouvement" sur les bords de l'ombre, mais en même temps l'ombre semble plus détaillée (donc cet effet peut être assez subtil pour être pardonné).

Expérimentez simplement quel réglage convient le mieux à votre scène.

La taille de la carte des ombres pour les éclairages directionnels peut être modifiée dans Paramètres du projet -> Rendering -> Quality :

../../_images/project_setting_shadow.png

L'augmenter peut résoudre des problèmes de biais, mais diminue la performance. La cartographie des ombres est l'art de l'ajustement.

Omni light

Omni light est une source ponctuelle qui émet une lumière sphérique dans toutes les directions jusqu'à un rayon donné.

../../_images/light_omni.png

Dans la vie réelle, l'atténuation de la lumière est une fonction inverse, ce qui signifie que les lumières omnidirectionnelles n'ont pas de rayon. C'est un problème car cela signifie que le calcul de plusieurs Omni light deviendrait exigeant.

Pour résoudre ce problème, une Range est introduite avec une fonction d'atténuation.

../../_images/light_omni_params.png

Ces deux paramètres permettent d'ajuster visuellement le fonctionnement afin d'obtenir des résultats esthétiques.

../../_images/light_attenuation.png

Cartographie des ombres de Omni lights

La cartographie des ombres dû à un Omni light est relativement simple. Le principal problème à considérer est l'algorithme utilisé pour le rendu.

Les ombres omnidirectionnelles peuvent être rendues comme "Dual Paraboloid" ou "Cube Mapped ". Le premier rend rapidement, mais peut causer des déformations, tandis que le second est plus correct, mais plus coûteux.

../../_images/shadow_omni_dp_cm.png

Si les objets rendus sont le plus souvent irréguliers, Dual Paraboloid est généralement suffisant. Quoi qu'il en soit, comme ces ombres sont cachées dans un atlas d'ombres (plus de détails à la fin), cela peut ne pas faire de différence de performance pour la plupart des scènes.

Spot light

Les Spot lights sont semblables aux omni lights, sauf qu'elles émettent de la lumière uniquement dans un cône. elles sont utiles pour simuler des lampes de poche, des feux de voiture, des réflecteurs, des spots, etc. Ce type de lumière est également atténué dans la direction opposée vers laquelle elle pointe.

../../_images/light_spot.png

Les Spot lights partagent les mêmes Range et Attenuation que les OmniLight, et ajoutent deux paramètres supplémentaires :

  • Angle : L’angle d’ouverture de la lumière

  • Atténuation d’angle : l’atténuation de cône, qui aide à adoucir les bords du cône.

Cartographie des ombres de Spot lights

Les Spot lights n'ont pas besoin de paramètres pour la cartographie des ombres. Gardez à l'esprit qu'à plus de 89 degrés d'ouverture, les ombres cessent de fonctionner pour les Spot lights, et vous devriez envisager d'utiliser un Omni light à la place.

Atlas d'ombre

Contrairement aux Directional lights, qui ont leur propre texture d'ombre, les Omni lights et Spot lights sont assignées aux emplacements d'un atlas d'ombre. Cet atlas peut être configuré dans Paramètres du projet -> Rendering -> Quality -> Shadow Atlas.

../../_images/shadow_atlas.png

La résolution s'applique à l'ensemble de l'Atlas d'ombres. Cet atlas est divisé en quatre quadrants :

../../_images/shadow_quadrants.png

Chaque quadrant peut être subdivisé pour attribuer un nombre quelconque de cartes des ombres ; la subdivision par défaut est la suivante :

../../_images/shadow_quadrants2.png

La logique d'allocation est simple. La plus grande taille de carte d'ombres (lorsqu'aucune subdivision n'est utilisée) représente une lumière de la taille de l'écran (ou plus grande). Les subdivisions (cartes plus petites) représentent les ombres pour les lumières qui sont plus éloignées de la vue et proportionnellement plus petites.

Pour chaque image, la procédure suivante est exécutée pour toutes les lumières :

  1. Vérifiez si la lumière est sur un emplacement de la bonne taille. Si ce n'est pas le cas, re-rendez-le et déplacez-le dans un emplacement plus grand ou plus petit.

  2. Vérifiez si un objet affectant la carte des ombres a changé. Si c'est le cas, re-rendez la lumière.

  3. Si rien de ce qui précède ne s'est produit, rien n'est fait et l'ombre n'est pas touchée.

Si les emplacements d'un quadrant sont pleins, les lumières sont repoussées vers des emplacements plus petits, selon la taille et la distance.

Cette stratégie d'allocation fonctionne pour la plupart des jeux, mais vous pouvez en utiliser une autre dans certains cas (par exemple, un jeu de haut en bas où toutes les lumières sont de la même taille et où les quadrants peuvent avoir la même subdivision).

Qualité du filtre d'ombre

La qualité du filtre des ombres peut être modifiée. Cela se trouve dans Paramètres du projet -> Rendering -> Quality -> Shadows. Godot supporte : aucun filtre, PCF5 et PCF13.

../../_images/shadow_pcf1.png

Il affecte l'aspect de bloc du contour de l'ombre :

../../_images/shadow_pcf2.png