Historique des modifications - Message

Message #4413

Sujet: C++ Moteur de terrain avec pagination


Type Date Auteur Contenu
Dernière modification 21-07-2008 09:34:20 Ikam
Salut

Inspiré par la classe de terrain de Copland http://forum.irrlicht.fr/viewtopic.php?id=336

J'ai créé une classe qui permet d'organiser et de gérer la pagination de plusieurs terrains.

L'intérêt est que l'on peut créé un monde immense divisé en parcelles tout en économisant la mémoire vive consommée puisque seule les parcelles proches de la camera son chargée.

La pagination fonctionne sans thread supplémentaire car j'ai pas juger nécessaire d'en mettre puisque sans ca marche bien et que ça évite tout problèmes liés au threads avec rrlicht. En fait on ne détecte pas de lag pour le chargement des map, si celles-ci sont inférieures ou égales à 257x257 et que l'application est compilé en mode Release (testé sous VC++, faudrait voir si ça passe avec d'autre compilateur). En mode debug on constate un lag.

Le fonctionnement du pager est simple :

  • On lui donne les paramètres et la liste des heightmaps et des colormaps
  • Il organise les map selon une disposition souhaitée (par exemple en carré de 4x4 map)
  • Des zones buffers sont créés à ces endroits et sont destiné à contenir les terrains
  • Si la camera est proche d'une zone on charge le terrain correspondant à la zone (distance reglable)
  • Si la camera s'éloigne d'une zone on decharge le terrain (distance réglable)



J'ai aussi fais quelques modif sur la classe de terrain de Copland telle qu'elle est donnée sur le forum, afin de mieux fonctionner avec le pager et pour corriger quelques bugs :

  • modification du chargement des heightmap pour supporter des tailles de type 2^N+1
  • support en interne des VBO (derniere version irrlicht svn)
  • amélioration de la méthode de rendu et ajout des debug informations
  • ajout du flag ETC_CLAMP pour la texture colormap afin d'eviter les bordures entre les terrains (ne fonctionne pas sous OpenGL, bug ?)
  • suppression du calcul des normals au chargement pour accélérer le chargement
  • correction du calcul de la bouding box du terrain
  • correction d'un bug qui ne mappait pas correctement les coordonnées de texture
  • suppression des fonctions de splatting.


J'ai supprimé le mode de texturing par splatting et son shader car je suis en train de coder un shader plus spécifique qui permettra de melanger jusqu'a 16 textures par terrain avec des alphamaps ou en procedural (splatting).

Sinon il y a quelques bugs et améliorations à apporter :

  • En OpenGL, Il y a un problème de mapping des colormap au niveau des bords des terrains (le flag ETC_CLAMP sensé corrigé le problème ne fonctionne que sous directx)
  • La répartition des terrains est pour l'instant en carré (4x4, 6x6, 16x16, etc...) il ne gere pas encore les répartition du genre rectangle 2x12 ou de forme plus exotique...
  • Les problèmes de leak mémoire semblent être résolus
  • Mieux gérer l'ordre des images dans les listes pour les colormap et les heightmap
  • Les images pour les heightmaps sont des .png qui semble etre le format idéal au niveau compression car le jpg est trop destructeur et la continuité entres les heightmaps est mauvaise ce qui fais appararaitre des trous et des différences de hauteur sur la géometrie au niveau des bordure entre les terrains.


Dans les sources j'ai mis un exemple de comment s'en servir avec des réglages des paramètres qui me semble optimales (au niveau des distances de chargement/dechargment des map et de rendu...). J'ai aussi mis une petite fonction qui permet de découper une grosse image en plusieurs petites afin de passer au TerrainPager une liste de heightmaps et de colormap.


SOURCES


Création du message 21-07-2008 09:00:26 Ikam
Salut

Inspiré par la classe de terrain de Copland http://forum.irrlicht.fr/viewtopic.php?id=336

J'ai créé une classe qui permet d'organiser et de gérer la pagination de plusieurs terrains.

L'intérêt est que l'on peut créé un monde immense divisé en parcelles tout en économisant la mémoire vive consommée puisque seule les parcelles proches de la camera son chargée.

La pagination fonctionne sans thread supplémentaire car j'ai pas juger nécessaire d'en mettre puisque sans ca marche bien et que ça évite tout problèmes liés au threads avec rrlicht. En fait on ne détecte pas de lag pour le chargement des map, si celles-ci sont inférieures ou égales à 257x257 et que l'application est compilé en mode Release (testé sous VC++, faudrait voir si ça passe avec d'autre compilateur). En mode debug on constate un lag.

Le fonctionnement du pager est simple :

  • On lui donne les paramètres et la liste des heightmaps et des colormaps
  • Il organise les map selon une disposition souhaitée (par exemple en carré de 4x4 map)
  • Des zones buffers sont créés à ces endroits et sont destiné à contenir les terrains
  • Si la camera est proche d'une zone on charge le terrain correspondant à la zone (distance reglable)
  • Si la camera s'éloigne d'une zone on decharge le terrain (distance réglable)



J'ai aussi fais quelques modif sur la classe de terrain de Copland telle qu'elle est donnée sur le forum, afin de mieux fonctionner avec le pager et pour corriger quelques bugs :

  • modification du chargement des heightmap pour supporter des tailles de type 2^N+1
  • support en interne des VBO (derniere version irrlicht svn)
  • amélioration de la méthode de rendu et ajout des debug informations
  • ajout du flag ETC_CLAMP pour la texture colormap afin d'eviter les bordures entre les terrains (ne fonctionne pas sous OpenGL, bug ?)
  • suppression du calcul des normals au chargement pour accélérer le chargement
  • correction du calcul de la bouding box du terrain
  • correction d'un bug qui ne mappait pas correctement les coordonnées de texture
  • suppression des fonctions de splatting.


J'ai supprimé le mode de texturing par splatting et son shader car je suis en train de coder un shader plus spécifique qui permettra de melanger jusqu'a 16 textures par terrain avec des alphamaps ou en procedural (splatting).

Sinon il y a quelques bugs et améliorations à apporter :

  • En OpenGL, Il y a un problème de mapping des colormap au niveau des bords des terrains (le flag ETC_CLAMP sensé corrigé le problème ne fonctionne que sous directx)
  • La répartition des terrains est pour l'instant en carré (4x4, 6x6, 16x16, etc...) il ne gere pas encore les répartition du genre rectangle 2x12 ou de forme plus exotique...
  • Les problèmes de leak mémoire semblent être résolus
  • Mieux gérer l'ordre des images dans les listes pour les colormap et les heightmap
  • Les images pour les heightmaps sont des .png qui semble etre le format idéal au niveau compression car le jpg est trop destructeur et la continuité entres les heightmaps est mauvaise ce qui fais appararaitre des trous et des différences de hauteur sur la géometrie au niveau des bordure entre les terrains.


Dans les sources j'ai mis un exemple de comment s'en servir avec des réglages des paramètres qui me semble optimales (au niveau des distances de chargement/dechargment des map et de rendu...). J'ai aussi mis une petite fonction qui permet de découper une grosse image en plusieurs petites afin de passer au TerrainPager une liste de heightmaps et de colormap.


SOURCES



Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
553 invités en ligne
membre en ligne: -
RSS Feed