#0 

21-07-2008 11:00:26

Ikam
Membre
Date d'inscription: 16-05-2007
Messages: 56
Site web

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


#1 

21-07-2008 15:36:52

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

C'est génial ! Je viens de tester chez moi avec la dernière version svn, ça marche nickel smile

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) :

Code:

    const enum E_TERRAIN_QUALITY
    {
        ETQ_HIGH = 1,
        ETQ_MEDIUM = 2,
        ETQ_LOW = 4,
        ETQ_EXTRALOW = 8
    };

Hors ligne


#2 

10-08-2008 19:49:21

maitrelame12545
Membre
Date d'inscription: 28-11-2006
Messages: 51

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.


Codeur elewendyl

Hors ligne


#3 

11-08-2008 09:28:56

Ikam
Membre
Date d'inscription: 16-05-2007
Messages: 56
Site web

est ce que le bug se produit avec directx ?

Hors ligne


#4 

11-08-2008 13:25:42

maitrelame12545
Membre
Date d'inscription: 28-11-2006
Messages: 51

Oui.


Codeur elewendyl

Hors ligne


#5 

16-12-2008 15:45:51

meg
Petit nouveau
Date d'inscription: 16-12-2008
Messages: 6

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


#6 

16-12-2008 16:11:42

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

il fuat la version 1.5 de irrlicht

Hors ligne


#7 

16-12-2008 16:24:05

meg
Petit nouveau
Date d'inscription: 16-12-2008
Messages: 6

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


#8 

16-12-2008 16:41:29

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

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


#9 

16-12-2008 17:23:05

meg
Petit nouveau
Date d'inscription: 16-12-2008
Messages: 6

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


#10 

16-12-2008 19:05:20

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

meg :

Question certainement un peu bête... c'est quoi les 'vbo' ?


y-a pas de question bête wink

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.


Force et sagesse...

Hors ligne


#11 

26-01-2009 13:26:57

Cpl.Bator
Petit nouveau
Date d'inscription: 25-01-2009
Messages: 3

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


#12 

26-01-2009 13:46:15

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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.


Force et sagesse...

Hors ligne


#13 

25-11-2009 05:02:34

christianclavet
Membre
Lieu: Montreal, Canada
Date d'inscription: 25-11-2009
Messages: 10
Site web

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!


Projet:
The First King
http://first-king.sourceforge.net

Hors ligne


#14 

25-11-2009 13:57:50

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Merci pour les précisions d'adaptation de ce code pour Irrlicht 1.6. wink


Force et sagesse...

Hors ligne


#15 

20-03-2010 14:10:47

iLambda²
Membre
Date d'inscription: 07-02-2010
Messages: 29

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

Code:

CTTileBuffer[i]->Material.TextureLayer[0].TextureWrap = video::ETC_CLAMP;

Il faut mettre

Code:

CTTileBuffer[i]->Material.TextureLayer[0].TextureWrapV = video::ETC_CLAMP;
CTTileBuffer[i]->Material.TextureLayer[0].TextureWrapU = video::ETC_CLAMP;

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
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
90 invités en ligne
Aucun membre connecté
RSS Feed