Bonjour ! Dans la leçon précédente, nous avons considérablement amélioré le réalisme de nos objets en utilisant un ensemble de textures PBR : la normalMap pour le relief, la roughnessMap pour la brillance, et l' aoMap pour les ombres de contact.
Vous avez sûrement remarqué que si vous réglez un matériau pour qu'il soit très réfléchissant (faible roughness), les reflets sont noirs ou inexistants. C'est normal : nos lumières actuelles sont de simples points dans l'espace, il n'y a pas d'environnement à refléter.
Aujourd'hui, nous allons résoudre ce problème et faire un saut qualitatif majeur. L'objectif est d'apprendre à mettre en place un éclairage basé sur l'image (IBL) en chargeant un environnement HDRI. Cette technique est la clé pour obtenir des éclairages et des reflets ultra-réalistes, donnant l'impression que vos objets 3D sont véritablement intégrés dans un monde réel.
Qu'est-ce que l'éclairage basé sur l'image (IBL) ?
L'IBL est une technique de rendu où l'on utilise une image à 360° pour éclairer la scène. Au lieu de placer manuellement plusieurs sources de lumière, on "enveloppe" notre scène dans une photo d'un environnement réel. Cette photo, appelée HDRI, fournit non seulement l'éclairage ambiant global, mais aussi des reflets précis et détaillés pour tous les objets brillants ou métalliques.
Regardez l'image ci-dessous. La même scène intérieure est rendue trois fois, mais éclairée uniquement par trois images d'environnement différentes. Remarquez comment l'ambiance, la couleur de la lumière et les ombres changent radicalement.

Pour utiliser cette technique, nous devons comprendre quelques concepts techniques.
Les fondations : HDR, Tone Mapping et Gamma
Les images HDRI (High Dynamic Range Image) ne sont pas des images classiques comme les JPEG. Elles contiennent une quantité d'informations lumineuses bien plus grande, capturant à la fois les zones les plus sombres d'une scène et les sources de lumière les plus intenses (comme le soleil).
Pour que le moteur 3D puisse utiliser correctement ces informations et les afficher sur nos écrans standards (qui sont LDR, Low Dynamic Range), plusieurs processus sont nécessaires.
La vidéo suivante explique très bien ces concepts. Ne vous inquiétez pas si tout n'est pas clair à 100% immédiatement, l'important est de saisir l'idée générale.
How To Create Realistic Scenes In Three.js - Tone Mapping, HDR, Gamma Correction, sRGB Color Space
Pour comprendre pourquoi nous devons configurer notre renderer d'une manière spécifique, cette vidéo explique les concepts de plage dynamique (HDR), de tone mapping et de correction gamma. C'est la théorie nécessaire pour la pratique qui suit.
Regardez la première partie de la vidéo, de 00:23 à 06:19. Concentrez-vous sur les points suivants : Dynamic Range / HDR : La capacité à capturer les détails dans les zones très sombres et très claires. Tone Mapping : Le processus qui "compresse" une image HDR pour qu'elle soit visible sur un écran standard tout en préservant les détails. Gamma Correction / sRGB : L'idée que les images HDR sont "linéaires" et que nous devons dire à Three.js de gérer la conversion vers l'espace de couleur de notre écran (sRGB) pour un affichage correct.
En résumé :
- On charge une image HDRI qui contient des données d'éclairage très riches.
- On demande au renderer de faire du Tone Mapping pour adapter ces données à notre écran.
- On s'assure que le renderer effectue la bonne correction gamma (
sRGB) pour que les couleurs soient justes.
Atelier : Intégrer un environnement HDRI dans Three.js
Passons à la pratique. Nous allons charger une image HDRI et l'utiliser pour éclairer notre scène.
1. Trouver une image HDRI
Des sites comme Poly Haven offrent une immense collection d'images HDRI gratuites. Pour cet atelier, téléchargez un environnement qui vous plaît, par exemple kloofendal_48d_partly_cloudy_puresky. Choisissez la résolution 1K et le format .hdr.
Placez le fichier .hdr téléchargé dans votre dossier public/.
2. Mettre en place le code
Le processus en Three.js se déroule en plusieurs étapes clés que la vidéo suivante illustre parfaitement.
How To Create Realistic Scenes In Three.js - Tone Mapping, HDR, Gamma Correction, sRGB Color Space
Maintenant que nous avons la théorie, regardons comment charger et appliquer l'HDRI en pratique avec Three.js. Cette vidéo montre le processus de A à Z.
Regardez les séquences de 07:25 à 14:56. Suivez les étapes de l'auteur : Chargement (07:25 - 09:09) : Notez l'utilisation de RGBELoader (spécifique aux .hdr) et la configuration de texture.mapping pour projeter correctement l'image à 360°. Configuration du renderer (09:09 - 11:21) : C'est ici que l'on applique la théorie ! Observez comment il configure la correction de couleur et le tone mapping pour que l'image s'affiche correctement. Application à un objet (11:21 - 14:56) : C'est le cœur de l'IBL. Voyez comment il assigne l'HDRI à la propriété environment de la scène pour que les objets MeshStandardMaterial reçoivent la lumière et les reflets de l'environnement.
Voici le code complet que vous pouvez adapter, en intégrant ce que nous venons de voir.
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
// Le RGBELoader n'est pas dans le noyau de Three.js, il faut l'importer séparément
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';
// ... setup initial de la scène, caméra, renderer, contrôles ...
// Assurez-vous que votre renderer est créé comme ceci :
const renderer = new THREE.WebGLRenderer({ antialias: true });
// ...
// --- CONFIGURATION DU RENDU POUR L'HDRI ---
// 1. Appliquer le tone mapping
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 1; // Ajustez cette valeur pour éclaircir/assombrir
// 2. Définir l'espace de couleur de sortie (très important !)
// L'ancienne syntaxe était `renderer.outputEncoding = THREE.sRGBEncoding;`
renderer.outputColorSpace = THREE.SRGBColorSpace;
// --- CHARGEMENT DE L'HDRI ---
const rgbeLoader = new RGBELoader();
rgbeLoader.load('/kloofendal_48d_partly_cloudy_puresky_1k.hdr', (environmentMap) => {
// 3. Configurer le mappage de la texture
environmentMap.mapping = THREE.EquirectangularReflectionMapping;
// 4. Appliquer l'environnement à la scène
scene.background = environmentMap; // En tant que fond visible
scene.environment = environmentMap; // En tant que source de lumière et de reflets
});
// --- AJOUT D'UN OBJET POUR TESTER LES REFLETS ---
const sphere = new THREE.Mesh(
new THREE.SphereGeometry(1, 32, 32),
new THREE.MeshStandardMaterial({
roughness: 0, // Très lisse pour des reflets nets
metalness: 1.0 // Très métallique
})
);
scene.add(sphere);
// ... boucle d'animation ...
Lancez ce code. Vous devriez voir votre sphère parfaitement réfléchissante refléter le ciel et le paysage de l'image HDRI. Essayez de jouer avec les valeurs de roughness et metalness pour voir comment les reflets changent. C'est l'effet de l'IBL !

