Passons aux explications à propos de l’effet d’eau dont je parle depuis quelques articles maintenant.
Pour réaliser un rendu de ce genre, il faut décomposer le problème en deux sous-problèmes : le reflet et la déformation appliquée au reflet et au "fond" de l’eau. Jettez à nouveau un oeil aux images juste au dessus si ce premier point n’est pas clair pour vous.
Avant même de déformer le reflet et le fond, il faut déjà avoir ces deux "images". On va donc réaliser deux rendus supplémentaires (à chaque image !) et envoyer le résultat dans des textures dédiées (c’est le pompeux "render to texture") et non directement à l’écran.
Pour le rendu du reflet, on va utiliser une caractéristique intéressante qu’offrent les cartes vidéo : le Plane Clipping. L’idée est simple : on demande à la carte de ne rendre que ce qui est au dessus d’un plan arbitraire, le plan étant ici la surface de l’eau.
Exemple sur une scène donnée :
On active le plan de coupe, on "retourne" la caméra (scaling de [1,1,-1]) et on retrouve ça :
Pour le fond de l’eau, il faudrait faire exactement l’inverse, c’est à dire rendre ce qui est de l’autre coté du plan de coupe, avec la caméra à l’endroit. Pour certaines raisons, je préfère rendre la totalité de la scène.
Notez que le résultat est passablement crade, puisque rendu et stocké dans une texture, de résolution assez faible (en général 512×512, bien que ce chiffre soit dépendant de la taille de la fenêtre de rendu). Il est possible d’imaginer beaucoup d’optimisations ici pour réduire le boulot voire supprimer cette passe.
Voilà donc deux nouvelles textures toutes prêtes à être déformées. Ces déformations seront réalisées par un shader, assez simple dans le principe : la première chose que réalise ce shader et une appliquation classique de "normal map", une technique très courante maintenant qui consiste a réaliser l’éclairage au niveau du pixel ("per pixel lighting") et non au niveau du vertex, et ce à partir d’une texture qui donne le "relief" de la face.
Pour réaliser cette normal map, il est possible de se baser sur une photo :
On va adapter cette photo pour lui donner une résolution intéressante (ici 512×512, la photo originale étant bien plus grande que celle qui est visible ici) et la rendre "répétable" (seamless) :
(Cette dernière opération peut être réalisée, par exemple, avec GIMP : filtres "carte" -> "rendre raccordable")
Pour la suite, il existe divers applis capable de générer (plus ou moins bien) une normal map depuis une texture standard. J’utilise pour cet exemple les outils d’ATI, ici avec TGAtoDOT3.exe :
Notez au passage les teintes de bleu/rose cette texture, qui sont caractéristiques des normal maps.
Le shader va donc utiliser cette texture pour "donner du relief" à la surface de l’eau, c’est à dire modifier la "luminosité" de chaque pixel de cette surface.
Je précise que ce dernier point n’a rien à voir avec d’éventuelles déformations, puisque qu’il faut ici faire intervenir une nouvelle texture : la DUDV map. Pour faire court, cette dernière map est la dérivée de la normal map, et à donc pour rôle de déformer le reflet et le fond de l’eau. Là encore, un outil de chez ATI va faire le job (TGAtoDUDV.exe) pour donner ça :
Ici aussi, les couleurs sont représentatives de ce type de map (rouge et jaune).
Le shader utilise donc maintenant :
– le reflet
– le fond de l’eau
– la normal map
– la DUDV map
En "mixant" tout ça (merci M. Fresnel), et en ajoutant un reflet spéculaire pour le soleil, il est possible d’arriver à un rendu tout à fait convaincant pour cette fameuse eau.
Le résumé est simple :
– On génère le reflet
– On génère le fond de l’eau
– On rend la scène comme d’habitude
– On dessine un grand carré qui représente la surface de l’eau, avec le shader activé.
Et pour notre scène, ça donne le résultat suivant :
Sympa, non ?
Si j’arrive à trouver le temps et que ça intéresse du monde ici, je vais tenter demain de créer un petit programme pour tester tout ça, avec la possibilité d’agir sur les différents paramètres et tester de nouvelles textures pour l’eau.
Laisser un commentaire
Vous devez vous connecter pour publier un commentaire.