Salut,
Alors comme certains ont pû le remarquer, Irrlicht limite la taille de ses terrains a une HeightMap de 256*256 maximum.
Etant moi même un amoureux de beaux landscapes, j'étais bien embeté par cette limite.
Je me suis donc demandé pourquoi une telle limite ? Et surtout qu'elle en était la cause ?
Mes premières remarques :
un terrain de 256*256 si on multipli ça fait du .... heu attendez voir .... 65536!! Roooo tiens ça me rappele un truc mais je sais plus quoi..... et puis soudain! Oui je sais, c'est une limite de dimension mais alors pourquoi sur d'autre moteur j'ai pas eu se genre de problème ?
Bein là j'ai cherché un petit moment avant de m'appercevoir qu'en fait le moteur d'irrlicht utilisait des Array de 16 bits et donc limité à 65535...Et oui pas évident de faire le raprochement quand on débute le C++.
Donc je me suis mis en quete des petits u16 qui trainaient autour du moteur de rendu de directx9 puis ensuite opengl,software,sofwtare2 (que du bonheur)....
Puis j'ai tranquillement attaqué la modif en commentant systématiquement la ligne modifié pour avoir la source originale en cas d'erreur et pouvoir revenir rapidement en arrière.
Donc après plusieurs petites heures de "conversion" et recherche, je vous propose d'essayer un terrain rendu avec le moteur de terrain d'irrlicht (sur lequel pour l'instant je n'ai rien modifié) et qui utilise une HeightMap de 512*512.
Et par la même occasion j'espère avoir vos éventuels retour de bugs .
Donc voici le liens pour le télécharger :
Telecharger ici
Voilou par avance merci pour les retour atelier et @ bientôt .
Hors ligne
En fait je viens de m'appercevoir se matin qu'il y a un gar sur le site officiel qui a fait la même chose .. Mais bon dans mon cas je sais maintenant comment c'est fait, et je sais surtout que ça a pas été fait à l'arrache ^^.
Hors ligne
Bravo !
Très intéressante modif.. J'espère que l'irrlicht officiel et sa limite honteuse de 256² pour les heigtmaps saura évoluer en ce sens
Hors ligne
j'ai testé sous windows (Centrino 1.7 ghz Ati X600 )
ca fonctionne partout : opengl, direct3d, et software, etc ..
par contre j'ai une erreur en console avec Direct3D 9.0, (mais le rendu se fait correctement)
Irrlicht Engine version 1.2 Microsoft Windows XP Personal Service Pack 2 (Build 2600) Using renderer: Direct3D 9.0 ATI MOBILITY RADEON X600 SE ati2dvag.dll 6.14.10.6561 Could not load shader function D3DXAssembleShader from dll, shaders disabled: d3 dx9_31.dll Could not create vertex shader. Could not create vertex shader. Could not create vertex shader. Could not create vertex shader. Could not create vertex shader. Could not create vertex shader. Loaded texture: media/irrlichtlogoalpha.tga Generated terrain data (512x512) in 0.0000 seconds Loaded texture: media/color.jpg Loaded texture: media/detail.jpg Loaded texture: media/irrlicht2_bk.jpg Loaded texture: media/irrlicht2_ft.jpg Loaded texture: media/irrlicht2_rt.jpg Loaded texture: media/irrlicht2_lf.jpg Loaded texture: media/irrlicht2_dn.jpg Loaded texture: media/irrlicht2_up.jpg
ensuite, j'ai la vague impression que les altitudes sont mieux percues, mais il est tres possible que ce soit du a la qualité du rendu et l'utilisation des shaders
la camera se bloque souvent sur le terrain si on essaie de marcher dessus, mais il est probable que ce soit du a une ellipse du collision response animator trop petite
si tu as un binaire ou le code source, je testerai sous linux
petite question : la taille de la height map améliore elle le rendu graphique ? ou sert elle aussi au collision response animator ? ou uniquement au fonctionnement du programme qui se déroule derriere (poser des objets sur la map etc) ?
est ce que cette modification est susceptible d'accelerer le programme ? ou (plus logiquement) de le ralentir ? dans quels cas ?
Dernière modification par Jerry Kan (06-01-2007 11:35:04)
Hors ligne
Salut Jerry Kan
Tout d'abord pour le shader, c'est interne à Irrlicht et je l'ai compilé avec le dernier sdk de dx9 donc vérifi que t'a bien la dll d3dx9_31.dll dans C:\Windows\system32 auquel cas installe le dernier directx 9 .
Ensuite si la camera se bloque souvent, ce n'est pas dû à mes modifs je te rassure desuite, le problème existe également sur le sdk non modifié.C'est un bug des collisions dans le TriangleSelector je pense.
Pour linux je compilerai également une version afin que tu puisses tester aussi.
La taille de la heightmap permet surtout d'avoir un terrain plus grand et donc plus détaillé avec plus de collines etc...
Et pour finir, la modification n'est pas succesptible d'améliorer le programme, au contraire cela doit même alourdir la charge.
Mais c'est logique, un programme tournant avec des indices 16 bits prendra 2 fois moins de charge qu'un programme tournant en indices 32 bits.Mais théoriquement, cela ne devrait pas faire chuter le fps, ou si peut que cela en vaut vraiment la peine à mon avis.
Sinon je vais regarder plus pret du côté du moteur de terrain car je le trouve particulièrement lent.Si y'avait une optimisation à y faire ça pourrait être bien sympa aussi...
Voilou merci pour le retour et @+
Hors ligne
Le rendu est vraiment magnifique !
Quel est le rôle du shader dans ce rendu ? En ce moment je m'intéresse vraiment à GLSL donc je suis curieux de voir ce que l'on peut réellement faire avec.
Hors ligne
Les textures sont pas de moi et il n'y a aucune utilisation de shader de ma par, probablement en interne irrlicht les utilises .....
Si tu trouves se land magnifique, bein tu vas pleurrer le jour ou je vais en sortir un vrai ^^.
Pour l'instant j'essai de voir les améliorations qu'il y aurrait moyen de faire au moteur de terrainn mais c'est pas gagné .
Hors ligne
Je croyais que tu utilisais un shader car comme Jerry Kan j'ai le message "Could not create vertex shader." avec DX9. Mais c'est vrai que ma version de DX n'est pas à jour (je bosse exclusivement avec OpenGL)
Hors ligne
Salut,
J'ai la même chose à développer pour mon projet en ce moment, à la différence que le terrain fait 100 000 x 10 000
J'ai donc dû tout recoder et au final, ça affiche une profondeur de champ assez impressionante pour pas mal de FPS (je te l'avais montré Copland, il y a quelques temps).
Pourquoi je dis ça ? Pour dire que le Terrain scene Node est une relique à mes yeux, peut-être en recoderai-je un meilleur sur le wrapper (celui que j'ai fait ne colle qu'à mon projet en réalité), mais j'encourage ceux qui le peuvent à le faire.
Hors ligne
tu optimises comment avec une taille pareille? octree? quadtree?
Hors ligne
Déjà, tu t'imagine que je n'affiche pas tout en même temps, tout est séparé en petits terrains carrés, comme ceux d'Irrlicht (donc quadtree), je n'ai pas de screenshots sous la main mais la profondeur vaut environ 5*5 terrains (centrés sur la position de la caméra) donc les terrains affichés sont 1 + 2 + 3 + 4 = 10 terrains.
Ensuite, j'aurais pu faire comme Irrlicht une belle méthode de LOD généré au moment du rendu. Mais j'ai plutôt choisi d'utiliser plus de RAM et moins de CPU. Ainsi, je "prégénère" 10 MeshBuffers de LOD et j'en choisis un au rendu. Je n'ai plus les nombres sous la main mais c'était du genre max = 30K polygones, min = 128 polys. Le résultat à mes yeux était plus que bon, et le LOD lointain rajoute *presque* du réalisme -si si !- avec le brouillard. Si on reprend le calcul du début ça fait du genre 30K + 5K * 2 + 500 * 3 + 100 * 4 = 41 900 polygones pour un terrain complet. C'est beaucoup mais c'est pas si grand quand on sait qu'on peut faire varier beaucoup de paramètres selon la machine par exemple... et le rendu donne une profondeur de vision très grande -trop, ça devient irréaliste à la fin .
PS : Si vous voulez, je vous uploaderai une (vieille, crash du portable oblige) version de démonstration que j'avais faite.
Dernière modification par DeusXL (18-01-2007 16:51:38)
Hors ligne
T'entends quoi par ton "prégénère"?
En gros c'est du lod semi-précalculé ?
Hors ligne
si j'ai bien compris l'explication de DeusXL, il se demerde pour generer le pack de mesh en fonction de la distance, pour pouvoir choisir au cas par cas lequel afficher. Effectivement ça requiert de stocker pas mal en RAM (je parle de façon purement théorique hein, intuitivement là comme ça) vu qu'il genere ça en amont de l'affichage, et qu'a priori, il ne fait que piocher dans ce buffer de mesh pour gerer son LOD.
C'est effectivement plutot bien vu
Hors ligne
=> Ravine, c'est exactement ça. Oui, la prise de RAM est largement plus grande, mais si tu vois, au final beaucoup de LOD ne font que 500 polys ou à peine plus alors ça prend pas tant que ça. Là où ça fait plus mal c'est à la génération qui prend plus longtemps.
Hors ligne
Je suis très très très (ça suffit ?) intéressé par ta proposition de démo DeusXL ! (et certainement pas le seul dans ce cas !)
Hors ligne
Voilà j'ai uploadé une vieille vieille version sur http://deusxl.free.fr/Permasoft
Autant vous prévenir, j'avais amélioré le look largement depuis mais tout est sur mon disque dur de portable et j'attends de le récupérer.
Hors ligne
Est-ce un bug connu ?
En tout cas le terrain à l'air immense, et l'eau est magnifique. Beau travail !
Hors ligne
Ce n'est pas un bug, il utilise un systeme de terrain tile et avec le Lod il a des "cracks", c'est super connu comme problème ça.
La solution pour y remédier (je présume que ça a été fait) c'est de rajouter des vertexs entre et créer des faces, mais c'est très couteux en therme de FPS.
Y'a d'autres solutions comme celle qu'on appele les "jupes" mais je connais pas plus que ça le système.
Hors ligne
Alors Copland a tout bon sauf que je dirais que pour la démo on a besoin de rien.
C'est juste une démo qui utilise un terrain (et qui ne correspond pas du tout) copié à l'infini. Le but était juste de montrer des terrains collés les uns aux autres à l'infini, j'étais parfaitement conscient de ce bug.
PS Copland : Pour remédier au problème des terrains qui ne collent pas, on peut faire plusieurs techniques qui n'ont pas d'effet sur le FPS. Par exemple, appliquer un filtre au moment où on lit l'image en la liant à sa voisine. Concrètement, ça voudrait dire dans cette image réduire la hauteur des derniers polys du terrain de gauche et augmenter celle du terrain de droite. De plus, en règle générale, quand le terrain est bien conçu on n'a même pas à appliquer quoi que ce soit, la jointure se fait d'elle-même.
Hors ligne
Je suis déçu que ma carte ne supporte pas les shaders car impossible d'apprécier le compte tenu de ta démo de terrain évolué !
(Le terrain est tout noir chez moi arggg)
Hors ligne