IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Affichage des voxels


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Par défaut Affichage des voxels
    Bonjour,
    je suis en train de créer un petit programme qui doit afficher une sorte de paysage avec des voxels le problème c'est que ça rame pas mal .
    Je stock la position de mes voxels dans un tableau de 3 dimensions niveau mémoire c'est nul je sais, parce qu'il y a du vide et du coup je perds de la mémoire pour rien.

    Du coup j'ai fais une première optimisation
    J'affiche seulement ceux que j'ai besoin d'afficher donc ceux qui ont au moins un voisin vide , en clair je n'affiche pas un voxel si il est entouré de voxels ça sert à rien vu qu'on le voit pas de toute manière mais ça rame toujours, un peu moins mais ça rame bien comparé à ça :[ame="http://www.youtube.com/watch?v=f1ZjAIc0Gak"]Voxel Engine Test - YouTube[/ame] pourtant j'ai moins de voxel que ça j'en ai 147094 et j'en affiche 40050 pourtant c'est pas fluide du tout

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 169
    Billets dans le blog
    155
    Par défaut
    Bonjour,

    Peut être en rajoutant du frustrum culling (affiche des éléments uniquement s'ils sont dans le champ de la camera). De plus, bien vérifié qu'il y a du backface culling d'actif. Et après, on pourrait afficher que les cubes réellement visible (donc que ce qui sont à la surface).
    Ensuite il faudra profiler le code pour savoir ce qui rame vraiment. J'entends aussi par là, un profiling GPU, car il se peut que vous bourriner la bande passante ou un des niveaux du pipeline et que c'est ce qui provoque les ralentissements.
    Finalement, l'affichage des FPS dans la vidéo, ça serait cool, car j'ai eu du mal à me rendre compte des ralentissements.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Par défaut
    la vidéo que j'ai mis ici c'est pas de moi . J'aimerai avoir quelque chose de ce style ça ne rame pas etc .

    Pour l'instant j'ai un bloc de 100*20*100, et j'affiche que ceux qui sont visibles donc juste les y ==19 et les y==0 donc j'ai 100*100*2 ... qui sont d'affichés 20000 c'est pas beaucoup pourtant je rame bien

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 169
    Billets dans le blog
    155
    Par défaut
    Utilisez vous de l'instanciation ? Quel est la technique pour envoyer les données au GPU, pour les mettre à jour et pour les afficher ?
    Sur le forum, une discussion sur l'affichage a déjà eu lieu, il y a un an.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Par défaut
    je code en java :

    pour afficher un cube je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    gl.glBegin(GL2.GL_QUADS);
     
            gl.glNormal3f(0,1,0);
            gl.glVertex3f(-1,0,1);
            gl.glVertex3f(1,0,1);
            gl.glVertex3f(1,0,-1);
            gl.glVertex3f(-1,0,-1);
     
     
          .
          .
          .
          gl.glEnd();

    je fais un simple parcours d'un tableau de 3 dimensions et si je dois mettre un carré de construit un carré

    dans ma fonction pour gérer la mise à jour j'utilise un système de liste
    là le code c'est pour afficher juste un carré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if(!listecreee){
     
            	id_liste=gl.glGenLists(1);
     
            	gl.glNewList(id_liste,GL2.GL_COMPILE_AND_EXECUTE);
     
            	carre(gl);
     
            	gl.glEndList();
     
            	listecreee=true;
     }else{
     
            	gl.glCallList(id_liste);
     
     }
    ici la fonction carre(gl) fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    gl.glBegin(GL2.GL_QUADS);
     
            gl.glNormal3f(0,1,0);
            gl.glVertex3f(-1,0,1);
            gl.glVertex3f(1,0,1);
            gl.glVertex3f(1,0,-1);
            gl.glVertex3f(-1,0,-1);
     
     
          .
          .
          .
          gl.glEnd();

    du coup pour afficher mes carrés je fais ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //initialisation
    j'ai une int [][][]map;
     
    map=new int [100][20][100];
     
    je mets un 1 dans map[x][y][z] si je veux afficher un carré


    ensuite

    dans la fonction d'affichage+(mise à jour)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    if(!listecreee){
     
            	id_liste=gl.glGenLists(1);
     
            	gl.glNewList(id_liste,GL2.GL_COMPILE_AND_EXECUTE);
     
                    for(int x=0;x<100;x++){
                         for(int y=0;y<20;y++){
                             for(int z=0;z<100;z++){
     
                                 if(map[x][y][z]==1&&SI_JE_DOIS_LAFFICHER){
     
     
                                    //translation + couleur 
            	                carre(gl);
                                 }
                             }
                         }
                    }
     
            	gl.glEndList();
     
            	listecreee=true;
     }else{
     
            	gl.glCallList(id_liste);
     
     }
    ici la condition SI_JE_DOIS_LAFFICHER c'est si par exemple un carré est entouré de carré ça sert à rien de l'afficher puisque qu'on le voit pas .

    //translation + couleur, c'est pour dire que je fais une translation + coloration avant d'appeler la fonction carre

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Salut

    Va pas chercher plus loin. Tu utilises le mode direct (glBegin/glEnd et les display array), tu renvoies toutes tes données à chaque mise à jour. C'est une technique qui doit être plus vieille comme moi. Regarde du côté des Buffer Object. Change de tutos et utilise au moins OpenGL 2 en core profile.

    Pour les techniques d'instanciation : http://blog.developpez.com/gpu/p1081.../instanciation (C++ OpenGL)
    J'arrive à afficher 10000 cubes avec un 8600M GT et plus de 400000 avec une GTX 460, sans culling. Pour le colling côté GPU, regarde du côté des geometry shader : http://blog.developpez.com/gpu/p1077...ometry_shaders

Discussions similaires

  1. Question sur l'affichage des voxels
    Par ToTo13 dans le forum OpenGL
    Réponses: 1
    Dernier message: 22/03/2006, 12h56
  2. affichage des pièces jointe sous outllook 2000
    Par darkbm dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 29/10/2003, 12h32
  3. Réponses: 1
    Dernier message: 06/03/2003, 12h57
  4. Forcer l'affichage des dizaines...
    Par pataluc dans le forum Langage
    Réponses: 4
    Dernier message: 26/11/2002, 20h38
  5. [VB6] [Flexgrid] Format d'affichage des numériques
    Par yansolo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/10/2002, 22h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo