Tribulations codalistiques d'un fennec au pays de la 3D (le blog de Xfennec)
Retour au blog <<

Rechercher

Archives

Août 2006

Combustible pour barbecue

Mercredi 16 août 2006 à 13 h 54
Le montage et le rodage de moteur du Trainer étant terminés, la journée feriée d'hier a été l'occasion de faire voler l'animal.



J'ai trouvé l'avion très réactif, avec un bonne pêche (alors que le moteur était encore réglé très gras), et équilibré. Je pensais obtenir un vol plus lent, et surtout plus "lourd" avec un avion de début aussi gros. Eh bien, rien de tout ça, et je me suis vite senti à l'aise pour embarquer l'engin dans de petites figures.



Un coup de vent au mauvais moment m'a forcé à rentrer dans une boucle involontaire (j'étais trop bas), et mon inexpérience a fait le reste :



Crash. Et un beau, le bloc moteur est cassé net en 2 (c'est ce qui m'embête le plus), et l'avion est clairement out. C'était dans l'ordre des choses (mon premier vol, mon premier avion, tout en solo, aucune expérience et tout ça avec du vent) et je m'étais préparé à ça dès les premiers instants du montage, mais quelle frustration de ne pas avoir eu le temps de tester un atterrissage pour lequel je m'étais tant préparé ... L'impatience ne pardonne pas :)

Hop, ici la vidéo du début du vol. On entend clairement le vent se lever, et la toute fin montre que l'avion a du mal à terminer ses boucles.

Pour l'heure, ces quelques minutes de vol me donnent surtout envie de me relancer de plus belle dans l'aventure (c'est incroyablement grisant ... il faut l'avoir vécu pour comprendre).

Vais-je succomber aux (très présentes sur NF) sirènes de l'électrique et à leurs avions moins cassants ? :)

Nouvelle démo Raydium : Volcano !

Mercredi 9 août 2006 à 19 h 02
Voilà le résultat de quelques heures de boulot ... Le but était de faire une petite démo technologique de Raydium exploitant des shaders et le moteur de particules. Je pense ce but est atteint.



Et le lien pour la vidéo (clic-droit, "enregistrer sous", si ça ne marche pas).

Bon ok, le son est assez étrange (l'encodage y est pour beaucoup) et les réactions des rochers dans l'eau ne sont pas parfaites ... mais pour le reste, je suis plutôt content !

gl_FragColor = refractionColor + reflectionColor + specular;

Lundi 7 août 2006 à 15 h 37
Contrairement aux captures précédentes, je cherchais un effet "océan", et non simplement "eau calme". Voilà un set Normal Map + DUDV dont je suis plutôt content (il est basé sur la photo du dernier article). Merci à KiCK pour l'île et pour la détection du problème d'éclairage dans la texture de réfraction. Le fond de l'eau utilise ici un brouillard volumétrique.

Vous noterez au passage que je n'ai clairement aucune compétence graphique, la partie droite de la capture particulièrement vide et répétitive le démontrant assez bien :)

4 commentaires, dernier de divide.

Comment ça marche un shader pour l'eau ?

Jeudi 3 août 2006 à 23 h 14
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 512x512, 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 512x512, 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.
20 commentaires, dernier de KiCK.

Water Shader - Images

Mercredi 2 août 2006 à 02 h 21
Hey, l'effet est terminé. Il faut maintenant que je mette au propre l'appli de démo, et pourquoi pas que j'intègre quelques fonctions dans Raydium. A voir.

Voilà une capture à 3 "heures" différentes, pour démontrer l'effet de Fresnel :


Soleil très bas sur l'horizon ...


... plus haut, on voit le reflet du soleil changer, à droite, et la refraction augmenter ...


... idem, ici le reflet est encore plus diffus et l'eau est particulièrement translucide.


Une autre pour la route.

Et enfin (tada !) une vidéo de la chose :

http://freeway.raydium.org/captures/rayShaderWater.avi

Suite de l'histoire à moyen terme : créer une scène à la FarCry qui donne envie d'aller se baigner ...
9 commentaires, dernier de MetalX.

Shaders - Work In Progress

Mardi 1er août 2006 à 20 h 23
Je bosse depuis quelques heures sur un nouveau shader pour Raydium. Voilà les tous premiers résultats, résumés en une seule capture de développement :


A suivre ...
6 commentaires, dernier de KiCK.