Bonjour !
Dans la leçon précédente, vous avez appris à mettre en place une technique d'éclairage professionnelle à trois points. Vous savez maintenant comment utiliser la lumière pour sculpter un objet, révéler sa forme et le détacher de l'arrière-plan. La Key Light que vous avez configurée projetait une ombre, mais nous n'avions pas encore abordé la question de sa qualité.
Aujourd'hui, nous allons nous concentrer sur ce dernier aspect crucial. L'objectif de cette leçon est de vous apprendre à ajuster la résolution de la carte d'ombres (shadow map) pour trouver l'équilibre parfait entre qualité visuelle et performance. Une ombre nette et précise peut rendre une scène très réaliste, mais à quel prix pour la fluidité de l'animation ? C'est ce que nous allons découvrir.
C'est la dernière étape de notre module sur l'éclairage et les ombres. Une fois cette compétence acquise, vous aurez une maîtrise complète des bases de l'éclairage dans Three.js.
Qu'est-ce qu'une Carte d'Ombres (Shadow Map) ?
Pour comprendre comment ajuster la qualité d'une ombre, il faut d'abord savoir comment Three.js la calcule. Le processus, appelé shadow mapping, se déroule en coulisses :
- Le point de vue de la lumière : Pour chaque source lumineuse qui projette une ombre (
light.castShadow = true), Three.js place une caméra virtuelle à la position de cette lumière. - Rendu de la profondeur : Depuis ce point de vue, le moteur de rendu ne dessine pas les couleurs, mais la distance (la profondeur) de chaque objet qu'il "voit". Il crée ainsi une image en niveaux de gris où les pixels les plus clairs sont les objets les plus proches de la lumière, et les plus sombres sont les plus lointains. Cette image est la carte d'ombres ou
shadow map. - Projection de l'ombre : Lors du rendu final de la scène depuis le point de vue de votre caméra principale, pour chaque pixel à l'écran, Three.js vérifie si ce point est "visible" depuis la lumière en le comparant à la carte d'ombres. S'il est plus loin que la valeur stockée dans la carte, il est considéré comme étant dans l'ombre et est dessiné plus sombre.
La qualité de l'ombre dépend donc directement de la résolution de cette texture (la carte d'ombres). Une résolution faible produit une ombre pixelisée, tandis qu'une résolution élevée produit une ombre aux bords nets et précis.
L'image ci-dessous illustre parfaitement cet effet.

