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 :

Dynamic VBO???


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut Dynamic VBO???
    Salut,
    est-ce que qqun a un lien ou peut m'expliker comment marchent les VBO dynamiques?
    Le truc c'est que j'ai des unités à rendre(~500/frame on va dire) et chaque unité a une animation différente (chacune peut etre à une frame différente dans l'animation) donc il faudrait mettre à jour à chaque frame le vertex buffer des 500 unités. Est-ce que ça vaut le coup dans ce cas d'utiliser les VBOs? Est-ce que j'ai complètement faux sur l'utilisation des VBOs dynamiques (ce qui est très probable )?
    Merci de vos réponses

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Il y a le tutorial 45 de nehe qui traite des VBO :
    http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45

    tu remarqueras la déclaration du vertex buffer avec la ligne :
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*2*sizeof(float), m_pTexCoords, GL_STATIC_DRAW_ARB );

    GL_STATIC_DRAW_ARB indique que le buffer est statique, ce qui permet à opengl de savoir qu'il peut l'optimiser, il perd donc un peu de temps au début pour en gagner
    utiliser GL_DYNAMIC_DRAW_ARB permet d'utiliser le buffer en dynamique

    Tu peux générer un VBO statique pour les indices de points puisqu'ils ne changent pas
    et un VBO dynamique pour les coordonnées de points que tu vas modifier à chaque frame
    regardes aussi pour les normales, les coordonnées de texture, etc savoir combien de buffers tu dois utiliser et si tu peux mixer des données dans un buffer pour éviter en créer plus que 2

    si l'anglais ne te fait pas peur (ce qui est conseillé en prog ) lis la doc sur l'extension VBO :
    http://oss.sgi.com/projects/ogl-sample/registry/ARB/vertex_buffer_object.txt
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Note: Les VBO font partie d'une extension somme toute assez récente bien qu'acceptée en 2003 par l'ARB

    cette extension fait partie d'opengl 1.4 et comme toutes les extension il faut vérifier qu'elle est disponible

    si ce n'est pas le cas, il faut donc utiliser une autre méthode
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut
    ok merci shenron je vais lire ça
    Voila ce ke j'ai dans ma boucle de rendu de chake unité:

    glEnableClientState( GL_VERTEX_ARRAY );
    if( VBOSupported ){
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOindex );
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, 3*pFrame->numOfFaces*3*sizeof(float), pFrame->pVertexs, GL_DYNAMIC_DRAW_ARB );

    glVertexPointer( 3, GL_FLOAT, 0, (char*)NULL);
    glDrawArrays( GL_TRIANGLES, 0, 3*pFirstFrame->numOfFaces );
    }
    glDisableClientState( GL_VERTEX_ARRAY );

    ça affiche bien l'unité (pas texturée c normal) mais au bout de peu près 7-8 secondes ke l'unité est rendue j'ai une grosse Segfault qui disparait si j'enleve le glBufferDataARB . A koi ça peut etre du (gdb ne me dit rien d'intéressant)?

  5. #5
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Dans le tutorial de Nehe c'est un VBO static qui est utilisé, pour passer le VBO en dynamique il faut utiliser GL_DYNAMIC_DRAW_ARB dans la fonction glBufferDataARB (au lieu de GL_STATIC_DRAW_ARB)

    jusque là ok, tu l'as compris, seulement dans la doc il est question que glBufferDataARB génère en mémoire un bloc de données, une copie du buffer que tu transmet (pFrame->pVertexs dans ton exemple)

    tu ne dois donc pas utiliser glBufferDataARB à chaque frame mais uniquement à l'initialisation
    bon ok je t'ai surement induit en erreur

    il faut donc, pour chaque frame, accéder au buffer en mémoire vidéo avec la fonction :
    GLvoid* glMapBufferARB(GL_VERTEX_ARRAY_ARB, GL_WRITE_ONLY_ARB);

    le pointeur renvoyé pointe sur les données qui ont étés transmises par glBufferDataARB, il reste à les modifier en remplissant avec les nouvelles coordonnées

    ensuite il faut utiliser
    glUnmapBufferARB(GL_VERTEX_ARRAY_ARB);
    afin de dire qu'on en a terminé avec les modifs et redonner la main à opengl sur le buffer (sinon plantage méchant)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut
    Ok nikel jte remercie , je teste ça dès que possible et jte dis comment ça tourne

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut
    bon en fait ce qui faisait planter c un appel à glDrawElements dans ma classe d'octree, je comprends pas trop pourquoi l'appel à glBufferDataARB fait planter glDrawElements mais bon... en fait je pense que c'est parceque il tente d'afficher le dernier truc bindé en mémoire (soit mes unités avec le glBindBufferARB) dans le glDrawElements de l'octree (batiments)qui est dans une displaylist... comment je fais pour dire que je me sers plus des données mises en mémoire avec glBufferDataARB (genre une sorte de unbind) ?
    merci

  8. #8
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    tu dois utiliser une fonction glDeleteBuffersARB pour libérer tes buffers une fois que tu n'en a plus besoin
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut
    ok ça marche mieux comme ça merci
    euh par contre je suis repassé en static pour les vertex buffer parceke les transfers de données coutaient trop en dynamique car il fallait changer pour chaque unité à chaque frame tous ses points (galère!) donc la j'ai un vertex buffer par frame ke je bind selon l'anim de l'unité. Par contre du coup chui obligé de passer par CG pour l'interpolation et c'est la que j'ai quelque problèmes. as-tu une idée de comment s'y prendre ? parceque la avec glDrawElement tous les points sont affichés d'un coup donc impossible d'interpoler chaque point un à un avec la frame suivante

  10. #10
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Désolé je ne connais pas CG et en plus je l'aime pas
    et puis CG il existait pas à l'époque Quake2 où étaient utilisés les MD2

    les transfers de données coutaient trop en dynamique car il fallait changer pour chaque unité à chaque frame tous ses points
    C'est pas ce que tu fais en CG recalculer tous les points ?
    quand tu dis que les transferts de données coutent trop, c'est que ça rame ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut
    ben disons ke vu ke chui obligé de parcourir tous les points de la frame pour l'envoyer au vertex buffer, et du coup ben le temps de rendu (transfer compris) devient aussi lent (voir plus) ke le mode immédiat donc j'ai rien gagné
    Merci pour tes réponses ça m'a bien éclairé sur les VBOs

  12. #12
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Si c'est + lent je me demande si tu utilises correctement les VBO
    tu pourrais me montrer les commandes que tu utilises à chaque frame ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 53
    Par défaut
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, pFrame->VBO_ID );
    Vector3D *data = (Vector3D*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);

    for(...) //Parcours de tous les points (peut etre essayer avec memcpy)
    data[i] = pNextFrame->pVerts[i];

    glUnmapBufferARB(GL_VERTEX_ARRAY_ARB);

    //affichage du buffer object
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, pFrame->VBO_ID );
    glVertexPointer( 3, GL_FLOAT, 0, (char*)NULL);
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOindex );
    glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
    glDrawElements(...);

    Voila j'ai pas ecore essayé le remplacement de tous les points avec memcpy voir ce ke ça donne ...

Discussions similaires

  1. [C#] User Control dynamic
    Par Erakis dans le forum ASP.NET
    Réponses: 10
    Dernier message: 21/10/2004, 18h54
  2. [debutant] PBL variable resultat & sql dynamic
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2004, 09h44
  3. sql dynamic : passage de parametre entre quotes
    Par de LANFRANCHI dans le forum SQL
    Réponses: 12
    Dernier message: 26/05/2004, 15h09
  4. [FLASH MX 2004]Dynamic Text Cliquable
    Par danael dans le forum Flash
    Réponses: 7
    Dernier message: 30/04/2004, 19h55

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