Transition entre textures de secteurs


chrisbk yop all !

Tutorial un peu spécial car il ne va s'adresser surement qu'a une fine brochette de personnes. Deja, a priori, à ceux qui font un moteur de paysage (hop, les autres vous pouvez partir) . Vient ensuite le fait que pour texturer un terrain il y a en gros deux ecoles :

1) je preca une grosse texture (genre 1024x1024 ou 2048x2048 pour les hardcores) qui donnera l'aspect general du paysage. etant donne que je preca, j'fais ce que je veux, tant pis si ca rame un chtiot peu

2) je peux pas preca une grosse texture pour diverses raisons, fo que je calcule ma texture en live (genre par ce que tout bonnemenet le paysage n'entre pas en mémoire, comme c'est mon cas). Et pis ca faire toujours bien de pouvoir estampiller des "computed on the fly" dans sa feature list. ca pose. Deja on sent qu'on a pas affaire à un rigolo qui vous nous passer un AVI en essayant de nous faire croire que ca sort de sa 3dfx1.

Si vous faites parti du 1, bon, ben la aussi vous connaissez le chemin....(y'a des tuto sur flipcode sur la generation de textures pour un terrain, soit dit en passant)
Un autre point est que, chez moi du moins, le paysage est coupé en secteur, et que chaque secteur à sa texture calculée on the fly. Si vous avez tous ces critères, vous pouvez rester.

Alors, voila. Vous vous faites un chtiot algo qui à partir de textures de base et de certains paramètres (dont le plus courant et le plus logique étant la hauteur) va vous calculer une texture par secteur.
Bien bien bien.


Mais maintenant, la grande question . Etant donné que vous etes un chouia exigeant, vous voudriez bien que tous les secteur puissent avoir leurs propres textures de bases. Ceci implique trouver un moyen de calculer des transitions entre les secteurs. Et c'est la le fond du problème.

Alors, dit comme ça, ça peut paraître un peu culcul. (surtout quand vous verrez la solution). Rigolez pas, ca m'a pris un certains temps pour la trouver, car en fait y'a des feintes en veux tu en voila :

* on ne peut partir que des parametres des secteurs adjacents, pas de leur texture (ceci parce que si on a besoin a chaque fois de la texture du voisin pour calculer la notre, alors la RAM morfle, les temps de calculs grimpent en fleche et l'utilisateur se trouve plutot confronté à une soirée diapositive qu'a un monstre assoiffé de polygone. Et ça, ça le fait pas rire).

* prenons un exemple :

A B
C D
quatres secteurs donc, et mettons qu'ils utilisent tous les meme texture, sauf B (le chieur)
Vous allez calculer une transition entre A et B (logique). mais vous en faudra aussi une entre A et C, bien qu'ils utilisent les meme textures ! (vu la texture de A comprends la transition avec B. J'mettrais bien des images mais me semble qu'Alrj à une politique plutot agressive envers les images. la preuve, il a degagé les seules images de son site. Que vous regardiez son site avec explorer 5 bardé de moultes plug in ou un vieux lynx des familles, visuelement y'a aucune différence. mais je m'egare (joke alrg !!))
Au pire, sortez un paint shop pro, faites des carres adjacent de differentes couleurs et trouvez un moyen de faire de belle transition entre tout ca, tout en gardant a l'esprit que ca doit etre fait on-the-fly(tm). Voila le probleme einsteinien (jamais vu un mot avec autaint de ein) devant lequel j'etais confronté . On fait deja moins les malins, hein ? merci.
Et vala la solution que j'ai trouvé . Elle coute quasi rien en temps de calcul, ca utilise le hardware 3d pour peu que vous disposiez d'une carte faisant l'interpolation bilineaire. Si vous avez pas ca, allez vous faire pendre ailleurs.
Pas de truc compliqué, ni d'algorithme exotique dont le simple nom vous donne envie d'envoyer promener tout ca et de faire un moteur 2D en wireframe.



l'algo (enfin !)

Reprenons un exemple :

1 2 3 A D
4 5 6 B E
7 8 9 C F

Nous avons donc un pack de secteurs , et penchons nous plus sur le secteur numéro 5.
Pour calculer les transitions entre le secteur 5 et ses voisins nous n'utiliseront que les secteurs 6,8 et 9 . Mine de rien, en faisant cela on vient de réduire serieusement le probleme.
La transition entre le secteur 4 et le secteur 5 (par ex) seront contenu dans la texture du secteur 4.

Pour la suite des operations je pars du principe que vos texture sont 32x32 (ca n'à aucune espèce d'importance, c'est juste pour les coordonnées),et que vous avez une fonction qui, à partir d'un set de textures de base et d'une hauteur (ou ce que vous voulez..) vous renvoie une couleur.

Nous sommmes en face de 4 cas :

1er cas : les secteurs 5,6,8 utilisent les memes texture de bases
fort bien, cas plutot simple. calculez toute la texture du secteur avec votre fonction. Sauf le point (31,31) qui sera calcule en utilisant les textures du secteur 9

2eme cas : le secteur 6 a un set de textures different
vous calculez toute votre texture avec votre sublime fonction, sauf la colonne (31,xx) qui sera calculé avec les textures du secteurs 6 . le point (31,31) sera tjs calculé avec les textures du secteurs 9

3eme cas : le secteur 8 a un set de texture different
Limite idem que precedemment, sauf que c'est la ligne (xx,31) qui sera calculé avec les textures du secteur 8. Comme d'hab, (31,31) sera calculé avec les textures du secteur 9

4eme et dernier cas : 6 et 8 utilisent deux sets de textures differents
Vous prenez les cas 2 et 3, vous les mixez et vous avez le chemin a suivre.

Vala. C'est tout. C'est aussi culcul que ca.



Chtiote explication :


Examinons de plus pres les textures des secteurs 5,6,8,9 calculées via ce biais. (ici 5 signifie "calculée grace aux textures du secteur 5". Et je fais des textures 4x4)

5 5 5 6   6 6 6 B
5 5 5 6   6 6 6 B
5 5 5 6   6 6 6 B
8 8 8 9   9 9 9 C

8 8 8 9   9 9 9 C
8 8 8 9   9 9 9 C
8 8 8 9   9 9 9 C
8 8 8 9   9 9 9 C
Vous noterez une certaine continuité dans les textures. Pas de cassures, c'est ca l'important. Les transitions inter secteurs sont donc impec. Et la ou c'est fin c'est que les transitions intra-secteurs seront fait au bilinear de la carte . donc gratuitement.

Terminé, fin de la demonstration, merci d'avoir été si sage

A noter que vous n'avez pas besoin de distinguer les quatres cas. vous pouvez en faire qu'un seul (le 4eme), mais chez moi ca doit aller un tantinet plus vite en les dissociants, donc voila....

Le resultat est pas specialement beau, car achement lineaire. M'enfin vous pouvez utilier ce que bon vous semble, genre :
5 5 5 6    
5 5 6 6   
5 8 9 6   
8 8 8 9   
pour le secteur 5 . ca donnera un aspect moins carré, c'est tout simplement formidable. Vous pouvez meme faire du random (a l'interieur du secteur, hein . les bordures doivent rester comme elles sont), à partir de la je vous laisse jouer avec l'algo.

Conclu :


C'est donc un algo toucon(tm) que nous avons la . Pas de trucs extravagant, de calculs monstreux, de cerveaux qui s'enflamment, pas plus que de cris guturaux poussé la nuit parce qu'apres quatre heures d'arrachage de tete sur l'algo on est pas plus avancé, rien qu'un bon cul cul la praline comme on l'aime (et qui marche, du moins, il en a tout l'air) .
Au debut j'etais parti dans des trucs assez touffus et obscurs....keep it simple, voila la solution :)


questions, améliorations, commentaires : chrisbk@ifrance.com