---
title: La synthese d'images
tags: S8
---
# La synthese d'images
[TOC]
---
## Introduction
[SLIDES](http://jo.fabrizio.free.fr/teaching/synt/isim_introduction.pdf)
### Definitions
Modéliser la forme, l'apparence et les mouvements du monde réel ou d'objets imaginaires avec un ordinateur.
- Informatique graphique 3D
- Modeliser la forme, l'apparence ou le mouvement du monde reel ou imaginaire
- Realite Virtuelle
- Simulation informatique interactive, immersive, visuelle, sonore, ...
### Rendu
Rendu temps reel VS Rendu photorealiste
photorealiste : Modeliser une image comme si on avait prit une photo de la scene en vrai (giga realisme). Le temps importe peu
temps reel : On fait au mieux mais il faut que ca se fasse en 1/30e de sec, 1/60e de sec... Du coup c'est pas le but d'avoir un rendu photorealiste. Beaucoup de triche pour rendre le tout quand meme joli
A l'heure actuelle distinction evidente, mais peut-etre pas plus tard. Ca va tres vite, les GPU sont de plus en plus puissants, meme en entree de gamme
#### Domaines
- Geometrie
- Algorithmique discrete
- Realite Virtuelle
- Interaction
- Perception
- Modelisation
- Rendu
- Animation
- Multimedia
- Image
- Son
- Video
- Informatique
- Parallele
- Temps-reel
- Physique
- Lumiere
- Solide
- Fluide
#### Modelisation
Le but est de representer et traiter la forme des objets 3D
- Modeles
- Avec differentes manieres de representer les objets
- Maillages (principal en cours)
- Subdivisions
- Points (MLS)
- ...
- Numerisation/scanning 3D
- Avec differentes manieres de modeliser les objets
- Logiciels
- Scanners
- Manuelle (Nemo poissons en argile tout d'abord)
- Traitement numerique en fonction du rendu voulu (jeux video on simplifie polygones de loin)
- Reconstuire
- Simplifier
- Optimiser
- Raffiner
- Parametrer
- Tri/quadranguler
- Analyse
- Modelisation
#### Rendu
Synthetiser des images a partir des modeles 3D
Les rendus ne sont pas toujours realistes (Coucou rendus cartoon)
#### Animation
Corps articules
Physique des solides, des fluides
Design d'animation
Muscles, peau, cheveux (penible ++) | On s'appuie souvent sur la motion capture
#### Historique
<!-- Voir slides -->
| Column 1 | Column 2 | Column 3 |
| -------- | -------- | -------- |
| 1959 | TX-2 | Ivan Sutherland |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
| 1959 | Text | Text |
#### Applications
- Realite augmentee
- Cinema
- Jeux video
- Simulation (civil ou militaire, ca coute moins cher que de crasher un avion (et un pilote))
- Assistance chirurgicale (informations visuelles supplementaires pour les chirurgiens)
- Architecture (maquettes)
- CAO (Conception assistée par ordinateur)
#### Communaute Scientifique
<!-- TODO completer slides -->
- ACM SIGGRAPH
- Eurographics
- IEEE....
#### Outils
- Modeleurs
- Outils d'animation
- Moteurs de rendu
- Rendu realiste
- POVRAY (vieux)
- Blender (gratuit) | Peut-etre TP de prise en main plus tard
- Maya (cher)
- ...
- Rendu temps reel (bas niveau)
- OpenGL
- Direct 3D
- Java 3D
- ...
- Moteurs
- Unreal Engine
- Unity
- Ogre (open source) | remplace peu a peu par Godot
- ...
---
## Rappels
[SLIDES](http://jo.fabrizio.free.fr/teaching/synt/isim_rappels.pdf)
Must-have:
- Optique & Image
- Maths (geometrie euclidienne et projective)
### Capture de l'image

Camera reelle
- Distance focale:
- Augmenter/Retrecir: "zoom"/"dezoom" (FOV inferieur/superieur)
- Diaphragme (ouverture):
- Augmenter/Retrecir: Reduit la zone de nettete mais plus de lumiere/Augmente la zone de nettete mais moins de lumiere
Pourquoi connaitre tout cela ?
Lorsqu'on va simuler des images, il faut savoir comment elles s'interepretent et sont captees

Camera virtuelle
### Geometrie euclidienne
Objets tels qu'ils SONT (leur forme)
- Distance
$$
d, E\times E \rightarrow R^+\\
\forall (a, b) \in E^2, d(a, b) = d(b, a)\\
d(a, b) = 0 \leftrightarrow a = b\\
\forall (a, b, c) \in E^3, d(a,b) \le d(a, c) + d(c, b)
$$
21-34 dans les slides (allez chercher ce qui vous interesse)
Court et important (ne remplace pas les infos dans les slides):
- Representer une droite en 3D
$$
P(x,y) + \lambda \overrightarrow{v}
$$
- Un cercle de centre $C_x, C_y$ et de rayon $r$ dans un plan
$$
(x - C_x)^2 + (y - C_y)^2 = r^2
$$
### Geometrie projective
Objets tels qu'ils sont VUS
Projection sur le plan image, il va falloir mesurer des distances pour connaitre la taille de notre objet
La ligne d'horizon: Le plan qui passe par le foyer
La forme de l'objet (rail de train) c'est l'intersection sur le plan image de la droite reliant les points de l'objet et le foyer

Points sur l'horizon ?
Un point sur l'horizon n'a pas d'antecedent sur le plan objet (objet place a l'infini)
Plan projectif permet avec 3 coordonnees de tout representer (voir slides)
## Rendu photorealiste
### Intro
Objectif:
- Generer des images realistes sans contrainte de temps (par non plus 100'000 ans mais voila)
Strategies:
- Object-based rendering algorithms
- Une illumination globale calculee independamment du point de vue
- Image-based rendering algorithms
- Illumination calculee partiellement, en fonction du point de vue
- Deterministic rendering algorithms
- Espace trop grand, on se rend vite compte de ses limite
- Monte Carlo rendering algorithms
Algorithmes:
- Raytracing
- Pathtracing / Bidirectional pathtracing
- Radiosity
- ...
### Raytracing
Date des annees 70-80
On part de la camera, et on fait le chemin inverse de la lumiere pour trouver les objets vus
On regarde ensuite ses sources lumineuses directes (on relance un rayon depuis l'objet vers les sources)
C'est pas assez puisqu'on a que les sources lumineurs directes, donc c'est soit eclaire, soit pas eclaire, on va aller plus loin
Approximation de deux types de contributions:
- La partie diffuse
- La partie speculaire
On va donc faire un calcul de chaque pour calculer le niveau d'eclairement
Calcul de l'illumination locale:
- Composante diffuse
- Composante speculaire
- Apport des sources primaires (Cree de la lumiere)
- Apport des sources secondaires (Reflete de la lumiere)
Pour l'instant on occulte les sources secondaires

Le rayon reflechi nous donne les objets que nous devons refleter
#### La composante diffuse
$$
I_d = k_d * C * (\overrightarrow{N}.\overrightarrow{L}) * I_{Li}
$$
- $I_d$ l'intensite diffuse a afficher
- $k_d$ la propriete de diffusion de la surface
- $C$ la couleur
- $N$ la normale
- $L$ le rayon vers la source lumineuse
- $I_{Li}$ l'intensite lumineuse
Resultat:

#### La composante speculaire
$$
I_s = k_s * (S.L)^{ns} * I_u
$$
- $I_s$ l'intensite speculaire
- $k_s$ et $n_s$ les proprietes de reflexion de la surface

- $S$ le rayon reflechi
- $L$ le rayon vers la source lumineuse
- $I_Li$ l'intensite lumineuse
Resultat:

#### Calcul de l'illumination locale
$$
I = k_d * C * (N.L) * I_{Li} + k_s * (S.L)^{ns} * I_u
$$
Resultat:

#### L'algorithme
Pour l'ensemble des points de l'image :
1. Calculer le vecteur directeur du rayon lumineux v partant de l'observateur
2. Chercher les intersections de ce rayon lumineux avec l'intégralité des objets de la scène et garder le plus proche
3. Calculer le niveau d'éclairement au point d'intersection en sommant l'apport diffus et spéculaire pour chaque source lumineuse
Les limites de l'algorithme:
- Ne tient pas compte des sources lumineuses secondaires
- Ne gère pas les ombres
#### Prendre en compte les sources secondaires
Il faudrait prendre en compte TOUTES les reflexions (donc toutes les directions)
On va tricher et regarder uniquement le rayon reflechi (ou la quantite de reflexion sera maximale)

On fait la fonction `castRay` qui va directement aller taper le prochain objet et calculer son illumination (le meme algorithme que celui applique sur l'objet initial)
Notre nouvelle formule:
$$
I = k_d * (\overrightarrow{N}.\overrightarrow{L}) * f(d) * I_L + k_s * I_Li * (\overrightarrow{S}.\overrightarrow{L})^{ns} + k_s * I_s
$$
Notre nouvel algorithme:
1. Calculer le vecteur directeur du rayon lumineux $\overrightarrow{v}$ partant de l'observateur
2. Chercher les intersections de ce rayon lumineux avec l'intégralité des objets de la scène et garder le plus proche
3. Relancer un rayon dans la direction de $\overrightarrow{S}$ puis calculer le niveau d'éclairement récursivement
4. Calculer le niveau d'éclairement au point d'intersection en sommant l'apport diffus et spéculaire pour chaque source lumineuse ainsi que l'éclairement dans la direction de $\overrightarrow{S}$
#### Prendre en compte les ombres
- Pour l'ensemble des rayons que l'on "lance" vers les sources primaires, il faut chercher si un objet de la scène ne s'est pas inséré entre le point considéré et la source. Pour cela, il faut à nouveau calculer l'intersection du rayon avec l'ensemble des objets de la scène et prendre le plus proche

On remarque:
- Des ombres trop tranchees (limites des ombres lisses et ombre noires)
Comment prendre en compte l'illumination ambiante ?
#### Avantages/Desavantages
- L'algorithme du raytracing est un processus simple, récursif
- Il faut être capable, pour chaque objet, de calculer la normale en chaque point
- Il faut réfléchir à la condition d'arrêt
Avantages
- Algorithme simple et rapide à mettre en ÷uvre
- Génère des images honorables
- ...
Inconvénients
- Temps de calcul un peu élevé (calcul exponentiel)
- Pas gestion de la profondeur de champ et autres effets
- Mauvaise gestion des ombres (frontières trop brutales)
- Sources secondaire pas suffisamment prises en compte (éclairage indirect incorrect)
- Objets transparents
- "Aliasing"
- ...
#### Le probleme de l'"aliasing"
Les solutions ?
- Flouter l'image sur les contours avec detection de contours (post-filtrage)
- Rapide (c'est juste un filtre)
- Des qu'on a des objets petits, on peut passer a cote de ce dernier, et donc il ne contribuera pas a l'image
- Lancer plusieurs rayons par pixel et moyenner le rendu (sur-echantillonnage)
- Lent (chaque rayon c'est exponentiel)
- On a beaucoup plus de chances de tout detecter et que tout soit pris en compte dans l'image
On va preferer la seconde solution... Et peut-etre mixer avec la premiere ?
Sans anti-aliasing (~1 seconde)

Avec anti-aliasing (~8 secondes)

Avec anti-aliasing sur les zones de gradient eleve (contours) (~1 seconde)

#### Le probleme du temps de calcul
Les solutions ?
- Utiliser des threads (parallelisme du calcul)
- Optimiser la recherche de l'intersection rayon/objet, trier les objets dans l'espace (on cherche pas d'intersection derriere le rayon)
- Projeter les objets sur un plan (le plan est tout le pixel ici)
- Calculer les volumes englobant (le plus simple)
#### Le probleme des objets transparents
Les solutions ?
- `castRay`, ajouter un rayon refracte au calcul
$$
I = I_d + I_s + I_t
$$
En milieu transparent:

Loi de refraction (Snell-Descartes):
$$
n_1sin(i_1) = n_2sin(i_2)
$$
En milieu translucide:

Distribution probabiliste
L'ombre des objets transparents ?
Avec la refraction ca demanderait un calcul incroyable (surtout si le nombre d'objets transparents augmente)
On triche:
On ne va pas devier le rayon, on va simplement attenuer la lumiere et filtrer les longueurs d'ondes (c'est faux, mais c'est efficace et l'illusion est bonne)

#### Le probleme de l'eclairage indirect
Nos ombres sont completement noires s'il n'y a pas d'eclairage direct
Triche:
- On met une illumination globale, une lumiere ambiante (en fonction de la position dans l'espace)
$$
I = k_a * I_a + I_d + I_s + I_r + I_t
$$

(ombres bleutees)
#### Le probleme de l'ombre brute
Ne plus considerer la lumiere comme un point !
Plutot qu'etre completement binaire (ai-je une ombre ou non ?), on va plutot avoir des proportions d'ombres

La solution:
- `castRay`, on va envoyer plein de rayons vers les differents points de la lumiere (qui est un volume), et on va regarder combien de rayons sont interceptes
Temps de calcul ??
#### Bilan
Avantages
- Algorithme tres simple
- Donne des images honorables
De gros problemes
- Les sources secondaires insuffisemment gerees
- Les objet transparents aussi
Amelioration:
Le Raytracing distribue (1984)
- Sur-echantillonnage pour simuler
- Les ombres douces
- La profondeur de champ
- ...
- Ne regle pas le probleme de l'apport de la diffusion des sources secondaires
- Le temps de calcul devient enorme, on rajoute des `castRay` dans tous les sens
Necessite encore beaucoup pour devenir vraiment photorealiste
#### La Radiosite
On essaie d'estimer la "radiosite" de chaque element de la scene, c'est a dire la quantite d'energie que chaque element porte
- $B_i$ la radiosite de la surface $i$
- $E_i$ la quantite de lumiere emise par la surface $i$
- $P_i$ la fraction de lumiere incidente qui est reflechie par la surface $i$
- $F_{ij}$ la fraction de lumiere quittant la surface $i$ et atteignant la surface $j$
$$
B_i = E_i + P_i{\sum}_j(F_{ji}B_j)
$$
Interdependance des $B_i$
Calcul des $F_ij$ par hemi-cubes:
On va recuperer le taux de contribution des elements sur chaque cube de la piece


ATTENTION, on a toujours pas d'image !
On a juste la quantite d'energie par petit cube
Pour creer l'image: `castRay`. On ajoute en fait la radiosite au Raytracing
On envoie des rayons pour recuperer le taux d'energie de chaque cube
Puisque chaque cube contribue au calcul de l'energie de chacun, on a bien pris en compte les source secondaires
La radiosite permet en fait de calculer l'illumination globale d'une scene
Avantages
- Meilleure prise en compte des sources secondaires
- Calcule une fois pour toute
Inconvenients
- Ne tient compte que de la diffusion
- Tres lourd
- Oblige la creation d'un maillage (Il faut discretiser les surfaces)
- Objets transparents ?
#### Photon Map
Calculer l'illumination de la scene (d'une maniere differente de la radiosite)
Lancement de rayons lumineux depuis les sources et calcul des accumulations des photons
On part de la source, chaque rayon touche une premiere surface, depose de l'energie, puis se reflete/se diffuse, va deposer encore de l'energie, etc...
Avantage
- Permet de modeliser plus proprement les sources secondaires, les ombres portees et surtout les objets transparents (caustiques)
Inconvenients
- Beaucoup de calculs, parfois inutiles (endroits non visibles)
- Complexite
- Comment on stock l'information de photons deposes ?
### Pathtracing (et Bidirectional Pathtracing)
Modelisation des proprietes de reflexion des surfaces (Bidirectional reflectanve distribution function - BRDF)
Solution pour resoudre l'illumination
BRDF:
- Conservative
$$
\int{}{}f_r(x, \theta_i, \theta_o)L_{input}(x, \theta_i) | \theta_i.N_x|\delta w_o \le 1
$$
- Reciprocite de Helmholtz
$$
f_r(x, \theta_i, \theta_o) = f_r(x, theta|o^{-1}, theta_i^{-1})
$$
- Positivite
Il va falloir trouver un moyen de resoudre l'illumination locale
Comment avoir la BRDF ?
Modeles:
- Blinn-Phong
- Cook-Torrance
- GGX
- ...
#### Principe du rendu
Lorsqu'on lance notre rayon, on a de l'apport depuis toutes les directions
Le souci c'est qu'on ne peut pas faire ca car infinite de direction
On va donc lancer des rayons de maniere aleatoire (non equi-probable !) par rapport a la BRDF


#### Avantages/Inconvenients

Avantages
- Rendu tres realiste
- Convient bien aux situation exterieures
- Prend en compte l'apport des objets
- Rend les caustiques
- Possibilite de modeliser des effets (profondeur de champs, ...)
Inconvenients
- Lent
- Bruite (beaucoup d'iterations pour converger)
- Difficile pour rendre des scenes avec des petites sources lumineuses (ou sources cachees)
- Non deterministe (aleatoire) (donc mauvais pour l'animation)
#### Amelioration du calcul du rendu : Bidirectional Pathtracing
Lancer des rayons depuis l'observateur et depuis les sources

Avantages
- Facilite la recherche de chemins vers la source lumineuse
- Permet de modeliser des petites sources lumineuses
### PBGI Point-Based Global Illumination
Methode pour estimer l'illumination globale
Tres rapide et non bruite, mais pas aussi precis que le raytracing
On approxime la scene par nuage de points
- Un point = un disque de couleur
- Calcul de l'illumination directe de la scene
On va calculer la contribution des points sur un point en fonction de la distance de ces points
Les points sont eloignes ? On va les considerer comme un cluster qui va contribuer une fois ensemble
Disques un peu plus proches ? On les fait tous contribuer
Disque tres proches ? Raytracing sur le disque rediscretise
Que se passe-t-il sur les limites entre ces zones ?
### Bilan et remarques
Voir les illustrations sur le slide 84-88
#### Raytracing
- Calcul l'illumination en fonction d'un point de vue
- Calcul l'illumination approximatif : gère mal les objets transparents, les lumières secondaires, les ombres portées...
- Améliorations avec le raytracing distribué
- On peut combiner cet algorithme avec des techniques de calcul d'illumination globale pour palier à ces problèmes
#### Radiosity
- Calcul l'illumination globale
- Gère que la diffusion mais améliore l'apport des lumières secondaires
#### PhotonMap
- Calcul l'illumination globale
- Plus difficile à mettre en ÷uvre (implémentation, artéfacts...)
- Gère bien les objets transparents (caustiques) et éventuellement les ombres portées et les sources secondaires
#### PathTracing
- Gère bien les objets transparents, les lumières secondaires, les ombres portées
- Calcul très long
- Risque d'apparition de bruit
#### P.B.G.I.
## Rendu Temps-reel
Comment generer des images rapidements ?
### Principe general
On modelise nos objets avec leur repere local
On modelise notre scene a partir des objets crees (on les passe dans le repere de la scene)
On projet la scene sur le plan image
- On passe le repere global au repere camera
- On projete tous les objets sur le plan (dessin avec de la 2D)
### Algorithmes fondamentaux
Avant de pouvoir les mettre en place, il faut prendre conscience des problemes qu'on rencontre

Simplement sur un cube (qui est sympa par rapport a d'autres formes)
1. Comment savoir quelles sont les faces qui necessitent un rendu ?
2. Que se passe-t-il lorsque le cube est a cheval ?
3. Et si on a un autre objet ?
### Projet
BINOME (a la limite un monome/trinome)
Petite liste de projets (sujets)
Possibilite de venir avec son propre sujet
Pas de langage impose (en TP on est sur du C++)