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 Aléatoire (incontrolé :s )


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut Affichage Aléatoire (incontrolé :s )
    Bonjour,

    Je viens requérir vôtre aide parceque je débute depuis quelques mois en OpenGl et je suis actuellement, comme beaucoup de passionné je suppose, en train d'essayer de développer un petit Moteur 3D. J'ai donc commencé par construire une architecture de gestionnaire basique.

    Ensuite j'ai implémenté les objets 3D de mon moteur en utilisant les méthodes de base présentées sur la majorité des tutos c'est à dire les glVertex3f et autres

    (pas de gestion de lumières pour le moment l'objectif étant simplement de pouvoir afficher un bon nombre d'objet avec un mode te texture tres simple )

    J'ai donc ensuite créé une dll de mon moteur puis je l'ai essayée dans une application à part. Tout marchait donc normalement jusque la ... le seul probleme c'était l'efficacité ^o) parceque si je comprend bien le probleme c'est que cette méthode la ne profite vraiment pas énormément des accelerations offertes par les cartes récentes.

    J'ai donc commencé à me renseigner et j'ai donc découver les VBO (si j'ai bien compris) qui s'utilise avec en gros des tableau de vertex que l'on passe à OpenGl pour qu'il les stoque dans dans une zone référencée par l'indice que l'on récupère grâce à glGenBuffersARB( nbre de buffers , tableauNumeros );

    et que l'on assigne ensuite avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices );
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB );
    on peut ensuite détruire notre array qui a été copié par OpenGL.

    une fois que cette étape de chargement à été faite vien la méthode Draw de l'objet : ( et je pense que c'est ici que se trouve le probleme mais je ne le cerne pas )

    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
     void Objet::Draw() {
     
        //applique les transformations de positions
        moveToObjectif();
     
        glPushMatrix();
        glTranslatef(P.getX(),P.getY(),P.getZ());
     
        glRotated(P.getAX()+Original.getAX(),1,0,0);
        glRotated(P.getAY()+Original.getAY(),0,1,0);
        glRotated(P.getAZ()+Original.getAZ(),0,0,1);
        //transformation d'echelle
        glScalef(S.getX(),S.getY(),S.getZ());
     
        glEnableClientState( GL_VERTEX_ARRAY );
        glEnableClientState( GL_TEXTURE_COORD_ARRAY );                    
     
     
        if(textured && T != NULL)
        {
            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, T->getId());
            }
     
            glColor4f(C.getR(),C.getG(),C.getB(),C.getA());
     
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices );
        glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords );
        glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
     
        glDrawArrays( GL_TRIANGLES, 0, m_nVertexCount );
     
        if(textured && T != NULL)
        {
            glDisable(GL_TEXTURE_2D);
            }
     
            glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
     
        glDisableClientState( GL_VERTEX_ARRAY );
        glDisableClientState( GL_TEXTURE_COORD_ARRAY );
     
        glPopMatrix();
     
    }
    Voila et donc dans mon gestionaire j'ai un tableau de pointeur vers des objets sachant que si deux objets sont les mêmes ils "partagent/ont les mêmes" références de buffers.

    En l'occurence pour remarquer mon bug j'ai voulu faire un champ de cubes mais (et voila enfin mon probleme) il n'y a qu'une certaine partie des cubes qui s'affichent ..... et ceux qui ne s'affichent pas ont une répartition plus ou moins aléatoire ......

    donc voila si il vous manque des informations, que vous remarquez des erreures qui n'ont pas de rapport, ou que j'ai di des bétises sur le fonctionnement n'hésitez pas à éclairer ma lanterne !!!

    en vous remerciant d'avance
    Seb

  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
    avec une capture déran ça serai plus simple de voir ton problème

    néanmoins je pense à une chose
    pourrais tu préciser la taille de tes cubes, leur nombre, ect afin de voir sur quelle distance ils s'affichent
    et si tu utilises bien gluPerspective, quels sont ses paramètres ?

    peut-etre que ton paramètre zFar dans gluPerspective est trop faible ?
    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 confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    Une capture d'écran ok tout dessuite

    Je crois que l'image parle d'elle même effectivement ^o) en fait tous les cubes devraient etres affichés ....

    Je pensais au début que c'était peut-etre la carte graphique mais je me suis ravisé puisque j'ai pu tester sur plusieurs ordis et ca fait pareil donc je pense que l'erreure vien de mon code .... jdoi etre super nul

    voila voila j'espère que vous pourrez m'aider !!!

    Cordialement
    Seb
    Images attachées Images attachées  

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    Personne n'as la moindre idée ?

    Est-il possible par exemple que le bind buffer ne fonctionne pas ...; que l'ordre d'activation des clients ait une importance .... je ne sais pas .....

    Merci d'avance

    Seb

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    Salut !

    Bon j'ai enfin réglé mon problème c'était un probleme algorithmique qui n'avait strictement rien avoir avec OpenGl autant pour moi .........

    Par contre maintenant je vais vous poser quelques petites questions autres :

    lef appels OpenGl en général sont plutot lent non ? ^o) je pense en fait en particulier aux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    glEnableClientState( GL_VERTEX_ARRAY );
    glEnableClientState( GL_TEXTURE_COORD_ARRAY );
    ...
    ...
    glDisableClientState( GL_VERTEX_ARRAY );
    glDisableClientState( GL_TEXTURE_COORD_ARRAY );
    puisque je ne fais pas de test sur la capacite d'utilisation des VBO c'est à dire que je les utilise pour tous mes objets ...... est-ce que je ne pourrais pas le faire une fois pour toute au début et à la fin de mon affichage ??? (je pose cette question parceque je suppose qu'il pourrais exister un comportement obligeant à ces appels à chaque fois )

    ensuite sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices );
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB );
    ne serait il pas juducieux de ne pas appeller ces fonctions si l'objet qui a été dessinné précédemmentétait le même ? donc existe-il un moyen de connaitre les Bind courrants ? et ensuite je pense que si c'est le cas je regroupperais les objets identiques pour les dessinner à la file ................


    Enfin dernière petite question mais qui pour moi à son importance : combien dans un moteur correct opengl peut-on esprer tracer de triangles sur une machine actuelle ???

    Je parle bien des triangles dessinnés de façon effective !!!! je ne parle pas du nombre de triangles dans le monde 3D

    voila j'attend vos réponses avec impatience
    cordialement
    Seb

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Les appels driver : ils sont tous coûteux, et regrouper intelligemment les objets à rendre pour en économiser est toujours une bonne idée. Après selon tes besoins et analyse des perfs, il peut être meilleur de regrouper par géometrie, par matériaux, par textures, par shaders, etc...

    Il existe une liste qui donne le coût de chaque appel driver pour DirectX, je ne sais pas s'il existe un équivalent OpenGL mais de toute façon ça devrait être équivalent. Evidemment j'ai perdu le lien

    Concernant le nombre de triangles... Alors là tu imagines bien que personne ne peut donner de réponse. Cela dépend de tellement de choses. D'une part de ton matos, de ton appli (limitée par le CPU ? par le fillrate ? par la bande passante ?), de tes triangles (pas d'éclairage ni texture ? ou bien multitexturés avec shader compliqué et alpha-blending, le tout en 3 passes ?), de la scène, etc...

    Voilà voilà.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/08/2006, 10h24
  2. Erreur pour l'affichage aléatoire d'une image
    Par bellebiquette dans le forum Langage
    Réponses: 3
    Dernier message: 21/04/2006, 22h45
  3. Affichage aléatoire
    Par wperle dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2005, 12h54
  4. Affichage aléatoire avec coéfficients
    Par groupejtt dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 08/11/2005, 22h09
  5. [Tableaux] Affichage aléatoire... ou presque !
    Par rafflow dans le forum Langage
    Réponses: 4
    Dernier message: 05/10/2005, 22h43

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