
Les ombres font partie des détails qui ancrent une scène 3D et la rendent crédible, mais aussi de ceux qu’il est le plus facile de rater de façon visible. Cette mise à jour rend les ombres du soleil plus stables, plus propres et bien plus faciles à régler, et apporte les mêmes améliorations aux spot lights, point lights et area lights.
En bref :
- Des cascades stables. Les ombres des lumières directionnelles ne scintillent plus lorsque la caméra se déplace ou pivote.
- Un bias plus intelligent. Un seul réglage, exprimé en texels de shadow map, fonctionne de la cascade la plus proche à la plus éloignée.
- Des lumières sans jointures. Les point lights perdent leurs jointures de cube, et les spot lights, point lights et area lights partagent le nouveau modèle de bias.
- Plus de contrôle. Choisissez de 1 à 4 cascades, leur mode de découpage et d’ajustement, ainsi que la fréquence de mise à jour des cascades éloignées.
- Un meilleur débogage. Visualisez chaque cascade et la densité de texels directement dans le viewport.
Dans cet article
- Pourquoi les ombres sont importantes
- Comment fonctionne une ombre en temps réel ?
- Le problème du soleil, et les cascades
- Les limites de l’ancienne approche
- Les nouveautés
- Voyez la différence
- Prise en main
- Migration depuis la version précédente
- Essayez-le et donnez-nous votre avis
Pourquoi les ombres sont importantes
Retirez les ombres d’une scène et tout semble flotter. Les objets perdent leur lien avec le sol, la profondeur devient plus difficile à percevoir et l’éclairage paraît plat. Une bonne ombre vous indique où se trouvent les objets, quelle est leur taille et d’où vient la lumière.
Une mauvaise ombre se remarque tout autant. Des contours qui fourmillent lorsque la caméra bouge, des rayures sur une surface ou une ombre qui se détache de l’objet qui la projette brisent immédiatement l’illusion. C’est précisément ce à quoi s’attaque cette release.
Comment fonctionne une ombre en temps réel ?
Dans la réalité, les ombres naissent d’une lumière bloquée, mais un moteur de rendu temps réel ne suit pas le trajet de la lumière. Il utilise une astuce moins coûteuse et très efficace appelée shadow map :
- Regarder depuis la lumière. Nous rendons la scène du point de vue de la lumière, mais nous ne conservons que la distance à la surface la plus proche pour chaque pixel. Le résultat est la shadow map.
- Regarder depuis la caméra. Pour chaque pixel à l’écran, nous déterminons sa position du point de vue de la lumière et comparons sa distance avec celle enregistrée dans la shadow map.
- Décider. Si un élément plus proche de la lumière a été enregistré, le pixel est dans l’ombre. Sinon, il est éclairé.
Le problème, c’est qu’une shadow map est une texture de résolution fixe. Voyez-la comme une photo basse résolution de la scène prise depuis la lumière. Presque toutes les techniques d’ombrage sont des moyens de tirer le meilleur parti de cette résolution limitée.
Et les ombres en ray tracing et en path tracing ?
Les shadow maps sont une approximation : il est donc légitime de se demander pourquoi ne pas simplement suivre la lumière. Sur les GPU dotés de ray tracing matériel, c’est possible : on lance un rayon depuis chaque point visible vers la lumière, et si quelque chose fait obstacle, le point est dans l’ombre. Il n’y a pas de résolution de texture à épuiser, donc pas d’effet de pixellisation, pas d’acné et pas de peter-panning, et les ombres douces sont rendues avec précision. Le path tracing va plus loin et suit de nombreux trajets lumineux aléatoires qui rebondissent dans la scène : les ombres, les réflexions et l’éclairage indirect proviennent tous du même processus. L’exemple de path tracer d’Evergine montre à quoi cela ressemble.
Le prix à payer, ce sont les performances. Une image propre nécessite plusieurs rayons par pixel à chaque frame, généralement suivis d’un denoiser. La scène a besoin d’une structure d’accélération qui doit être reconstruite lorsque les objets bougent. Et les rayons partent dans toutes les directions, ce qui sollicite bien davantage la mémoire GPU que la rastérisation de triangles dans une texture. Même les GPU desktop haut de gamme comptent soigneusement leurs rayons, et la plupart des téléphones, tablettes et appareils d’entrée de gamme ne disposent d’aucun ray tracing matériel.
C’est pourquoi les shadow maps restent la solution de référence pour les ombres en temps réel : elles sont peu coûteuses, prévisibles et fonctionnent sur pratiquement tous les appareils. Le ray tracing est une excellente option lorsque le matériel le permet, mais ce sont les shadow maps qui permettent à une scène de fonctionner partout ailleurs, et c’est pourquoi nous continuons à investir dans cette technique.
Le problème du soleil, et les cascades
Une lumière directionnelle représente le soleil, et le soleil éclaire tout. Une seule shadow map devrait couvrir tout le monde visible : une texture étirée sur des centaines de mètres produirait des ombres pixellisées juste devant le joueur, là où le détail compte le plus.
La solution classique consiste à utiliser des cascaded shadow maps. Nous découpons la vue en tranches selon la distance à la caméra : une petite tranche près de vous, une plus grande derrière, et ainsi de suite. Chaque tranche dispose de sa propre shadow map : les ombres proches sont nettes et les ombres lointaines plus grossières. Les objets éloignés étant petits à l’écran, on le remarque rarement.
Evergine utilisait déjà des cascades. La nouvelle release vise à améliorer leur comportement.
Les limites de l’ancienne approche
Trois problèmes revenaient sans cesse :
- Le scintillement. Chaque cascade était orientée en fonction de la caméra : lorsque la caméra tournait, la grille de la shadow map glissait sur le monde. Les contours des ombres fourmillaient et scintillaient.
- L’acné et les ombres flottantes. Comme une shadow map est une grille d’échantillons, une surface peut s’ombrer elle-même à tort et présenter des rayures (shadow acne). Le remède habituel est un léger bias, mais une valeur fixe unique ne peut pas convenir à toutes les cascades. Trop faible, il laisse des rayures aux angles rasants ; trop fort, il détache l’ombre de l’objet qui la projette (peter-panning), en particulier dans les cascades éloignées.
- Peu de marge de réglage. Le nombre de cascades était fixé à quatre, avec un contrôle limité sur leur répartition.
Quoi de neuf
Des cascades qui ne scintillent plus
L’espace des ombres dépend désormais uniquement de l’orientation de la lumière, et non de la direction vers laquelle regarde la caméra. Chaque cascade est également alignée sur la grille de texels de la shadow map, et sa taille ne change que par petits paliers d’environ 2 %. Ainsi, déplacer ou faire pivoter la caméra ne modifie plus quel texel couvre quelle partie du monde, et le scintillement disparaît.
Un bias qui comprend votre scène
Le bias est désormais appliqué dans l’espace monde et exprimé en texels de shadow map. Deux nouvelles propriétés, ShadowDepthBias et ShadowNormalBias, s’adaptent automatiquement à la taille des texels de chaque cascade et à la douceur du filtre d’ombre. Un seul réglage se comporte désormais de façon cohérente de la cascade la plus proche à la plus éloignée, ce qui élimine les bandes d’acné aux angles rasants et les ombres flottantes au loin.
Spot lights, point lights et area lights
Le modèle de bias basé sur les texels ne se limite pas au soleil. Les spot lights, point lights et area lights l’utilisent désormais aussi : ShadowDepthBias et ShadowNormalBias ont donc la même signification pour tous les types de lumière. Au passage, nous avons corrigé deux problèmes :
- Les anneaux d’acné sur les surfaces orientées à l’opposé de l’axe de projection d’une lumière.
- Les jointures visibles sur les point lights. Une point light utilise six shadow maps, une par face d’un cube, et le filtre lisait auparavant des données erronées le long des bords. Chaque face est désormais rendue avec un angle légèrement supérieur à 90 degrés, avec une marge de 8 texels, afin que les faces voisines se chevauchent et que les jointures disparaissent. Ce correctif est propre aux point lights.
Des cascades réglables
Les lumières directionnelles exposent désormais les compromis entre qualité et performances :
- Nombre de cascades : de 1 à 4, et chaque lumière n’alloue que les shadow maps dont elle a besoin.
- Mode de découpage : Automatic combine une répartition logarithmique et une répartition uniforme, contrôlées par
GammaDistribution. Manual vous permet de décider où se termine chaque cascade. - Mode d’ajustement : Stable (par défaut) ajuste chaque cascade à une sphère entourant sa tranche, de sorte que la taille des texels ne change jamais. Tight l’ajuste plutôt à une boîte, ce qui donne des texels environ 20 % plus petits, au prix d’un certain scintillement lorsque la caméra pivote.
- Mode de sélection : choisissez la cascade de chaque pixel selon la profondeur de vue, ou prenez la première cascade (la plus nette) qui le contient, afin que davantage de pixels utilisent les maps haute résolution.
- Fondu entre cascades et estompage des ombres : les cascades voisines peuvent se fondre l’une dans l’autre, et les ombres peuvent s’estomper progressivement avant la distance maximale d’ombre au lieu d’être coupées net.
- Intervalle de mise à jour des cascades éloignées : les ombres lointaines évoluent lentement, si bien que les cascades éloignées peuvent être rendues de nouveau toutes les N frames. Le moteur conserve les maps en cache tant que la caméra et la lumière restent dans une certaine tolérance, ce qui réduit le coût de la passe d’ombres.
Remarque : l’intervalle de mise à jour n’a aucun effet lorsqu’une lumière est rendue par plusieurs caméras.
Un meilleur débogage
Le Debug Mode des lumières affiche désormais la couleur de chaque cascade (et de chaque face du cube pour les point lights), ainsi qu’un damier de texels de shadow map de 8x8, pour que vous puissiez voir exactement la densité de vos ombres à l’écran. Les spot lights disposent également de leur propre DebugMode.
Nous avons également corrigé des problèmes connexes : les distances de découpage des cascades utilisent désormais la bonne formule, les caméras orthographiques dont le plan proche est à zéro ne produisent plus de découpages invalides, et le rendu de plusieurs caméras avec plusieurs lumières directionnelles projetant des ombres ne conduit plus les lumières à écraser mutuellement leurs shadow maps. Les backends gèrent le depth clamping de manière cohérente, si bien que les objets situés devant une cascade ne sont plus tronqués.
Voyez la différence
Faites glisser le curseur pour comparer l’ancien système d’ombres au nouveau, dans la même scène et avec la même position de caméra.
Prise en main
Vous pouvez tout régler depuis l’éditeur ou depuis le code. Les valeurs ci-dessous sont des points de départ indicatifs : ajustez-les à votre scène.
// Get the directional light of your sun entity
var sun = sunEntity.FindComponent<DirectionalLight>();
sun.IsShadowEnabled = true;
sun.ShadowDistance = 100; // How far from the camera shadows are rendered
sun.ShadowCascadeCount = 3; // Between 1 and 4
// Keep cascades stable, and fade shadows out smoothly
sun.CascadeFitMode = DirectionalLight.CascadeFitModes.Stable;
sun.ShadowFadeFraction = 0.1f;
sun.CascadeBlendFraction = 0.1f;
// Bias is measured in shadow map texels
sun.ShadowDepthBias = 1;
sun.ShadowNormalBias = 1;
Cela active un soleil projetant des ombres avec trois cascades stables, un fondu progressif entre elles et un léger estompage à la distance d’ombre. Si vous voyez de l’acné, augmentez légèrement les bias. Si les ombres semblent détachées des objets qui les projettent, diminuez-les.
Migration depuis la version précédente
Quelques changements concernent les projets existants :
ShadowBiasest désormais obsolète et ignoré. UtilisezShadowDepthBiasetShadowNormalBias. Ces propriétés sont exprimées en texels : les anciennes valeurs ne peuvent donc pas être reprises telles quelles.- Si vous avez des shaders personnalisés qui appellent
DirectionalLightShadow,PointLightShadowouSpotLightShadow, ces fonctions prennent désormais la normale géométrique au lieu deNoL. - Si un shader personnalisé lit
LightProperties.CascadeSplits, notez qu’il s’agit désormais d’unfloat4de limites de cascades. La première valeur indique où commencent les ombres, et les trois suivantes où se terminent les trois premières cascades.
Essayez-le et donnez-nous votre avis
Prêt à doter vos scènes d’ombres plus stables et plus propres ? Mettez à jour Evergine, ouvrez une scène avec une lumière directionnelle et essayez les nouvelles options.
- Consultez la documentation d’Evergine pour la référence complète sur les lumières et les ombres.
- Explorez les exemples Evergine pour voir les lumières et les ombres dans des scènes réelles.
- Vous avez trouvé un problème ou vous avez une idée ? Faites-le-nous savoir dans le dépôt de feedback d’Evergine.
Nous serions ravis d’avoir votre avis.
