Bonjour,
Je viens vous demander de l'aide. (oui encore ^^)
Je souhaite créer un ensemble de cube, donc j'utilise les nodes, mais je me suis vite rendu compte que ça consomme énormément de FPS avec seulement 4096 cubes.
Donc je fais appel à vous pour savoir quelle est la meilleure méthode.
J'ai entendu parler du culling qui affiche seulement les blocs visibles, mais apparemment, le culling serai déjà intégré à Irrlicht.
Donc j'ai pensé créer ma propre fonction pour créer un noeud. Mais je pense pas que les noeuds soit la bonne solution ? Ou alors il me faut un bon algo ?
Est ce que les Mesh peuvent réduire la consommation de FPS ?
Ou alors quel moyen utiliser ?
Merci de votre aide
Hors ligne
Salut,
Je pense que le mieux pour toi serait de regrouper tes cubes en un seul mesh une fois chargés.
Un grand nombre d'objets fait appels à plusieurs appels pour le rendu et ça fait tomber le framerate en chute libre.
Tu peux aussi ne pas tous les regrouper mais faire des paquets de 20 cubes par exemple, je pense que ça amortirai déjà pas mal la chose.
Hors ligne
si tu veux faire un truc style minecraft, il faut s'orienter vers les voxels et le marching cubes. Le but, c'est de créer des nodes perso qui contiennent X*Y*Z cubes et de remplir toi-même les buffers de ces nodes. Tu recalcules le contenu de ton buffer que lorsqu'un cube a été modifié. Et tu ne mets dans ton buffer que les Quads (côté de cube) qui sont en contact avec un cube d'air ou transparent. Je l'ai déjà fait pour le fun et j'avais des rendus plus que correct sans utiliser les VBOs ni le shader instancing (environ 1700fps pour 130 000 triangles avec ma GTX480 avec une résolution de 5760x1080).
Hors ligne
Merci de votre aide.
Je vais allez faire des recherches sur vos deux façons de faire.
Si ta GTX480 arrive à faire tourner 130 000 triangles, toutes les cartes graphiques peuvent le faire ou presque x)
Bonne soirée
Hors ligne
Bien sur qu'elles le peuvent avec un framerate moins élevés mais de 1700fps à 60 fps tu as de la marge! Donc une carte bes de gamme est largement suffisante pour tenir autant de poly à 60 fps.
Hors ligne
Bonjour,
Je me suis donc réorienté d'après les conseils de johnplayer. J'affiche donc des faces.
Je cherche à faire en sortes que si deux faces sont en contact alors elles ne s'affichent pas. Comme ça on affiche seulement les faces en contact avec le "vide".
Alors j'ai pensais à un petit algo. Si la faceA a les mêmes coordonnées qu'une autre face alors elle est en contact, donc pas d'affichage. Malheureusement je ne sais pas comment m'y prendre pour faire ça ...
Pouvez vous m'éclairer svp x)
Merci d'avance
Cordialement
Hors ligne
Je t'ai donné la manière, tu dois faire un tableau de u8 contenant le type des cubes. Lorsque tu calcules les faces à afficher d'un cube, tu créé une face si le cube adjacent est un cube d'air. Pour savoir si c'est un cube d'air, tu testes le u8 qui contient le type du bloc adjacent.
On part du principe que l'air à un ID de 0 donc son type a pour valeur u8(0) si tu préfères.
Pour un cluster, tu as 16*16*16 cubes, donc tu dois avoir un u8 TypesCubesCluster[16][16][16] (orientation = [X][Y][Z]).
Tu veux tester le cube à la position [xcurrent][ycurrent][zcurrent], tu t'y prends de cette manière:
Pour chacune des faces, tu testes les cubes adjacents
{
// face du dessus, le cube adjacent se trouve 1 cube plus haut sur y donc Y = ycurrent + 1
Si TypesCubesCluster [xcurrent][ycurrent+1][zcurrent] == u8(0)
{
On calcule les vertex et index de la face en question et on les mets dans le buffer
}
// On fait la même chose pour les cubes adjacents en ycurrent-1, xcurrent+1, xcurrent-1, zcurrent+1 et zcurrent-1
// Ce qui correspond à tes 6 faces
}
Par contre, il y a une chose à prendre en compte. C'est que les cubes qui sont en bords de tableau (une ou plusieurs coordonnées à 0 ou 15) n'ont pas tout leurs cubes adjacents. Il faut donc faire attention de ne pas essayer de lire des valeurs hors tableau. Ceci dit, pour ces derniers, il faudra aller chercher les cubes adjacents dans les tableaux des clusters adjacents s'ils existes. Il faudra donc établir un lien entre les clusters afin de pouvoir y accéder.
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 23 invités en ligne Aucun membre connecté RSS Feed |