Raytracer docs 🌐 EN

Accueil / Utilisation

Utilisation

Lancer le programme, comprendre les options de la ligne de commande, le mode de rendu headless et le format complet des fichiers de scène JSON.

Ligne de commande

./raytracer [OPTIONS] [FICHIER_SCENE]

Le FICHIER_SCENE est optionnel : sans lui, une scène vierge par défaut est chargée. Les arguments sont analysés par la structure Options (srcs/config/Options.hpp).

OptionDescription
-h, --helpAffiche l’aide d’utilisation et quitte.
-v, --versionAffiche la version (raytracer version 1.0.0) et quitte.
-r, --render [NOM].pngMode headless : rend la scène dans un fichier PNG sans lancer l’interface graphique. Le NOM optionnel doit finir par .png et fixe la sortie (par défaut render.png).
--server [PORT]Lance l’interface et démarre un serveur de cluster. Le PORT optionnel (0–65535) fixe le port d’écoute ; sinon un port automatique est choisi.
--connect IP PORTLance l’interface et rejoint le serveur de cluster à l’adresse IP sur le PORT. Les deux arguments sont obligatoires.

Exclusions mutuelles. --render (headless) ne peut pas être combiné avec --server ni --connect, et --server et --connect ne peuvent pas être utilisés ensemble. Toute option inconnue ou un second argument de scène provoque une erreur.

Exemples de commandes

# Interface graphique sur une scène d'exemple
./raytracer tests/configs/subject.json

# Rendu direct vers un PNG (sans interface)
./raytracer -r output.png tests/configs/subject.json

# Rendu headless avec le nom de sortie par défaut (render.png)
./raytracer --render tests/configs/cube.json

# Interface + serveur de cluster sur le port 8080
./raytracer --server 8080 tests/configs/subject.json

# Interface + connexion à un serveur de cluster
./raytracer --connect 127.0.0.1 8080 tests/configs/subject.json

Mode headless (rendu PNG)

Le mode -r / --render ne charge pas l’interface : il construit la scène, calcule l’image, l’exporte en PNG, puis quitte. Idéal pour les scripts et l’intégration continue.

./raytracer -r sortie.png tests/configs/cube.json
# Sortie console attendue :
#   Loaded 2 renderer plugin(s)
#    - Viewport
#    - Default
#   Finished rendering scene! Saving to file..
#   Render has been saved to file 'sortie.png'

Si aucun nom n’est fourni (ou s’il ne finit pas par .png), la sortie par défaut est render.png.

Format des fichiers de scène

Une scène est un fichier JSON (extension .json obligatoire) lu par SceneParser. Les sections camera et objects sont obligatoires ; environment et materials sont facultatives. Les clés inconnues sont simplement ignorées.

Squelette général

{
  "environment": { "ambient": 0.4, "diffuse": 0.6 },
  "camera": {
    "resolution": [1920, 1080],
    "position":   [0.0, -100.0, 20.0],
    "rotation":   [0.0, 0.0, 0.0],
    "fieldOfView": 72.0,
    "samplesPerPixel": 128
  },
  "objects": [
    { "name": "Sphere A", "type": "sphere", "position": [60, 5, 40], "radius": 25, "material": "Material A" }
  ],
  "materials": [
    { "name": "Material A", "model": "pbr", "base_color": [230, 60, 60], "roughness": 0.5 }
  ]
}

Section environment

Facultative. Contrôle l’éclairage global.

CléTypeDéfautRôle
ambientnombre0.4Coefficient de lumière ambiante global.
diffusenombre0.6Coefficient de contribution diffuse global.

Section camera

Obligatoire. Définit le point de vue et la qualité du rendu.

CléTypeRôle
resolution[largeur, hauteur]Dimensions de l’image en pixels (2 entiers). Obligatoire.
position[x, y, z]Position de la caméra dans le monde. Obligatoire.
rotation[x, y, z]Orientation en angles d’Euler, exprimés en degrés. Obligatoire.
fieldOfViewnombreChamp de vision (degrés). Obligatoire.
samplesPerPixelentier > 0Échantillons par pixel (anti-aliasing / bruit). Défaut : 5. Alias accepté : samples_per_pixel.

Section objects

Obligatoire. Liste des primitives, des lumières et des groupes. Chaque objet possède un type (obligatoire) et un name (facultatif). Les primitives peuvent référencer un material par son nom. Le SceneParser ne lit que les clés pertinentes pour le type ; les clés inconnues sont ignorées. Types disponibles :

typeClés principales
sphereposition, radius, scale, material
planeaxis ("x" / "y" / "z"), position, size, material
cubeposition, rotation, scale, size, material
cylinderposition, rotation, radius, height, material
coneposition, rotation, radius, height, material
trianglevertex0, vertex1, vertex2, material
torusposition, rotation, radius, height, material
tanglecubeposition, rotation, size, threshold, material
fractalposition, size, power, iterations, material
meshfile (.obj) ou vertices / faces / normals, position, rotation, scale, vertex_overrides, material
point_lightposition, color, intensity
directional_lightdirection, color, intensity

Attention : le plan se définit par axis, pas par normal/origin. La clé axis attend une chaîne "x", "y" ou "z". Toute autre clé (comme normal ou origin) est ignorée par le parseur.

Il existe aussi un type group (avec un tableau children et ses propres position/rotation/scale) pour composer des hiérarchies d’objets. Voir la page Fonctionnalités pour le détail de chaque primitive.

