Projet 1 : moteur de rendu temps-réel

Modalités

Cahier des charges

L'objectif de ce projet est de réaliser un moteur de rendu temps réel de haute qualité. Ce moteur sera implémenté en C++ en utilisant l'API OpenGL et son langage de shaders GLSL. Essayez (autant que possible) de ne pas utiliser les fonctionnalités fixes du pipeline OpenGL (dépréciées à partir de la version 3.0).

Il vous permettera de découvrir un certain nombre d'effets et d'algorithmes graphiques dans le contexte d'un pipeline temps réel. Après avoir implémenté une base commune (les fonctionnalités présentées dans les TP1 à TP3 et rappelées ci-dessous), vous pourrez choisir d'ajouter des effets de type photoréaliste et expressif. Nous vous en proposons quelques uns à titre d'exemple, mais vous êtes tout à fait libre d'en choisir d'autres ().

Votre moteur doit permettre de faire la démontration de ces effets, voire de les combiner s'ils sont compatibles. N'hésitez pas à étendre la base de code qui vous a été fournie pour les TP : meilleure gestions des lampes (type, nombre et positionnement), animation procédurale des objets...

Texture / Bump / Normal mapping

Pour augmenter la complexité visuelle des objets, vous devez tous permetter l'utilisation de textures bitmaps. Outre les textures colorées, vous utiliserez des textures de bump ou de normales pour perturber l'éclairage.

Vous pouvez également proposer un certains nombre de textures ou de bruits procéduraux : bruit de Perlin (code pour calculer la table de permutations), textures cellulaires...

Ombres

Nous demandons à tous les groupes d'implémenter la technique de calcul des ombres par shadow mapping.

Certains pourront, comme extension, chercher à obtenir des ombres douces en utilisant l'une des nombreuses approximations proposées dans la littérature (plus simple en partant d'une shadow map), ou des ombres dures plus précises en utilisant les shadow volumes.

Carte d'environnement

Nous vous demandons également à tous d'implémenter la technique d'environment mapping permettant de créer des effets de réflexion / réfractions depuis un éclairage à partir d'une image. Gérer les ombres produites par une carte d'environnement étant un problème complexe, nous vous conseillons de ne considérer qu'une ou deux lumière ponctuelle pour approximer les lumières les plus vives dans la carte.

Un certain nombre d'extensions sont possibles : la création de cartes d'environnement dynamiques pour gérer correctement les scènes animées, l'utilisation de diffuse map pour étendre l'usage des cartes d'environnement à l'éclairage diffus, la gestion des abérations chromatiques, la stylisation de ces cartes d'environnement par filtrage...

Images à grande dynamique

Vous devez tous permettre le rendu d'images à grande dynamique (HDR) et le contrôle de leur tone mapping (via l'exposition et le gamma).

Vous pouvez également implémenter un opérateur de tone mapping automatique plus complexe.

Certains groupes pourront également ajouter un effet de "bloom" par convolution de l'image HDR avant tone mapping et composition avec l'image originale.

Shading

Les modèles d'éclairage de Gouraud, Phong et Blinn-Phong doivent tous être disponibles dans votre moteur. Vous pouvez également ajouter d'autres BDRF analytiques.

Outre le toon-shading que vous devez tous avoir implémenté, de nombreuses méthodes d'éclairage ont été proposées en rendu non-photoréaliste : XToon, Gooch lighting, hatching... Vous pouvez choisir d'en implémenter certaines d'entre-elles.

Silhouettes et contours

La détection des lignes caractéristiques d'une surface (silhouettes, contours...) a fait l'objet de nombreuses recherches en rendu expressif.
Certaines d'entre elles, basées sur le traitement en espace image des cartes de profondeur et/ou de normales, sont particulièrement adaptée au rendu temps réel. Vous devez tous proposer cette dernière approche.

Vous pouvez en outre comparer cette méthode avec une approche géométrique en dessinant les arrêtes des faces arrières du modèle.

Évaluation