TP 3: Effets Spéciaux

But:

Dans ce TP, vous allez vous amuser avec quelques effets spéciaux. Certains sont prévus directement dans OpenGL, comme le fog ou le blending, certains autres ne sont pas vraiment prévus mais peuvent être simulés sous certaines conditions (ombres portées et reflets).

Description:

Le programme ouvre une fenêtre sur un environnement contenant les objets du TP précédent (une sphère, les deux objets plans, et le plan horizontal texturé). Le travail consistera à intégrer au code existant les effets spéciaux suivants: fog, transparence des objets plans, ombres portées et reflets des objets sur le plan horizontal.

Pendant l'exécution du programme, tous les effets spéciaux seront activables par l'intermédiaire d'un menu accessible grâce au bouton du milieu de la souris. La sélection d'un élément du menu active ou désactive alternativement le paramètre correspondant. Le menu est déjà en place, mais il n'a pour l'instant aucun effet visible.

Le programme fourni comprend par ailleurs une solution aux deux TP précédents (ombrage et déplacement), à ceci près que toutes les options (du menu de droite) sont activées par défaut (lumières, matériaux, textures).

Implémentation:

Fog:

Transparence:

Afin d'éviter le problème des color buffers ne supportant pas de composante alpha, nous n'utiliserons que les composantes source alpha. À cet effet, vous noterez que toutes les couleurs ont été modifiées par rapport au TP précédent pour fournir une composante alpha de 0.5. La texture de bois est déjà dotée de cette composante.

On décide de rendre les deux objets latéraux transparents; les autres resteront opaques. Pour ce faire, le blending devra être utilisé, mais attention: le blending sert aussi à d'autres choses (par exemple, les reflets).

Le blending se fera par modulation de la source par sa propre composante alpha, et modulation de la destination par 1 moins cette même composante.

Ombres Portées

Le tracé des ombres portées doit être fait dans la fonction shadows_draw(). Il s'agit de tracer les ombres issues des objets, de la lumière globale seulement (pas de celle du point de vue) et qui se projettent sur le plan.

Reflets

Le tracé des reflets doit être fait dans la fonction reflections_draw(). Il s'agit de refléter les objets sur le plan.

Tracé du plan horizontal

En fonction de la présence de reflets ou d'ombres portées, le tracé du plan horizontal pose des problèmes (qui ont tous des solutions :-).

Conseils:

Fonctions utiles:

glClearStencil, glFog*, glBlendFunc, glStencilOp, glStencilFunc, glDrawBuffer, glCullFace, glScalef, et toutes les anciennes...