Réalisme et Post Processing

Objectif : Accroître le réalisme

  • Des objets de la scène
    • Des matériaux plus complexes
      • Peu de couleurs unies, de surfaces parfaitement lisses
      • Détails à plusieurs échelles
  • De la scène dans sa globalité
    • Des "effets" globaux
    • Corriger/Atténuer/Cacher les approximations de l'équation du rendu




Le mot réalisme ne veut rien dire. Dans une certaine mesure tout est réaliste. Il n'y a pas de frontière entre l'imaginaire et le réel. (F.Fellini)

Réalisme des objets

Dans l'idéal, on voudrait une apparence

  • Variable/paramétrable (vieillissement, weathering)
  • Éditable (utilisateur, interaction avec la scène)
  • Définie à de multiples échelles
  • Intègrant des effets visuels complexes
    • Relief
    • Silhouette
    • Parallaxe et auto-ombrage

Premiers pas : Utiliser la texture

  • Ajout de la complexité visuelle
  • Relativement facile a obtenir
  • Toujours une apparence plane
  • Problème de résolution, répétition
  • PManque de nombreux effets visuels
  • Difficilement paramétrable (pour des effets complexes)
  • Données discrètes

Quelques solutions

  • Normal mapping
  • Relief Mapping
  • Parallax Occlusion Mapping
  • Tesselation, subsurface scattering,...
  • Des matériaux et brdf complexes

Essentiellement, des shaders plus complexes

Exemple du Parallax Occlusion Mapping

Idée : Un lancer de rayon local pour simuler les effets de parallaxe/silhouette/illumination

SansPOM avecPOM

Exemple du Parallax Occlusion Mapping

Idée : Un lancer de rayon local pour simuler les effets de parallaxe/silhouette/illumination

Un autre exemple

POM2

Effets d'image et réalisme de la scène


Reintroduire une illusion de complexité globale


Autrement dit : reintroduire ce qu'on a négligé dans l'équation du rendu





Toutes les images sont des mensonges, l'absence d'image est aussi mensonge. (Bouddha)

Des interactions lumineuses

  • Gestion des ombres
    • Ombres portées
    • Occlusion ambiante
  • Le transport de la lumière
    • Eclairage volumique
    • Illumination globale
  • L'apparence des couleurs
    • High Dynamic Range
    • Tone Mapping
    • Balance des couleurs

Des effets cinématographiques

  • Bloom
  • Lens Flare et sun glare
  • Flous (cinétique, profondeur...)
  • Balance des couleurs
  • Effets de caméra (lentilles, mouvement...)

Des effets sur la scène

  • Pluie
  • Brouillard volumique
  • Nuages de poussière
  • Neige
  • Etincelles, particules

Des exemples

Shadow Mapping

ShadowMapping

Volumetric lighting et poussières

Skyrim

Volumetric lighting et brouillard

Volumetric

Ambiant occlusion

AO

Bloom

Bloom

High Dynamic Range

HDR

Balance des couleurs

ColorChange

Lense Flare

LensFlare

Post Processing et Passes de rendu

Idée : Appliquer des effets sur le Frame Buffer

  • Avant l'affichage
  • Sur un Frame Buffer 2D (complexité finie)
  • Permet de connaître les voisins d'un pixel
  • On veut rester sur le GPU (performance)

En pratique

  • Effectuer le rendu dans un autre Frame Buffer
  • Afficher un quad couvrant l'écran avec comme texture le Frame Buffer
  • Utiliser le fragment shader pour calculer un effet
    • Une instance du shader pour un pixel de l'image de sortie
    • On peut acceder à l'ensemble de la texture
Le Frame Buffer Object : FBO (OpenGL > 3)
  • Objet OpenGL (un identifiant sur le CPU)
  • Encapsule un ou plusieurs buffers (couleur, profondeur...)
    • glGenFramebuffers(1,id)
    • Des paramètres en pagaille
  • Permet d'écrire dans un (ou plusieurs) buffer :
    • glBindFramebuffer(GL_FRAMEBUFFER,id)
        La sortie du pipeline est écrite dans le FBO id
    • glBindFramebuffer(GL_FRAMEBUFFER,0)
        La sortie du pipeline est écrite dans le FB classique
