Raytracer docs 🌐 EN

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.

PHONG / PBR 25 champs Textures & normal maps Bibliothèque ~/.raytracer/materials

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.

modelModèleQuand 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"PBRRendu 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).

TermeChamps concernésRôle
Ambiantbase_color, coefficient ambiant de la scèneÉclairage de base uniforme, indépendant des lumières directes.
Diffusbase_colorDiffusion mate : dépend de l'angle entre la normale et la lumière.
Spéculairespecular, shininessReflet 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.

ChampPlageRôle
base_colorRGB 0–255Albédo (diélectrique) ou couleur du reflet métallique.
metallic0–1Caractère métallique : 0 = diélectrique, 1 = métal pur.
roughness0–1Rugosité micro-surface : 0 = miroir net, 1 = très diffus.
ao0–1Occlusion ambiante : atténue l'éclairage ambiant.
specular_level0–1Intensité du reflet spéculaire des diélectriques.
specular_tint0–1Teinte le reflet vers la couleur de base plutôt que le blanc.
clearcoat0–1Vernis : intensité d'une fine couche claire supplémentaire.
clearcoat_roughness0–1Rugosité de la couche de vernis.
sheen0–1Effet « velours » sur les bords rasants (tissus).
sheen_tint0–1Teinte du velours vers la couleur de base.
transmission0–1Part 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é :

ChampPlage / typeRôle
reflectivity0–1Part de réflexion miroir (rayon réfléchi depuis le point d'impact).
transparency0–1Transparence : proportion du rayon transmis à travers la surface.
iornombre (défaut 1.5)Indice de réfraction : déviation du rayon transmis à l'interface (1.0 = air, ~1.33 = eau, ~1.5 = verre).
alpha0–1Opacité 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é JSONAlias reconnuTypePlageDéfautRôle
namechaî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_colorRGB0–255[229,229,229]Couleur de base (albédo).
specularRGB0–255[0,0,0]Couleur spéculaire (PHONG).
shininessnombre> 032Exposant spéculaire Phong.
reflectivitynombre0–10Part de réflexion miroir.
transparencynombre0–10Transparence.
iornombre≥ 11.5Indice de réfraction.
metallicnombre0–10Caractère métallique (PBR).
roughnessnombre0–10.5Rugosité (PBR).
aonombre0–11Occlusion ambiante (PBR).
specular_levelspecularLevelnombre0–10.5Niveau spéculaire (PBR).
specular_tintspecularTintnombre0–10Teinte spéculaire.
clearcoatnombre0–10Intensité du vernis.
clearcoat_roughnessclearcoatRoughnessnombre0–10.03Rugosité du vernis.
sheennombre0–10Effet velours.
sheen_tintsheenTintnombre0–10.5Teinte du velours.
transmissionnombre0–10Transmission de la lumière.
alphanombre0–11Opacité.
normal_mapchemin""Chemin d'une carte de normales.
normal_map_enabledbooléenfalseActive l'effet de normale (accepte aussi un nombre non nul).
normal_scalenombre0–11Force de l'effet de normale.
normal_noise_frequencynombre> 01Fréquence du bruit procédural de normale.
texture_mapchemin""Texture de couleur (PNG/JPG) échantillonnée en couleur de base.
texture_map_enabledbooléenfalseActive la texture de couleur (accepte aussi un nombre non nul).
texture_uv_scalenombre> 01Facteur 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érationEffet
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 :

OngletSourceFonctionnement
LocalBibliothèque ~/.raytracer/materialsListe 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.
OnlineCatalogue 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 reflectivity et transparency et augmentez la part diffuse (base_color plus clair, metallic plus bas) pour garder une surface lisible.
  • Pour un reflet net, gardez roughness faible (PBR) ou shininess élevé (PHONG) ; pour un aspect satiné, augmentez progressivement roughness.