#0 

14-05-2013 19:57:31

Logeur
Membre
Date d'inscription: 16-11-2012
Messages: 61

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


#1 

14-05-2013 21:27:28

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

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.


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#2 

14-05-2013 21:38:20

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#3 

15-05-2013 20:30:56

Logeur
Membre
Date d'inscription: 16-11-2012
Messages: 61

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


#4 

16-05-2013 09:56:16

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#5 

25-05-2013 16:09:06

Logeur
Membre
Date d'inscription: 16-11-2012
Messages: 61

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


#6 

25-05-2013 19:51:18

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

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
23 invités en ligne
Aucun membre connecté
RSS Feed