Lclasse GPUFBO
  • Encapsule un FBO
  • une fonction createTexture2DAttachments(...)
  • Des fonctions enable/disable
    • enable() : La sortie du pipeline ecrit dans le FBO
    • disable() : La sortie du pipeline ecrit dans le FB classique
  • Une fonction getColorTexture(int i)
    • Récupère un pointeur sur la texture i du FBO
  • Une fonction display()
    • Affiche un quad avec le FBO comme texture

Un exemple : Flou simple sur une image

DOF

Principe : Mélanger chaque pixel avec ses voisins selon un masque

  • Afficher la scène dans un GPUFBO
  • Afficher un quad couvrant avec pour texture le GPUFBO
  • Pour chaque fragment :
    • Récuperer les coordonnées de texture
    • Lire les contributions des voisins et les accumuler
    • Assigner la moyenne des couleurs accumulées au fragment
La classe virtuelle EffectGL
  • Encapsule un effet de PostProcessing
  • Une fonction init(...)
    • Pour créer les GLPrograms, charger les ressources...
  • Une fonction apply(GPUFBO *in,GPUFBO *out)
    • Applique l'effet sur le FBO in et ecrit dans le FBO out
    • Si out est null, doit ecrire dans le FB classique

Pour aller plus loin : Deferred Shading

  • Nous avons vu ici le pipeline forward (ou direct) rendering
    • Le calcul de la couleur finale est effectué par fragment directement
    • Problème : Il faut connaître l'ensemble de la scène pour un effet global
  • Une part très importante des moteurs 3D actuels est basée sur un pipeline Deferred rendering

Principe du Deferred Shading

    • La géometrie est envoyée dans le pipeline
    • Le fragment program calcule des informations à stocker dans des FBO (couleur, normale, position 3D, vitesse de déplacement...)
    • Couleur finale calculée en 2D avec les informations des FBO
    • Application massive d'effets de post-processing...
    • Les effets deviennentt indépendante de la géometrie
    • Beaucoup d'optimisations possibles

Un outil : le Multiple Render Target

  • Il est possible d'ecrire dans plusieurs (selon le materiel) textures d'un même FBO à la fois
  • Un envoi de géométrie dans le pipeline donne toutes les informations
Dans le shader
out vec4 (location=0) Color;
out vec4 (location=1) Normale;
          ...
          

Retour a la classe GPUFBO
  • Définir un FBO avec plusieurs textures (cf. classe GPUFBO)
  • Utiliser la fonction drawTargets(int i)

Exemple : le bloom

Bloom_sans Bloom_avec

Exemple : l'ambiant occlusion

Bloom_sans Bloom_avec

Divers effets complexes





Les petites causes produisent les grands effets. (Anonyme)

Accroitre le réalisme de la scène

  • Feu, fumée, explosions
  • Rivière et cours d'eau
  • Végegation
  • Particules
    • Etincelles
    • Pluie, neige
    • Feuilles mortes
    • Papillons ?

Le Billboard : des plans texturés

Billboard1 BillBoard2

Plus général : des imposteurs

  • Géometrie simple
  • Englobe l'effet
  • Sert a déclencher un fragment shader
  • Des effets volumiques
    • Feu, flammes, fumée...
    • Des textures 2D, 3D, animées, mélangées
    • Virtuellement tout est possible

Plus général : des imposteurs

Smoke FireSkyrim

En conclusion

  • Beaucoup de trucs et astuces
  • Beaucoup de possibilités
  • Souvent des compositions de buffers
  • Deux principes majeurs
    • Est ce que c'est joli ?
    • Combien de ressources (temps, mémoire) cela coûte ?