bon ben apres avoir ete distrait par des compilos, des arbres et de l'antialiasing, me revoila sur le terrain.
En farfouillant sur gdev j'ai trouvé ce thread qui ma foi propose un LOD assez interessant ( http://www.gamedev.net/community/f [...] _id=149948, en plus par un francais, algorithme national de qualite, donc ).
Les avantages de la bete sont une absence de crack entre deux niveau de details et le geomorph pour pas cher (toujours de bon gout). Lorsqu'un secteur approche du viewer il est splitté (en 4 fils, donc)
J'ai commencer a implanter ca mais y'a encore pas mal de boulot avant que j'obtienne un affichage (vu que c'est la premiere fois que j'utilise en grandeur nature notre bins pour les VS (entre autre), ca risque d'etre un peu folklo)
Voila l'idee generale du moteur tel que je l'envisage :
->> Geometrie
->Sur disque
Stockage du paysage a raison d'un octet par hauteur. Cet octet ne donne pas la hauteur precise mais plutot une idee de la hauteur (genre 5=200m d'altitude). Autrement dit apres relecture et affichage direct on aura un paysage bien carré (notez que 16 valeurs peuvent suffir, permettant de tomber a 4bits / vertex. Ca devrait suffir pour nos pb de stockage)
->Decoupage
Le terrain est découpé en secteur. Chaque secteur utilise 9x9 pixels du disque
->Chargement & lissage d'un secteur
Un secteur pompe sur le disque ces 9x9 pixels, puis reinterpole tout ca en en 33x33 pour un premier lissage. Lors du split d'un secteur, les 4 fils reutilisent un sous ensemble des 9x9 pixels, sous ensemble qui sera a nouveau repassé en 33x33.
->Noise
Pour ne pas avoir un paysage trop lisse, je pense recoller par dessus une couche de perlin noise (ou ptet deux). Niveau implementation exacte je me suis pas encore decidé mais ca ne devrait pas etre tres extravagant, surtout que j'ai deja les routines de perlin noise finemment optimisé a la main
->VB :
D'un secteur a l'autre bpc de donnée sont redondates. Les coordonnes X/Z par exemple. Ces données vont donc s'en aller dans un VB commun a tous les secteurs (notez que tous les secteurs ont la bonne idee de faire 33x33 vtx. Ca facilitera la gestion de VB).
Les positions XZ stockees seront comprises entre [0..1]. Le scaling par la taille du secteur ainsi que la translation kivabien seront faite dans un VS. L'avantage de cette normalisation est que l'on peut reutiliser directement la position XZ comme coordonne de textures, suffit juste d'appliquer un autre scaling pour le tiling (un peu plus tard) et de recopier ca dans les bons registres de sortie
Idem pour l'index buffer servant au rendu : partagé par tous.
Chaque secteur aura son VB propre contenant juste l'altitude + autre donnée propre (couleur par exemple), en double (pour le geomorphing)
->>Texturing
->par secteur
Je le verrais au PS 1.4. Avec ca on peut faire un texture splatting de 4 textures en une passe en encodant les coefficient alpha dans une unique texture ARGB.
Si on se donne une (ou deux) texture pour le plat, une autre pour le moins plat et une derniere pour le carrement raide, alors on doit pouvoir obtenir qqchose de sympa. En faisant varier les facteur de scaling pour le tiling, on devrait limiter l'etirement de textures pour les falaises (eg, les textures pour le carrement raide seront par exemple tilé bpc plus severement que celle pour le plat).
En dernier dans le VS un simple calcul vertex->viewer nous donnera le facteur de transparence a appliquer a la texture detail et voila (ouf).
->inter secteur et LOD
Par inter-secteur, j'entend que vous avez deux secteurs mitoyens A et B, et que les textures de A ne correspondent pas a B (eg celle du plat de A c'est de l'herbe tandis que le plat de B c'est du caillou). Suis pas encore trop sur de mon coup, peut etre a la main sur le CPU.
eg :
A B
la texture de A sera blendé avec celle de B de facon a la jointure A->B se fasse de facon invisible (un gradient +- lineaire, quoi).
Faudra donc se taper un texture cache pour limiter la surconso de memoire
LOD au niveau de la texture, ca serait ptet bete de se calculer tout le splatting pour un secteur bien loin. La peut etre qu'en calculant la texture finale de ce secteur a la main en basse resolution (genre 32x32 ou 64x64) on obtiendrait des resultats pas trop degueu, mais la transition basse qualite->haute qualite risque de se voir...Sais pas encore trop. On peut imaginer remplacer la texture detail par la basse qualite Pour les secteurs a cheval sur les limites et faire la transition via lerp dans les PS (sais pas si je suis clair)
->>A part : Objets divers peuplant nos contrées
-Arbres
Au cas ou, pour les arbres y'a la doc "creation and rendering of realistic trees" qui est pas mal du tout, sinon vous pouvez regarder comment fait gScape (c'est assez simple mais j'aime pas trop, trop long pour pondre un arbre). Ptet que le melange PM pour le tronc/branche + le FSA (foliage simplification algorithme) pour les feuilles devrait donner un lod de bonne facture (avant de retomber sur le billboard), a essayer (je crains les tps de pre-calcul necessaire au deux par contre)
-caillou
La c'est de l'idee maison, mais en utilisant des metaballes y'a pas moy de generer tout une varieté de rocher plus ou moins tordu, voir meme a trou ?
On place plus ou moins aleatoirement des metaballs positive (celle qui augmente la valeur au coins des marching cube), d'autre negatives (pour les trucs), on calcule la normale a chaque vtx, deplace le vertex a cette normale via un fin bruit pour pas avoir un aspect lisse et vogue la galere ! (ou ?). Un PM la dessus parce qu'on le vaut bien et vala !
bon j'en ai fini avec ce paté, l'implementation de la partie geometrique est en cours mais comme dit plus haut je pense pas en avoir termine avant qqjours.....
Idees / commentaires ?
Message édité par chrisbk le 22-07-2003 à 09:01:37