Ombres douces temps réel (Soft shadows)
sur cartes de niveau GeForce

Sylvain Vignaud

Nécéssités

J'assume que vous savez déjà afficher des ombres avec le Stencil Buffer.

Pour afficher des ombres douces, vous avez besoin d'une carte 3D avec :

Même une TNT2 est suffisante.

Introduction

L'idée de base est d'afficher plusieurs ombres en secouant la source lumière, et de les mélanger. Comme une GeForce n'est pas assez rapide pour afficher tous ces volumes en même temps, on utilisera de la coherence temporelle pour la simuler.
Pendant le calcul d'une image, on affichera le volume courrant, et on le mélangera à ceux des quelques images précédentes. Cette idée est basée sur l'effet de Motion Blur rapide de la Demoscene.

Implémentation

Vue globale de l'algorithme

On va additionner les volumes dans le buffer Alpha. Les différentes étapes de l'algorithme sont :

Le gros problème est que puisque l'on a un seul buffer alpha, une seule lumière peut projeter des ombres softs.

Agiter la lumière

Pour déplacer la lumière, je la place à Position+un de ces 8 déplacements :

ImageXYZ
0-SIZE-SIZE-SIZE
1+SIZE+SIZE-SIZE
2-SIZE+SIZE+SIZE
3+SIZE-SIZE+SIZE
4-2*SIZE-2*SIZE-2*SIZE
5+2*SIZE+2*SIZE-2*SIZE
6-2*SIZE+2*SIZE+2*SIZE
7+2*SIZE-2*SIZE+2*SIZE

Comme vous pouvez le voir, j'ai choisi 4 coins de 2 cubes autour de la lumière, afin qu'il y ait aussi peu de positions partagant un même plan. Ainsi aucun volume ne sera totalement inclu dans les autres.

Fading out des Alpha

Le Fade out est fait en affichant un quadrilataire par dessus l'écran avec les couleurs et blendings suivant :

glColorMask( GL_FALSE,GL_FALSE,GL_FALSE,GL_TRUE );
glBlendFunc(GL_ZERO,GL_SRC_ALPHA);
glColor4f(0,0,0,0.95f);

Lumière dynamique

Quand la lumière bouge, on peut au choix agiter ou non la lumière. Les deux méthodes fonctionnent en donnant des résultats très similaires.

Camera dynamique

Le problème quand la caméra bouge est que les volumes précédents ne sont pas placés correctement.
Si le taux d'affichage est élevé, l'erreur dans le positionnement des volumes précédents reste peu éleve.
Si l'affichage est plus lent, ces erreurs deviennent trop important et il faut réduire le nombre de volumes affichés, en faisant un fade out plus rapide.
J'utilise en général 8 volumes quand la caméra est statique et 2 volumes quand elle bouge.

Plus de réalisme avec une carte 3D plus rapide

Sur une carte 3D plus rapide, on peut afficher tous les volumes à chaque image calculée :
For volume = 0 To MaxVolume

Résultats

Voici une demo de cette technique
Voici plusieurs copies d'écrans de mon algorithme, faits sur un Duron 500MHz avec une GeForce2MX, à 20 images par seconde en moyenne :
Soft shadows  Soft shadows  Soft shadows  Soft shadows  Soft shadows  Soft shadows  Soft shadows

L'auteur

Cette documentation a été écrite par Sylvain Vignaud - Copyright 2001-2002.
Site web: http://tfpsly.free.fr
Toute redistribution pour éducation est permise si le contenu n'est pas modifié et si vous en demandez la permission. Toute redistribution payante de cette documentation sans la permission écrite de l'auteur est interdite. Toute modification est interdite.
Main page

email : Sly