Une scène 3D interactive représentant la surface d'une mer agitée, et réagissant à une source de lumière, réalisée avec Three.js et des shaders GLSL personnalisés. Projet inspiré du parcours Three.js Journey par Bruno Simon.
Rendu avec lumière
Rendu sans lumière
- Surface d’eau animée entièrement calculée côté GPU avec grandes vagues sinusoïdales et petites vagues procédurales (via bruit de Perlin)
- Normales reconstruites dans le vertex shader pour générer un éclairage sur la surface
- Contrôle en temps réel via
lil-guipour ajuster les vagues, les couleurs et les paramètres de lumière - Couleurs de surface et de profondeur configurables, avec contrôle du mélange entre les deux
- Système d’éclairage paramétable dans le shader avec couleur, intensité, spéculaire et atténuation
- Caméra libre (OrbitControls)
- Option pour geler le temps
-
Cloner le dépôt :
git clone https://github.com/Rekuiem84/raging-sea cd raging-sea -
Installer les dépendances :
npm install
-
Lancer le serveur de développement :
npm run dev
-
Build pour la production :
npm run build
Les fichiers optimisés seront générés dans le dossier dist/.
├── src/
│ ├── script.js
│ └── shaders/
│ ├── includes/
│ │ ├── ambientLight.glsl
│ │ ├── directionalLight.glsl
│ │ ├── perlinClassic3D.glsl
│ │ └── pointLight.glsl
│ └── water/
│ ├── fragment.glsl
│ └── vertex.glsl
Big Waves Elevation: amplitude globale des grandes vaguesBig Waves Frequency X/Big Waves Frequency Y: fréquence des vagues sur les axes X et ZBig Waves Speed: vitesse de déplacement des grandes vagues
Small Waves Elevation: intensité des petites ondulations procéduralesSmall Waves Frequency: fréquence du bruit appliqué à la surfaceSmall Waves Speed: vitesse de variation du bruitSmall Waves Iterations: nombre d’itérations utilisées pour cumuler les détails fins
Color Offset: décalage utilisé pour calculer le mélange entre profondeur et surfaceColor Multiplier: intensité du mélange des couleurssurfaceColor: couleur de surface de l’eaudepthColor: couleur de profondeur
Shift: distance utilisée pour recalculer les normales entre deux points dans le vertex shaderShow Light: active ou désactive l’éclairage dans le shaderLight Color: couleur de la lumièreLight Intensity: intensité de la lumièreLight Specular: force du reflet spéculaireLight Decay: distance d'atténuation appliquée à la lumière
Freeze Time: met l’animation en pause tout en conservant l’état courant de la scène
- Déforme la géométrie selon les grandes et petites vagues
- Recalcule les normales à partir de deux échantillons décalés (
Shift) pour alimenter l’éclairage - Transmet au fragment shader la position, la normale et l’élévation du sommet
- Mélange les couleurs
uDepthColoretuSurfaceColorselon l’élévation - Calcule l’éclairage de la surface avec un modèle personnalisé incluant couleur, intensité, spéculaire et decay
perlinClassic3D.glsl: bruit de Perlin 3D utilisé pour les petites vaguespointLight.glsl: fonction de lumière ponctuelle utilisée par le fragment shaderambientLight.glsletdirectionalLight.glsl: inclusions disponibles pour faire évoluer le système d’éclairage
- Repo Three.js Journey principal — pour retrouver tous mes projets suivant ce parcours

