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
Dernière modification par Ikam (21-07-2008 11:34:20)
Hors ligne
C'est génial ! Je viens de tester chez moi avec la dernière version svn, ça marche nickel
testé sous VC++, faudrait voir si ça passe avec d'autre compilateur
J'ai compilé avec Mingw, y a juste et 2 p'tits warning sans importance (no new line at end file dans CTerrainPager.h et CTerrainPager.cpp) et un "const" qui lui plaît pas dans le fichier CTerrain.h (suffit de le commenter) :
const enum E_TERRAIN_QUALITY { ETQ_HIGH = 1, ETQ_MEDIUM = 2, ETQ_LOW = 4, ETQ_EXTRALOW = 8 };
Hors ligne
Merci pour le code !
Mais j'ai un petit probleme avec...
Quand j'utilise ton code ca marche nikel mais (et oui y a un mais) quand je l'utilise dans mon applications tout marche bien sauf au moment de decharger un terrain.
Apres quelques minutes de recherches j'ai trouve que le probleme venait de la ligne :
delete zoneList[i]->getObjectInside();
dans CTerrainPager::render().
Si je commante cette ligne tout fonctionne tres bien mais avec la ligne des que je me retrouve a un endroit ou une map doit decharger, boom crash (0xC0000005) -1073741819...
Si vous avez une idee de la provenance du bug ou besoin du code source je vous le fournirez.
Hors ligne
est ce que le bug se produit avec directx ?
Hors ligne
Excellent !!!!!!
J'ai essayé avec Irrlicht version 1.4.0 (je compile avec VC6... une vieille brouette, je sais, mais je suis nostalgique) et j'ai quand même eu des problèmes.....
- Dans CTerrain::~CTerrain(), SceneManager->getVideoDriver()->removeHardwareBuffer(CTTileBuffer[i]); me donne une erreur de compilation : error C2039: 'removeHardwareBuffer' : is not a member of 'IVideoDriver'
- Dans CTerrain::CTerrain() : CTTileBuffer[i]->setHardwareMappingHint(scene::EHM_STATIC); me donne une erreur de compilation : error C2039: 'setHardwareMappingHint' : is not a member of 'CMeshBuffer<struct irr::video::S3DVertex2TCoords>'
Alors est-ce que c'est dû à ma verision de Irrlicht ??? et est-ce que je peux commenter sans autre ces deux lignes ???? (heu, en d'autres mots, elles servent à quoi ???)
Puisqu'on est dans les questions.... je n'ai pas compris pourquoi il y a :
case 2049:
SizeOfTiles=(Size/32)+1;
NbsTiles = 32*32;
break;
parfaitement identique que pour le 1025 ????
Et qqun a-t-il essayé avec de terrains encore plus grands ?????
Merci pour votre aide.
meg
Hors ligne
il fuat la version 1.5 de irrlicht
Hors ligne
pas cool, j'ai pas vraiment envie de virer mon vieux VC6, et encore moins de ralentir encore ma pauvre bécanne avec du .NET :-(
Mais qqun peut me dire à quoi sert ces lignes (removeHardwareBuffer & setHardwareMappingHint) ??? et si je peux m'en passer ???
Hors ligne
sa sere pour les vbo et pas besoin de virer vc6 il faut juste installer la v1.5 comem tu a installer la v1.4 de irrlicht et c'est bon
Hors ligne
heu... si j'installe une version > 1.4, j'ai des paquets d'erreurs de compilation (par exemple : error C2780: 'const T &__cdecl irr::core::min_(const T &,const T &,const T &)' : expects 3 arguments - 2 provided )
donc un peu coincé avec la 1.4 !
Question certainement un peu bête... c'est quoi les 'vbo' ?
Hors ligne
meg :
Question certainement un peu bête... c'est quoi les 'vbo' ?
y-a pas de question bête
Les VBO (vertex Buffer Objects) sont des buffers (zone mémoire si tu préfère) ou sont stockée les géométries de nos modèles 3D.
La particularité de ces buffers, c'est qu'il sont stockés en VRAM. Cela rend leurs accès beaucoup rapide par le GPU par la même,
ce qui est sensé grandement améliorer l'optimisation des rendu en terme de vitesse.
Hors ligne
Sa plante au bout de quelques secondes de voyage dans le monde.
Process returned -1073741819 (0xC00000005) execution time : 15.781 s
Irrlicht 1.5 , code::blocks ,winxp avec drivers ogl pour l'application Irrlicht.
@+
Hors ligne
Chez moi cela fonctionne, par contre je suis sous XP ou Vista et je passe par VisualStudio et DX.
PAr contre il me semble qu'il y a un topic la dessus sur le forum off, moteur de terrain + OGL avec la version 1.5 et les soucis rencontrés.
Hors ligne
Merci pour le code IKAM, J'ai réussi à le recompiler sans trop d'efforts sour IRRlicht 1.6 et j'atteind un framerate de plus de 700FPS sur ma carte vidéo.
J'ai compilé avec VC++ 2008 Express sous Vista.
Les lignes que j'ai du changer pour que ça fonctionne bien:
Ligne 25 de main.cpp (datatype as changé je crois)
core::dimension2di dim;
par
core::dimension2d<u32> dim;
Ligne 114 de main.cpp (Caméra trop rapide en mouvement)
scene::ICameraSceneNode * cam = smgr->addCameraSceneNodeFPS(0,100,100);
par
scene::ICameraSceneNode * cam = smgr->addCameraSceneNodeFPS(0,100,0.5f);
Ligne 192 de main.cpp (PEut-être un bug ici, true devrait être bon, j'ai du convertir le type de donnée pour que ça compile)
driver->setFog(fogColor, true , minFog, maxFog);
par
driver->setFog(fogColor, (irr::video::E_FOG_TYPE)true , minFog, maxFog);
Une fois ces changements effectués ton code compile très bien ici. J'ai hête de voir comment tu va intégrer le splatting à 16 textures que tu parlais!
Hors ligne
Merci pour les précisions d'adaptation de ce code pour Irrlicht 1.6.
Hors ligne
Une petite correction : Je suis sour IrrLicht 1.7, tout fonctionne a merveille. Mais je bosse sous OpenGL, et les bordures entre les terrains me dérangeaient... Dans CTerrain.cpp, au lieu de commenter
CTTileBuffer[i]->Material.TextureLayer[0].TextureWrap = video::ETC_CLAMP;
Il faut mettre
aux deux endroits ou ca coince ! Et apres plus aucune bordure !
Je tiens a te remercier pour ton superbe travail, et sur mon NetBook j'arrive a tourner a 100 FPS ! Bravo a toi !!
Dernière modification par iLambda² (20-03-2010 15:12:57)
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 68 invités en ligne Aucun membre connecté RSS Feed |