Accueil / Matériaux
Matériaux
Un matériau décrit l'apparence d'une surface : sa couleur, sa brillance, son
métal/rugosité, sa réflexion et sa transparence. Le moteur propose deux modèles d'illumination —
PHONG et PBR — et un jeu commun de champs
sérialisés à l'identique dans les fichiers de scène et dans la bibliothèque personnelle. Tout le
contenu de cette page provient de srcs/common/Material.hpp et de la fonction
SceneParser::parseMaterial.
Modèles d'illumination
Chaque matériau porte un champ model qui sélectionne le modèle d'ombrage. Deux valeurs
sont reconnues par le parseur (la casse est ignorée) ; toute autre valeur lève une erreur de
chargement.
model | Modèle | Quand l'utiliser |
|---|---|---|
"phong" | PHONG (défaut) | Matériaux simples et rapides : plastiques, surfaces mates ou peintes, prototypage. Contrôle direct via base_color, specular et shininess. |
"pbr" | PBR | Rendu physiquement plausible : métaux, diélectriques, vernis, velours. Contrôle via metallic, roughness, ao et les paramètres avancés. |
Le modèle par défaut est PHONG (MaterialModel::PHONG).
Les champs des deux modèles cohabitent dans la même structure Material : un matériau
PBR ignore shininess/specular au rendu, et un matériau PHONG ignore les
paramètres PBR — mais tous les champs restent présents et sérialisés.
{
"name": "Rouge mat",
"model": "phong",
"base_color": [200, 40, 40]
}
Modèle PHONG
Le modèle PHONG combine trois termes classiques. La couleur finale d'un point éclairé est la somme
d'une composante ambiante, d'une composante diffuse (loi de
Lambert, proportionnelle à N·L) et d'une composante spéculaire
(reflet brillant).
| Terme | Champs concernés | Rôle |
|---|---|---|
| Ambiant | base_color, coefficient ambiant de la scène | Éclairage de base uniforme, indépendant des lumières directes. |
| Diffus | base_color | Diffusion mate : dépend de l'angle entre la normale et la lumière. |
| Spéculaire | specular, shininess | Reflet brillant vers l'observateur ; shininess est l'exposant qui resserre la tache (plus grand = tache plus petite et nette). |
Par défaut specular vaut [0,0,0] (pas de reflet) et shininess
vaut 32. Pour un plastique brillant, donnez une couleur spéculaire non nulle (par
exemple un gris clair) et augmentez shininess.
Modèle PBR
Le modèle PBR suit une logique métallique-rugosité : la couleur de base sert d'albédo pour un diélectrique et de couleur de réflexion pour un métal, tandis que la rugosité contrôle la netteté des reflets. Des paramètres avancés ajoutent vernis, velours et transmission.
| Champ | Plage | Rôle |
|---|---|---|
base_color | RGB 0–255 | Albédo (diélectrique) ou couleur du reflet métallique. |
metallic | 0–1 | Caractère métallique : 0 = diélectrique, 1 = métal pur. |
roughness | 0–1 | Rugosité micro-surface : 0 = miroir net, 1 = très diffus. |
ao | 0–1 | Occlusion ambiante : atténue l'éclairage ambiant. |
specular_level | 0–1 | Intensité du reflet spéculaire des diélectriques. |
specular_tint | 0–1 | Teinte le reflet vers la couleur de base plutôt que le blanc. |
clearcoat | 0–1 | Vernis : intensité d'une fine couche claire supplémentaire. |
clearcoat_roughness | 0–1 | Rugosité de la couche de vernis. |
sheen | 0–1 | Effet « velours » sur les bords rasants (tissus). |
sheen_tint | 0–1 | Teinte du velours vers la couleur de base. |
transmission | 0–1 | Part de lumière transmise à travers la surface (matériaux translucides). |
Au rendu PBR, un matériau métallique (metallic proche de 1) réduit sa
composante ambiante diffuse : la couleur provient surtout des reflets. Pensez à fournir de la
géométrie et des lumières autour d'un métal (voir Conseils).
Réflexion et transparence
Quatre champs, communs aux deux modèles, pilotent les rayons secondaires et l'opacité :
| Champ | Plage / type | Rôle |
|---|---|---|
reflectivity | 0–1 | Part de réflexion miroir (rayon réfléchi depuis le point d'impact). |
transparency | 0–1 | Transparence : proportion du rayon transmis à travers la surface. |
ior | nombre (défaut 1.5) | Indice de réfraction : déviation du rayon transmis à l'interface (1.0 = air, ~1.33 = eau, ~1.5 = verre). |
alpha | 0–1 | Opacité globale de la surface (1 = opaque). |
En l'absence de skybox, les surfaces très réfléchissantes ou transparentes peuvent apparaître sombres là où le rayon secondaire ne rencontre aucune géométrie éclairée. Voir la section Conseils.
Tous les champs
Le tableau ci-dessous liste tous les champs de la structure Material,
avec leur nom JSON, leur type, leur plage, leur valeur par défaut réelle et leur rôle. La colonne
« Alias » indique les clés supplémentaires acceptées par le parseur (variantes camelCase).
| Clé JSON | Alias reconnu | Type | Plage | Défaut | Rôle |
|---|---|---|---|---|---|
name | — | chaîne | — | "material" | Nom du matériau (référencé par les objets de la scène). |
model | — | "phong"/"pbr" | — | "phong" | Modèle d'illumination. |
base_color | — | RGB | 0–255 | [229,229,229] | Couleur de base (albédo). |
specular | — | RGB | 0–255 | [0,0,0] | Couleur spéculaire (PHONG). |
shininess | — | nombre | > 0 | 32 | Exposant spéculaire Phong. |
reflectivity | — | nombre | 0–1 | 0 | Part de réflexion miroir. |
transparency | — | nombre | 0–1 | 0 | Transparence. |
ior | — | nombre | ≥ 1 | 1.5 | Indice de réfraction. |
metallic | — | nombre | 0–1 | 0 | Caractère métallique (PBR). |
roughness | — | nombre | 0–1 | 0.5 | Rugosité (PBR). |
ao | — | nombre | 0–1 | 1 | Occlusion ambiante (PBR). |
specular_level | specularLevel | nombre | 0–1 | 0.5 | Niveau spéculaire (PBR). |
specular_tint | specularTint | nombre | 0–1 | 0 | Teinte spéculaire. |
clearcoat | — | nombre | 0–1 | 0 | Intensité du vernis. |
clearcoat_roughness | clearcoatRoughness | nombre | 0–1 | 0.03 | Rugosité du vernis. |
sheen | — | nombre | 0–1 | 0 | Effet velours. |
sheen_tint | sheenTint | nombre | 0–1 | 0.5 | Teinte du velours. |
transmission | — | nombre | 0–1 | 0 | Transmission de la lumière. |
alpha | — | nombre | 0–1 | 1 | Opacité. |
normal_map | — | chemin | — | "" | Chemin d'une carte de normales. |
normal_map_enabled | — | booléen | — | false | Active l'effet de normale (accepte aussi un nombre non nul). |
normal_scale | — | nombre | 0–1 | 1 | Force de l'effet de normale. |
normal_noise_frequency | — | nombre | > 0 | 1 | Fréquence du bruit procédural de normale. |
texture_map | — | chemin | — | "" | Texture de couleur (PNG/JPG) échantillonnée en couleur de base. |
texture_map_enabled | — | booléen | — | false | Active la texture de couleur (accepte aussi un nombre non nul). |
texture_uv_scale | — | nombre | > 0 | 1 | Facteur de répétition (tiling) des UV. |
Les couleurs par défaut sont stockées en flottant dans la structure
(base_color = {0.9, 0.9, 0.9}) mais s'écrivent en entiers RGB sur 0–255 dans le JSON,
d'où [229,229,229]. Les clés inconnues sont simplement ignorées par le parseur.
Textures et cartes de normales
Un matériau peut échantillonner une texture de couleur et appliquer une
perturbation de normale. Les images sont chargées via stb_image
(formats courants : PNG, JPG, etc.), converties en RGB et mises en cache par chemin
(TextureCache), puis échantillonnées en bilinéaire avec répétition (wrap) des UV.
Texture de couleur
Si texture_map_enabled est vrai et texture_map non vide, la couleur de
base du point est lue dans la texture aux coordonnées uv de l'impact, multipliées par
texture_uv_scale (facteur de tiling). Augmenter texture_uv_scale répète
le motif plus souvent sur la surface.
{
"name": "Sol carrelé",
"model": "pbr",
"roughness": 0.7,
"texture_map": "tests/textures/tiles.png",
"texture_map_enabled": true,
"texture_uv_scale": 4.0
}
Cartes de normales
Le champ normal_map stocke un chemin, et normal_map_enabled active
l'effet. Le moteur applique une perturbation procédurale de la normale à base de
bruit de Perlin lorsque l'effet est activé et qu'aucun chemin d'image n'est fourni :
normal_noise_frequency règle l'échelle du relief et normal_scale (borné à
0–1) son intensité de mélange avec la normale géométrique.
Le chemin normal_map et l'état normal_map_enabled sont
conservés et sérialisés à l'identique, mais l'application procédurale du relief dans le
noyau de rendu s'active quand normal_map_enabled est vrai et que normal_map
est vide (bruit de Perlin). La texture de couleur, elle, est bien échantillonnée depuis le fichier
texture_map.
Bibliothèque de matériaux
Les matériaux peuvent être enregistrés dans une bibliothèque personnelle
(MaterialLibrary) située dans ~/.raytracer/materials/. Chaque matériau y
est stocké dans un fichier <nom>.json. Le nom est assaini pour former le
nom de fichier : tout caractère non alphanumérique (hors - et _) devient
_, et un nom vide devient material.
| Opération | Effet |
|---|---|
directory() | Renvoie (et crée au besoin) ~/.raytracer/materials ; vide si HOME est indéfini. |
save(material) | Écrit <nom-assaini>.json (JSON indenté sur 4 espaces). |
remove(name) | Supprime le fichier correspondant. |
loadAll() | Charge tous les .json du dossier et les trie par nom ; les fichiers invalides sont ignorés. |
La sérialisation (MaterialLibrary::toJson / fromJson) est
partagée avec le chargeur/sauveur de scène : un matériau fait un aller-retour
identique qu'il vive dans la bibliothèque ou qu'il soit intégré dans un fichier de scène. Les
couleurs (base_color, specular) sont écrites en entiers RGB
[r,g,b] sur 0–255.
Marché de matériaux
L'interface graphique propose une fenêtre Material Market
(MarketWindow) avec deux onglets :
| Onglet | Source | Fonctionnement |
|---|---|---|
| Local | Bibliothèque ~/.raytracer/materials | Liste les matériaux enregistrés (via loadAll()), avec recherche par nom, aperçu détaillé et bouton Add pour les injecter dans la scène courante. |
| Online | Catalogue Poly Haven (CC0) | Récupère la liste des textures depuis api.polyhaven.com (via curl), affiche vignettes, auteur, catégories et résolution. Add télécharge la texture diffuse dans ~/.raytracer/textures et crée un matériau PBR l'utilisant en texture_map. |
Les matériaux ajoutés depuis l'onglet Online sont créés en modèle
PBR (rugosité ≈ 0.6, non métallique), leur couleur de base initialisée à la couleur
moyenne de la vignette, puis enregistrés dans la bibliothèque locale. L'onglet en ligne nécessite
une connexion et l'outil curl.
Exemples
Trois matériaux typiques, dans le format accepté par le parseur de scène et la bibliothèque.
Plastique mat (PHONG)
{
"name": "Plastique rouge",
"model": "phong",
"base_color": [200, 40, 40],
"specular": [60, 60, 60],
"shininess": 24.0,
"reflectivity": 0.05
}
Métal brossé (PBR)
{
"name": "Métal doré",
"model": "pbr",
"base_color": [212, 175, 55],
"metallic": 1.0,
"roughness": 0.25,
"ao": 1.0,
"specular_level": 0.5,
"reflectivity": 0.4
}
Verre transparent (PBR)
{
"name": "Verre",
"model": "pbr",
"base_color": [230, 240, 245],
"roughness": 0.02,
"transparency": 0.9,
"transmission": 1.0,
"ior": 1.5,
"reflectivity": 0.1,
"alpha": 0.2
}
Conseils
Le moteur ne dispose pas de skybox : un rayon secondaire (réflexion ou réfraction) qui part vers le vide ne rapporte aucune lumière. Les métaux et les verres apparaissent alors sombres. Quelques réflexes :
- Entourez les surfaces réfléchissantes/transparentes de géométrie éclairée (sol, murs, autres objets) pour que les reflets et la réfraction captent quelque chose.
- Ajoutez des lumières visibles depuis ces surfaces (voir Lumières).
- Si un métal ou un verre reste trop sombre, réduisez
reflectivityettransparencyet augmentez la part diffuse (base_colorplus clair,metallicplus bas) pour garder une surface lisible. - Pour un reflet net, gardez
roughnessfaible (PBR) oushininessélevé (PHONG) ; pour un aspect satiné, augmentez progressivementroughness.