Ajuster la Résolution en Pratique
Dans Three.js, la résolution de la carte d'ombres se contrôle via la propriété mapSize de l'objet shadow d'une lumière.
Pour un tutoriel en français qui met cela en contexte, je vous invite à lire un court extrait de l'article suivant. Il aborde la mise en place d'une lumière qui projette une ombre et explique précisément le rôle de shadow.mapSize.
Tutoriel Three.js. Intégrez un modèle 3D dans votre site…
Cet article de Florian Gouloubi explique comment intégrer un modèle 3D et l'éclairer. La section qui nous intéresse porte sur la configuration des ombres d'une PointLight.
Lisez la section intitulée « Le code de la point light 2 est plus long que les autres... ». Concentrez-vous sur l'explication de la ligne pointLight.shadow.mapSize = new THREE.Vector2(1024, 1024);. L'auteur y explique très bien le compromis entre qualité et performance.
Comme vous l'avez lu, light.shadow.mapSize est un THREE.Vector2 qui attend une largeur (width) et une hauteur (height). Ces valeurs sont généralement des puissances de 2 (par ex. 256, 512, 1024, 2048). Par défaut, la résolution est de 512x512.
// Exemple pour une DirectionalLight
const directionalLight = new THREE.DirectionalLight(0xffffff, 1.0);
// La lumière doit projeter des ombres
directionalLight.castShadow = true;
// On règle la résolution de sa carte d'ombres
directionalLight.shadow.mapSize.width = 1024;
directionalLight.shadow.mapSize.height = 1024;
Atelier : Trouver le Bon Équilibre
Reprenons le code de la leçon précédente sur l'éclairage à trois points. Dans cet exercice, seule la keyLight projetait une ombre. Nous allons maintenant jouer avec sa résolution pour voir l'impact direct sur la qualité visuelle.
-
Repartez de votre code final de la leçon précédente (avec le
TorusKnotet les trois lumières). -
Juste après avoir défini
keyLight.castShadow = true;, ajoutez les lignes pour modifier la résolution de sa carte d'ombres. -
Test 1 : Qualité minimale. Réglez la résolution à une valeur très basse pour bien voir la pixellisation.
keyLight.shadow.mapSize.width = 128; keyLight.shadow.mapSize.height = 128;Lancez votre projet. L'ombre sous le nœud doit apparaître très "en escalier" (blocky).
-
Test 2 : Qualité standard/élevée. Augmentez maintenant la résolution.
keyLight.shadow.mapSize.width = 2048; keyLight.shadow.mapSize.height = 2048;Actualisez la page. L'ombre devrait être beaucoup plus nette et précise.
Prenez quelques minutes pour tester différentes valeurs (256, 512, 1024...). Vous verrez que le gain de qualité devient de moins en moins perceptible au-delà d'un certain seuil, alors que le coût en performance, lui, continue de grimper.
Le Coût de la Performance
Pourquoi ne pas toujours utiliser la résolution maximale, comme 4096x4096 ?
Chaque carte d'ombres est une texture que votre carte graphique (GPU) doit générer et stocker en mémoire à chaque frame.
- Plus la résolution est élevée, plus le calcul est long. Un rendu de 4096x4096 pixels est 16 fois plus lourd qu'un rendu de 1024x1024 pixels.
- Chaque lumière qui projette une ombre a sa propre carte. Si vous avez 3 lumières avec des ombres en haute résolution, l'impact sur les performances peut être considérable et faire chuter votre framerate (la fluidité de l'animation).
Le but est donc de trouver la résolution la plus basse acceptable pour votre scène. Pour un showcase de produit où la caméra est proche, une résolution de 1024 ou 2048 peut être justifiée. Pour une vue d'ensemble avec des ombres distantes, 512 peut être largement suffisant.
La courte vidéo ci-dessous montre dynamiquement l'activation des ombres et l'augmentation de la résolution.
Three.js Realistic Lighting Setup Tutorial
Cette vidéo du tutoriel de Red Stapler montre comment mettre en place un éclairage réaliste. La partie qui nous intéresse est celle où il corrige la qualité des ombres.
Regardez de 08:59 à 09:13. L'auteur augmente la résolution de la mapSize pour corriger une ombre de mauvaise qualité. C'est une excellente démonstration visuelle de ce que vous venez de faire.
Aller un peu plus loin : shadow.bias
Parfois, même avec une bonne résolution, vous pouvez voir des artefacts étranges, comme des motifs sombres sur les surfaces qui devraient être éclairées. C'est un problème courant appelé shadow acne (acné d'ombre).
Cela se produit à cause d'erreurs de précision lorsque Three.js compare un point à sa propre ombre dans la carte. Pour corriger cela, on utilise la propriété shadow.bias. C'est une toute petite valeur qui "décale" la profondeur de l'ombre pour éviter l'auto-ombrage.
// Un bias négatif rapproche l'ombre de l'objet.
// Une valeur entre -0.001 et -0.005 est souvent un bon point de départ.
directionalLight.shadow.bias = -0.002;
Ajuster cette valeur demande un peu de tâtonnement, mais c'est un outil très utile à connaître pour peaufiner vos ombres.
Conclusion
Félicitations ! Vous avez complété le module sur l'éclairage et les ombres. Vous êtes maintenant capable non seulement de créer des éclairages complexes et artistiques, mais aussi de maîtriser la qualité et la performance des ombres qui en résultent.
Points clés à retenir :
- La qualité des ombres dépend de la résolution de la carte d'ombres (
shadow map). - On ajuste cette résolution via
light.shadow.mapSize.widthetlight.shadow.mapSize.height. Les valeurs sont généralement des puissances de 2. - Qualité vs. Performance : Une résolution plus élevée donne des ombres plus nettes mais consomme beaucoup plus de ressources GPU. Votre travail consiste à trouver le meilleur compromis.
- La propriété
light.shadow.biaspermet de corriger des artefacts visuels comme le shadow acne.
Aperçu de la prochaine leçon :
Maintenant que nos objets sont bien formés, bien éclairés et projettent de belles ombres, il leur manque encore un élément essentiel pour être réalistes : la texture. Dans le prochain module, nous verrons comment charger et appliquer des textures d'image pour donner à nos modèles l'apparence de matériaux réels comme le bois, le métal ou la pierre. Ce sera un grand pas vers la création de scènes photoréalistes