dimanche 12 avril 2009

La couleur de l'eau

J'ai tout d'abord réessayé le bump mapping, ce qui a donné des résultats tout à fait ridicules. Je me suis ensuite basé sur une texture de flotte assez standard, pour des résultats qui m'ont immédiatement plus plu. Cependant, restait le problème de savoir comment mélanger le reflet et la texture d'eau.

- Addition -> Joli, mais les reflets apparaissent beaucoup plus clairs que l'objet original
- Multiplication -> L'eau est presque noire!
- Max -> A peu près potable si la couleur de l'eau est sombre, fait disparaître des éléments qui devraient être reflétés sinon
- Min -> Situation inverse de max, la couleur de l'eau doit être claire, sinon on perd des reflets

En fait, la couleur de l'eau "sans rien" est vraiment la couleur du ciel réfléchie. Ce que l'on veut vraiment, c'est la couleur du reflet si il existe, et l'océan (de fait, le ciel!) sinon. En modifiant ma caméra de reflet pour qu'elle retourne une couleur de fond transparente, j'ai ensuite combiné mon reflet à mon océan en utilisant la valeur alpha dans mon shader:

gl_FragColor = ocean * (1. - refl.a) + refl * refl.a;

Ainsi, mon océan n'est visible que si mon reflet est transparent (c'est à dire correspond à la couleur de fond), et disparaît lorsqu'un reflet existe.

J'ai même la sourde impression que ce code devrait fonctionner même le jour où je voudrais réfléchir des objets semi-transparents, puisqu'effectivement c'est le ciel qui apparaîtrait au travers.

Et voilà le résultat!

3 commentaires:

Julien a dit…

Superbe ! Ya pas moyen que tu nous postes une petite animation ?

Julien a dit…

A y reflechir un peu (sic), le probleme du choix de melange entre le ciel et l'objet dans l'eau est insoluble (sic). Dans la realite je pense que ca dependrait de la distance a laquelle ton oeil met au point. De la meme facon qu'en regardant une vitre tu peux plus ou moins "choisir" de regarder dehors ou bien ton beau visage.
Ici tu as fait intuitivement le choix que le joueur se concentre sur les objects plus que sur le ciel, ce qui fait complement sens AMHA.

M87 a dit…

En effet, la mise au point de l'œil a probablement une grosse incidence sur le résultat final. C'est d'ailleurs ce qui je pense rend le résultat moins beau pour les objets à distance: le reflet semble trop fort et pas naturel. Peut-être que l'on a tendance à faire la mise au point sur la surface quand on est trop loin pour voir les détails?

Je pense qu'il serait possible de moduler la quantité objet / ciel en fonction du z-buffer, mais toutes mes tentatives n'ont pour le moment rien donné.