Le but de ces travaux pratiques est de se familiariser avec les techniques
fondamentales pour le rendu temps réel en synthèse d'images. Ces TPs sont réalisé en
C++ et OpenGL mais les concepts qui seront abordés sont reproductibles dans
tout autre langage ou API graphique
Il est fortement recommandé de se munir de son cours pour effectuer les
travaux demandés.
Il est vivement conseillé aux étudiants de
travailler leurs TPs en dehors des séances encadrées afin d'avancer le plus
possible et de profiter de l'encadrement pour se faire expliquer les difficultés
qu'ils ont rencontrées.
L'évaluation des travaux pratiques se fera à partir d'un contrôle continu pendant les séances. De plus vous enverrez avant le début de la troisième sénace le tp correspondant au deux premières séances. Au plus tard une semaine après la dernière séance le code correspondant au trois dernières séances.
RTR-TP1.tar.gz. Pour le reste je vais expliquer en séance de TP, et je mettrai à jour cette page dès que possible. Et une scène bien pourri (mais j'en ferrai une mieux ...) scene1.dae et les textures normal diffus
Une mise-a-jour/correction des deux premiers TPs (qui est surement
encore pleine de bugs)
RTR-TP2.tar.gz.
Une nouvelle scène de
test sponza.tar.gz.
Normalement, après compilation de la correction, et ouverture de la
nouvelle scène, vous devez avoir un joli affichage de la scène. Dans
openglwidget est codé en dur les différentes passes de
rendu. Idéalement ces passes devraient se trouver encapusler dans des
classes SpecialFx, mais pas eu le temps de faire ça propre !
Voici une description rapide de ce que vous devez faire (construite à
partir d'un grep TODO sur les fichiers fournis). Dans l'ordre, vous
allez commencer par le blur.
Un peu de C++ pour commencer : faire un ping pong, sans changer
le shader, vous devez avoir la scène d'entrée d'affichée
src/rtr-tp1/openglwidget.cpp:177: // TODO loop to perform
several gaussian blur
shaders/blur.frag:15: // TODO compute outColor as a combination of
neighbor pixel to obtain a gaussian blur.
Avant de chercher les valeurs gaussienne, essayer un box blur (poids
de 1/tailleDuBlur
shaders/blur.vert:17: // TODO compute tex coordinates according to
inTexCoord and pixelOffset
shaders/blur.frag:10:// TODO setup weights to correspond to a gaussian blur of nine values
Là vous devez avoir la scene d'entrée floutée avant de passer à la suite.
Le support de plusieurs lumière à été partiellement ajouté au moteur
(les lumières sont des point light ...), comme vous n'avez pas encore
tonemapper, il y a un facteur de reduction dans phong.frag (mis en dur
à 1/4 car il y a 4 lumière dans sponza)
shaders/rtr-tp1/phong.frag:88:// TODO REMOVE THE .25 WHEN GOING IN
HDR !!!
il est temps de l'enlever.
shaders/highpass.frag:11: // TODO : high luminance pass filter
A vous de completer pour garder dans le rendu à blurer
seulement les pixel ayant une forte luminance ...
Les textures attachées au FBO n'ont pas été mis en mode flottant,
allez-y et constater la différence (appeler moi pour me dire ce que
vous voyez !)
src/rtr-tp1/openglwidget.cpp:206: // TODO SETUP TEXTURE TO HAVE HDR IMAGES : REPLACE GL_RBGA with GL_RBGA32F
Il ne reste plus qu'à faire le principale : tonemap et bloom (mais
c'est pas forcement très compliquer ... je vous laisse expérimenter et
chercher sur le net, mais je ne conseil pas Schlick)
Si vous avez besoin du min et max lum de la scène, placer les en
constantes dans votre shader (nous ne ferons pas, a priori, de shader
calculant le min/max ...)
shaders/texQuad.frag:23://TODO perform tonemap and bloom
D'abord une mise à jour du moteur (attention n'écrasez pas votre TP) :
RTR-TP3.tar.gz.
depth.tar.gz
Donc après avoir sauvegarder votre tp, vous pouvez remplacer
/src/engine par celui de l'archive, et pareil pour le
shaders/rtr-tp1/phong.*
Le plus dur c'est de fusionner votre tp (dans openglwidget.cpp), pour
cela à coups de diff ou xxdiff ca devrait le faire (vous devez garder
la partie ou il y les différentes passes de rendus et ajouter les
nouvelles fonctionnalités.
Une fois ces formalités effectuées, le TP commence.
Si besoin je fais un rappel sur les shadow maps
Vous devez mettre en place les bonnes transformations dans
updateShadowMaps(). Ce updateShadowMaps est appelé au chargement de
la scène, et vu que l'on traite seulement des scènes statiques, pas
besoin de mettre à jour à chaque frame.
Ceci permets le calculs des (maximum 5) shadows maps, une pour chaque
lumière (que les spots, une petite limitation d'ingénieurie, si vous
voulez faire mieux !) de la scène.
La dernière partie se passe dans les shaders phong pour moduler
l'éclairement suivant si un pixel est dans l'ombre ou non ;)