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 :

VBO vraiment plus rapide ?


Sujet :

OpenGL

  1. #1
    Membre régulier Avatar de lXT95l
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 106
    Points : 116
    Points
    116
    Par défaut VBO vraiment plus rapide ?
    Bonjour a tous, je me retrouve face a un nombre de fps tres bas avec une ptite heightmap et 3 arbres :/ !
    Apparement les vbos me permettrais de gagner beaucoup ! Mais voila apres une bref recherche je n'ai trouvé que peux de doc et I speak not english !
    Donc je voudrais savoir si il y a des trucs primordiale a changer ds un code comme celui ci :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
     
     
    void CTerrain::Init()
     
    {    
     
        //Init Display list
     
        MapList=glGenLists(1);     
     
        glNewList(MapList,GL_COMPILE);
     
        // On configure la texture principale
     
        glActiveTextureARB( GL_TEXTURE0_ARB );
     
       	glEnable(GL_TEXTURE_2D);
     
    	glBindTexture(GL_TEXTURE_2D, texture[1]);
     
        // On configure la texture de détail
     
        glActiveTextureARB( GL_TEXTURE1_ARB );
     
        glEnable (GL_TEXTURE_2D);
     
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     
    	glBindTexture(GL_TEXTURE_2D, texture[0]);
     
    	// On dessine la scene
     
        glPushMatrix();
     
        glTranslated(posX,posY,posZ);
     
        int xx,yy;
     
     
     
        for (int mapX = 0; mapX < taille/hprecision; mapX++)
     
        {
     
         for (int mapZ = 0; mapZ < taille/hprecision; mapZ++)
     
         {
     
             if (mapX>0 && mapZ>0)
     
             {
     
             glBegin(GL_TRIANGLE_STRIP);
     
             glMultiTexCoord2fARB( GL_TEXTURE1_ARB,double(mapX/reptexture),double(mapZ/reptexture));
     
             glMultiTexCoord2fARB( GL_TEXTURE0_ARB,double(mapX/(taille/hprecision)),double(mapZ/(taille/hprecision)));
     
             glVertex3f((mapX*hprecision*size),hmap[mapX][mapZ]/hautmap*size,(mapZ*hprecision*size));
     
     
     
             glMultiTexCoord2fARB( GL_TEXTURE1_ARB,double(mapX/reptexture),double(mapZ/reptexture-1/reptexture));
     
             glMultiTexCoord2fARB( GL_TEXTURE0_ARB,double(mapX/(taille/hprecision)),double(mapZ/(taille/hprecision)+1/(taille/hprecision)));
     
             glVertex3f(float(mapX*hprecision*size),hmap[mapX][mapZ+1]/hautmap*size,((mapZ+1)*hprecision*size));
     
     
     
             glMultiTexCoord2fARB( GL_TEXTURE1_ARB,double(mapX/reptexture+1/reptexture),double(mapZ/reptexture));
     
             glMultiTexCoord2fARB( GL_TEXTURE0_ARB,double(mapX/(taille/hprecision)+1/(taille/hprecision)),double(mapZ/(taille/hprecision)));
     
             glVertex3f(float((mapX+1)*hprecision*size),hmap[mapX+1][mapZ]/hautmap*size,(mapZ*hprecision*size));
     
     
     
             glMultiTexCoord2fARB( GL_TEXTURE1_ARB,double(mapX/reptexture+1/reptexture),double(mapZ/reptexture-1/reptexture));
     
             glMultiTexCoord2fARB( GL_TEXTURE0_ARB,double(mapX/(taille/hprecision)+1/(taille/hprecision)),double(mapZ/(taille/hprecision)+1/(taille/hprecision)));
     
             glVertex3f(float((mapX+1)*hprecision*size),hmap[mapX+1][mapZ+1]/hautmap*size,((mapZ+1)*hprecision*size));
     
             glEnd();       
     
             }
     
         }
     
        }
     
     
     
        glPopMatrix();
     
        glActiveTextureARB( GL_TEXTURE1_ARB );
     
        glDisable(GL_TEXTURE_2D); 
     
        glActiveTextureARB( GL_TEXTURE0_ARB );
     
        glDisable(GL_TEXTURE_2D);
     
     
     
        glEndList();
     
    }
     
     
     
    void CTerrain::Look()
     
    {
     
         glCallList(MapList);     
     
    }
    Par exemple gerer le multitexturing sa va etre possible ?
    Je stocke mes vertex dans un tableau a 2 dimensions (hmpa[][]) serait il plus simple de faire un tableau a une dimension ?
    Merci d'avance !
    #opengl@irc.epiknet.net

  2. #2
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut


    http://www.google.fr/search?hl=fr&q=...chercher&meta=

    Septiemme lien, autrement dit, celui-ci:
    http://www.g-truc.net/article/vbo-fr.pdf

    J'ai appris avec ça, et je m'en sors pas trop mal.

    Oui les VBO augmente pas mal la rapidité de rendu, mais ne sont pas du tout adaptés sur certaines cartes graphiques! J'ai un ami avec une Xpress200 (sur PC portable) et les vbos marchent... moyennement, les display lists sont plus efficaces.
    Le mieux est donc de récupérer le modèle de la carte graphique, et de savoir (là il faut soit tester, soit trouver un endroit où il y a une petite description pour chaque modèle) quels modèles sont moyennement optimisés avec les VBOs. (dépend surtout de la taille de la VRAM je crois)

    Si tu charges les extensions avec glew:
    glewIsSupported("GL_ARB_vertex_buffer_object"); (retourne une valeur de type... int je crois)

    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par lXT95l
    Par exemple gerer le multitexturing sa va etre possible ?
    Je me posais la question aussi, je supposais que le principe devait être le même que quand t'utilises des fonctions utilisant des tableaux.
    En activant l'unité de texture à laquelle tu veux donner ces coordonées avant de faire le glTexCoordPointer().Quelqu'un peut me dire si je suis dans le vrai ou si j'ai rien compris
    En tout cas merci pour le .pdf, c'est vraiment utile

  4. #4
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut
    Euh, utile tu parles, je viens de me rendre compte que mon programme tourne plus vite en display lists qu'en VBOs
    Pourtant j'ai quand même une 6600GT...

    Soit le tuto est pas très bon, soit j'ai vraiment rien compris et j'utilise les VBOs comme un gros nul
    Je vais essayer une autre méthode demain... Je vous tiendrai au courant

    Pour ce qui est du multi texturing, je me suis aussi posé la question, mais j'ai vaguement cru comprendre que les données concernant les textures pouvaient êtres envoyées "par 4". : u, v, w, ?
    Il me semble qu'une des composante définit l'unité de texturage active, mais j'en suis vraiment pas sûr du tout :/

  5. #5
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Salut !

    Il me semble qu'une des composante définit l'unité de texturage active
    Attention les quatres composantees définissent des coordonnées de textures !

    Pour changer le niveau de texture courant tu dois appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glClientActiveTextureARB (GL_TEXTUREnuméro);
    exemple : glClientActiveTextureARB(GL_TEXTURE2);

    Pour info,
    les trois première coordonnées de textures correspondent aux coordonnées des textures 3D (il s'agit donc de s, t, et u)
    La dernière (v) correspond à la coordonnée homogène. Donc si ta texture à pour coordonnée :
    (1.0, 1.0, 1.0, 2.0)
    ses vrais coordonnées sont (1.0/2.0, 1.0/2.0, 1.0/2.0) = (0.5, 0.5, 0.5)

    @+
    Mieux vaut prévoir que patcher.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 118
    Points : 118
    Points
    118
    Par défaut
    Je ne sais pas les test que vous avez effectuer mais les VBO sont plus rapide si l'on a créer un gros batch de donnée(c'est a dire qu'on à pas créer un VBO avec 4 vertex mais 10000 par exemple).

    Les VBO peuvent etre STATIC ou alors on peut les placé comme les display list mais leur autre avantage est qu'il peuvent etre déclaré comme dynamique afin de pouvoir modifier les donnée en temps réel en gardant une bonne rapidité. On peut de plus demandé au driver de s'occupé de leur allocation(le driver décide si on les met en mémoire GPU, system, etc).

    Voilà

    PS : pour la doc voir le site de nvidia pour les développeurs.
    JC est bien notre dieu...(non non pas jesus christ mais John Carmack!!!)

Discussions similaires

  1. Réponses: 15
    Dernier message: 28/09/2009, 11h29
  2. Réponses: 10
    Dernier message: 06/08/2009, 20h18
  3. Réponses: 8
    Dernier message: 19/12/2006, 13h15
  4. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 00h16
  5. Réponses: 8
    Dernier message: 31/10/2003, 16h21

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