Astuce : Orienter l'environnement
Parfois, l'orientation de l'HDRI n'est pas celle que vous souhaitez (le soleil n'est pas au bon endroit, par exemple). Vous pouvez facilement faire pivoter l'environnement.
Une question pratique fréquente est : "Comment faire pivoter mon HDRI ?". Cette discussion sur Stack Overflow donne la solution moderne et simple.
Lisez la réponse acceptée. Elle explique qu'avec les versions récentes de Three.js, on peut utiliser les propriétés scene.backgroundRotation et scene.environmentRotation pour contrôler l'orientation. La rotation est définie en radians.
Pour appliquer une rotation de 90 degrés sur l'axe Y, vous ajouteriez simplement ceci à votre code, après avoir défini scene.environment :
// Rotation de 90 degrés sur l'axe Y
scene.environment.rotation.y = Math.PI / 2;
scene.background.rotation.y = Math.PI / 2;
Et dans React Three Fiber ?
Votre objectif final est R3F, et vous serez heureux d'apprendre que tout ce processus est incroyablement simplifié grâce à la librairie drei.
Tout le code de chargement et de configuration que nous avons écrit est remplacé par un seul composant : <Environment />.
La documentation de drei montre à quel point il est simple de mettre en place un IBL avec le composant <Environment />.
Parcourez cette page de documentation. Retenez surtout : La section preset (section 2) : un moyen ultra-rapide de tester des environnements pré-configurés, idéal pour le prototypage. La section files (section 3) : pour charger votre propre fichier .hdr. La prop background (section 1) : un simple booléen pour décider si l'HDRI doit aussi servir de fond visible.
En pratique, dans une application R3F, votre code ressemblerait à ceci :
import { Canvas } from '@react-three/fiber'
import { OrbitControls, Environment } from '@react-three/drei'
function MyScene() {
return (
<Canvas>
{/* Composant pour la sphère */}
<mesh>
<sphereGeometry args={[1, 32, 32]} />
<meshStandardMaterial roughness={0} metalness={1.0} />
</mesh>
{/* Et voici la magie ! */}
<Environment files="/kloofendal_48d_partly_cloudy_puresky_1k.hdr" background />
<OrbitControls />
</Canvas>
)
}
C'est tout ! Le composant <Environment /> gère pour vous le RGBELoader, la configuration du mapping, l'assignation à scene.environment et scene.background, et même la configuration du toneMapping du renderer. Cela démontre la puissance de l'écosystème de React Three Fiber, qui vous permet de vous concentrer sur l'aspect créatif tout en s'appuyant sur les solides fondations de Three.js que vous apprenez.
Conclusion
Félicitations ! Vous venez de débloquer l'une des techniques les plus puissantes pour atteindre le photoréalisme dans vos scènes 3D. Vos objets ne flottent plus dans un vide noir, mais existent dans un environnement crédible qui les éclaire et s'y reflète.
Points clés à retenir :
- L'éclairage basé sur l'image (IBL) utilise une image HDRI pour l'éclairage et les reflets.
- Les images HDRI contiennent plus d'informations lumineuses et nécessitent un
RGBELoader. - Pour un affichage correct, il faut configurer le
toneMappinget l'outputColorSpacedu renderer. scene.backgroundrend l'image en fond,scene.environmentl'utilise pour la lumière et les reflets.- Dans React Three Fiber, le composant
<Environment />dedreiautomatise tout ce processus.
Aperçu de la prochaine leçon :
Nous avons créé un environnement immersif avec une seule image panoramique. Mais que faire si vous disposez de six images distinctes, une pour chaque direction (haut, bas, avant, arrière, gauche, droite) ? Dans la prochaine leçon, nous explorerons une autre méthode pour créer des arrière-plans : la Skybox, en utilisant une CubeTexture. C'est une autre technique fondamentale pour construire vos mondes 3D.