#1 

14-05-2013 17:57:31

Logeur
Membres
Avatar de Logeur
Date d'inscription:
Messages: 61
IP: 109.10.50.185
Courriel

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


#2 

14-05-2013 19:27:28

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 109.223.36.58
Courriel  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


#3 

14-05-2013 19:38:20

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.85.95
Courriel

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


#4 

15-05-2013 18:30:56

Logeur
Membres
Avatar de Logeur
Date d'inscription:
Messages: 61
IP: 109.10.50.185
Courriel

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


#5 

16-05-2013 07:56:16

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.85.95
Courriel

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


#6 

25-05-2013 14:09:06

Logeur
Membres
Avatar de Logeur
Date d'inscription:
Messages: 61
IP: 109.10.50.185
Courriel

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


#7 

25-05-2013 17:51:18

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.216.105
Courriel

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é
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
167 invités en ligne
membre en ligne: -
RSS Feed