Couleurs et vecteurs

  • Un vecteur est un tableau [x, y, z] de 3 nombres (position, rotation en degrés, échelle, direction…).
  • Une couleur est un tableau [r, g, b] de 3 composantes entières comprises entre 0 et 255.

Section materials

Facultative. Chaque matériau porte un name (référencé par les objets via material) et un model ("phong" ou "pbr"). Les champs lus par parseMaterial :

CléTypeDéfautRôle
model"phong" / "pbr"phongModèle d’éclairage du matériau.
base_color[r, g, b][230,230,230]Couleur de base (albédo).
specular[r, g, b][0,0,0]Couleur spéculaire (Phong).
shininessnombre32.0Netteté des reflets spéculaires (Phong).
reflectivitynombre0.0Part de réflexion miroir.
transparencynombre0.0Transparence.
iornombre1.5Indice de réfraction.
metallicnombre 0–10.0Caractère métallique (PBR).
roughnessnombre 0–10.5Rugosité de la surface (PBR).
aonombre 0–11.0Occlusion ambiante.
clearcoatnombre 0–10.0Intensité du vernis (couche claire).
sheennombre 0–10.0Reflet velouté (tissu).
transmissionnombre 0–10.0Transmission de la lumière (verre).
alphanombre 0–11.0Opacité globale.
texture_mapchaîne""Chemin d’une image utilisée comme couleur de base.
texture_map_enabledbooléenfalseActive l’échantillonnage de texture_map.
texture_uv_scalenombre1.0Facteur de répétition des coordonnées UV.
normal_mapchaîne""Chemin d’une carte de normales.
normal_map_enabledbooléenfalseActive la carte de normales.
normal_scalenombre 0–11.0Force de l’effet de la carte de normales.

Champs additionnels reconnus : specular_level, specular_tint, clearcoat_roughness, sheen_tint, normal_noise_frequency. Plusieurs acceptent aussi une variante en camelCase (par ex. clearcoatRoughness, specularLevel).

{
  "name": "GoldMetal",
  "model": "pbr",
  "base_color": [255, 198, 92],
  "metallic": 0.9,
  "roughness": 0.22,
  "clearcoat": 0.0,
  "transmission": 0.0,
  "ior": 1.5
}

Exemple complet commenté

Extrait fidèle de tests/configs/subject.json (deux sphères, un plan et une lumière) :

{
  "environment": { "ambient": 0.4, "diffuse": 0.6 },

  "camera": {
    "resolution": [1920, 1080],      // largeur x hauteur en pixels (obligatoire)
    "position":   [0.0, -100.0, 20.0],
    "rotation":   [0.0, 0.0, 0.0],   // degrés (obligatoire)
    "fieldOfView": 72.0,             // degrés (obligatoire)
    "samplesPerPixel": 128           // anti-aliasing (défaut 5)
  },

  "objects": [
    {
      "name": "Sphere A",
      "type": "sphere",
      "position": [60.0, 5.0, 40.0],
      "radius": 25,
      "material": "Material A"       // référence par nom
    },
    {
      "name": "Plane",
      "type": "plane",
      "axis": "z",                    // "x" | "y" | "z" — PAS "normal"/"origin"
      "position": [0.0, 0.0, -20.0],
      "material": "Material C"
    },
    {
      "name": "Point light",
      "type": "point_light",
      "intensity": 1000000.0,
      "position": [400.0, 100.0, 500.0]
    }
  ],

  "materials": [
    // La clé reconnue est "model" (phong | pbr) ; "base_color" en [r,g,b] 0-255.
    { "name": "Material A", "model": "phong", "base_color": [255, 64, 64] },
    { "name": "Material C", "model": "phong", "base_color": [64, 64, 255] }
  ]
}

Dans le fichier d’origine, les matériaux utilisent une clé type ; or le parseur lit le modèle depuis model. Une clé type pour un matériau est donc ignorée et le modèle retombe sur le défaut phong. Préférez model.

De nombreuses scènes prêtes à l’emploi se trouvent dans tests/configs/ : cube.json, cone.json, torus.json, fractal.json, tanglecube.json, mesh_showcase.json, vertex_edit.json, etc.

Importer un maillage .obj

Un objet de type mesh charge un fichier .obj via la clé file. Les fichiers d’exemple sont dans tests/obj/ (cube.obj, poly.obj, slt.obj).

{
  "name": "Polished Metal",
  "type": "mesh",
  "file": "tests/obj/slt.obj",
  "position": [34.0, 4.0, 6.0],
  "rotation": [0.0, 0.0, -18.0],
  "scale": [110.0, 110.0, 110.0],
  "material": "GoldMetal"
}

Un maillage peut aussi être défini en ligne (sans fichier externe) via vertices, faces et normals, ou porter des modifications de sommets ponctuelles avec vertex_overrides (liste d’entrées { "index": n, "position": [x,y,z] }) — voir Édition de sommets.

Sauvegarde de scène

Depuis l’interface, la scène peut être ré-exportée en JSON : SceneRegister sérialise la caméra (resolution, position, rotation, fieldOfView, samplesPerPixel), les objets (avec leurs transformations locales, et pour les maillages leurs vertices/faces/normals ou vertex_overrides) et les matériaux. Le cycle charger → éditer → sauvegarder → recharger restitue fidèlement la scène.