Mappage des ombres
Introduction
Le shadow mapping est une technique couramment utilisée pour générer des ombres en temps réel dans une scène 3D. Elle consiste à rendre une texture de carte de profondeur du point de vue de la source lumineuse. Ensuite, lors du rendu d’un pixel d’un modèle 3D, sa valeur de profondeur est comparée à celle de la carte de profondeur : le pixel est rendu plus sombre s’il est dans l’ombre, ou plus clair s’il est éclairé par la source lumineuse.
Les ombres renforcent le réalisme perceptuel d’une scène et facilitent l’évaluation des positions relatives des objets.

Remarquez comment, dans la scène de gauche de l'image, il est impossible de déterminer à quelle distance du plan se trouvent les objets, alors que dans la scène de droite, les ombres facilitent cette estimation.
Qt prend en charge le shadow mapping pour nos trois types de lumières : DirectionalLight, PointLight et SpotLight. Pour activer les ombres dans votre scène, vous devez d’abord configurer la lumière pour qu’elle projette des ombres en définissant « castsShadow » sur « true ». Vous pouvez ensuite contrôler quels modèles projettent et reçoivent des ombres en définissant « castsShadows » et « receivesShadows » respectivement sur « true » ou « false ».
Lumières directionnelles
La lumière directionnelle émet de la lumière dans une seule direction à partir d’une source non identifiable située à une distance infinie. Ce phénomène est similaire au fonctionnement de la lumière du soleil dans la réalité. Une lumière directionnelle a une portée infinie et ne s’affaiblit pas.
Cartes d’ombres en cascade
L’un des problèmes des cartes d’ombres en cascade ( DirectionalLight, CSM) est qu’elles effectuent le rendu de toute la scène du point de vue de la source lumineuse. Cela peut entraîner des ombres de forme anguleuse lorsque la taille de la carte d’ombres n’est pas suffisante. Une option permettant d’obtenir une meilleure qualité de rendu consiste à utiliser des cartes d’ombres en cascade (Cascaded Shadow Maps, CSM). Qt prend en charge une version des CSM appelée « Parallell Split Shadow Maps » (PSSM). Le PSSM fonctionne en divisant le cône de vision en plusieurs parties et en rendant une shadowmap pour chacune d’entre elles.

Cette illustration présente une représentation abstraite d’un cône de vision divisé selon le principe des PSSM. Elle comporte deux divisions qui aboutissent à trois cascades.
De cette manière, il est possible d’obtenir une meilleure résolution de la carte d’ombres à proximité de la caméra, là où la qualité visuelle est la plus perceptible, et une résolution plus faible plus loin de la caméra, là où la qualité visuelle est moins perceptible.

L'image ci-dessus montre une shadowmap sans aucune division (à gauche) et une shadowmap avec 3 divisions (à droite).
Vous pouvez contrôler le nombre de divisions en cascades à l’aide de la propriété ` csmNumSplits ` et déterminer l’emplacement des divisions à l’aide des propriétés ` csmSplit1`, ` csmSplit2 ` et ` csmSplit3 `. Pour obtenir des transitions harmonieuses entre les divisions, vous pouvez définir un niveau de fondu entre celles-ci à l’aide de la propriété ` csmBlendRatio `.

L'image ci-dessus montre un agrandissement d'une jonction en cascade sans fusion activée.
Gardez à l'esprit que chaque fraction que vous ajoutez oblige l'application à générer une nouvelle carte d'ombres, ce qui aura un impact négatif sur les performances. La taille de la zone de fondu influe également sur les performances ; veillez donc à la réduire au minimum.
Lumière ponctuelle
L’ PointLight peut être décrite comme une sphère émettant de la lumière avec une intensité égale dans toutes les directions, depuis le centre de la source jusqu’à un rayon donné. Ce principe est similaire à la façon dont une ampoule émet de la lumière.

L'PointLight e rend sa shadowmap sous forme de cubemap, ce qui implique six passes de rendu. Ce processus peut s'avérer très gourmand en ressources de calcul.
Spot Light
L’ SpotLight émet de la lumière dans une seule direction, sous la forme d’un cône défini par la propriété « coneAngle ». L’intensité lumineuse diminue à mesure que l’on s’approche de l’ coneAngle. L’angle à partir duquel l’intensité lumineuse commence à diminuer est défini par « innerConeAngle ». Ce principe est similaire à celui d’une lampe torche ou d’un projecteur.

Contrairement à l’ PointLight, l’ SpotLight rend sa shadowmap dans une seule carte de profondeur.
Performances et ajustements de la scène
Bien que Qt s'efforce de fournir des valeurs par défaut raisonnables pour les propriétés liées au shadowmapping, il est généralement nécessaire de les ajuster pour les adapter à une scène spécifique. C'est particulièrement le cas si votre scène est nettement plus petite ou plus grande que prévu. La section suivante explique plus en détail comment ajuster ces valeurs pour obtenir un rendu optimal de la carte d’ombres tout en conservant les meilleures performances possibles.
Le « shadow bias »
Shadow bias est un moyen de supprimer ce qu’on appelle les « shadow acne », ces fausses ombres qui apparaissent généralement selon certains motifs. Le décalage d’ombre décale la texture de profondeur de la carte d’ombres de manière à ce que les ombres apparaissent plus loin de l’objet projetant l’ombre, ce qui permet souvent de corriger les « shadow acne ». L’inconvénient est que si le biais d’ombre est trop important, on peut obtenir un effet appelé « peter panning », où l’ombre est trop éloignée de l’objet qui la projette. Il est également possible de réduire l’acné d’ombre en augmentant la résolution de la carte d’ombres.

L’image ci-dessus montre une scène avec un « shadow bias » de 0 (à gauche) et de 10 (à droite). La scène de gauche présente de fausses ombres au sommet des cônes et des cylindres.
Résolution de la shadowmap
La résolution/qualité de la shadowmap est contrôlée par la propriété « shadowMapQuality ». Une qualité de shadowmap plus élevée réduit l’aspect pixélisé des ombres, mais le rendu est plus coûteux ; il convient donc de la régler au niveau le plus bas possible tout en conservant la qualité visuelle requise.

L’image ci-dessus montre une scène avec une faible résolution de la shadowmap par rapport à une scène avec une haute résolution de la shadowmap.
Qualité des ombres douces
Les ombres douces permettent de reproduire l’aspect des ombres dans la réalité, où elles s’estompent progressivement, passant d’un contour net à un contour flou. La qualité des ombres douces est contrôlée par la propriété ` softShadowQuality `. Elle prend en charge aussi bien les ombres dures sans adoucissement que les ombres douces avec filtrage par proximité en pourcentage (PCF) de qualité variable. Les ombres nettes sont les plus rapides à rendre, tandis que le PCF devient de plus en plus gourmand en ressources à mesure que la qualité augmente. Pour contrôler le rayon de l’ombre douce, utilisez la propriété « pcfFactor ». La valeur de « pcfFactor » n’a pas d’impact sur la vitesse de rendu, mais plus elle est élevée, plus la qualité de l’ombre douce doit être bonne pour un rendu satisfaisant.

L’image ci-dessus montre, à gauche, une scène avec une ombre « softShadowQuality » ( Light.Hard ) et, à droite, une scène avec une ombre « softShadowQuality » ( Light.PCF32 ) et une ombre « pcfFactor » ( 10 ).
Distance maximale de la carte d’ombres
La propriété shadowMapFar permet de contrôler la distance maximale de la carte d’ombres. Son fonctionnement diffère légèrement selon qu’il s’agit de PointLight et SpotLight ou de DirectionalLight.
Pour PointLight/SpotLight, elle détermine la taille du cadre englobant de l’ombre rendue, tandis que pour DirectionalLight, elle définit la distance à laquelle la carte d’ombres doit s’étendre par rapport à la caméra de la scène.

L’image ci-dessus montre la même scène avec la même lumière directionnelle, mais deux valeurs différentes pour « shadowMapFar ».
Profondeur de bits de la shadowmap
Dans certains cas, une scène très vaste peut amener la carte d’ombres à couvrir une grande zone sur son axe de profondeur. Par exemple, si de nombreux objets éloignés de la vue de la caméra projettent tout de même des ombres et doivent être inclus dans les limites de la carte d’ombres. Dans ce cas, il peut arriver que, même avec une valeur plus élevée pour « shadowBias », la scène présente encore des artefacts de bandes. Une solution consiste à utiliser une profondeur de 32 bits sur la shadow map. Définir la propriété « use32BitShadowmap » sur « true » activera cette option pour la lumière en question.

L’image ci-dessus montre la même scène avec la même lumière directionnelle, mais l’une utilise une shadowmap de 32 bits et l’autre une shadowmap de 16 bits.
Voir également « Utilisation de l’éclairage basé sur des images », « Lightmaps et éclairage global », et « Qt Quick 3D - Exemple de shadowmaps en cascade ».
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.