Partage
  • Partager sur Facebook
  • Partager sur Twitter

[openGL/SDL/...]Aider moi a la réalisation d'un importateur de fichier .obj

Peu- être un moteur 3D

    4 septembre 2007 à 12:45:13

    Ne te fie pas a ce genre de calculs ridicules fait pour "faire vendre"

    En effet, dire "ma carte peut afficher 2 millions de polygones a 24 FPS", dis toi bien que quand ils font leurs tests, ils les font avec :
    - des polygones tres petits (vite affichés)
    - aucun effet de lissage
    - aucun effet en général
    - aucune texture.
    - sans antialisasing.
    - ... sans rien en gros

    bref, dans les conditions les plus rapides (et les plus moches), mais ils peuvent quand meme dire qu'ils ont réussi a afficher leurs 2 millions de polygones a 24 FPS... Oui, ils peuvent le dire... Ce n'est pas un mensonge... C'est juste qu'ils ne se ventent pas des conditions dans lesquelles ils le font...

    mais des que tu mets quelques effets, un peu de lissage, etc etc, la, Plouf !! C'est plus les memes chiffres, mais ça, ils se gardent bien de le dire !
    • Partager sur Facebook
    • Partager sur Twitter

    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

      4 septembre 2007 à 14:14:50

      Citation : Yno

      Comment ça ? Ceci ne convient pas :

      1. glBindTexture (GL_TEXTURE_2D, texid);
      2. glCallList (list);
      3. glBindTexture (GL_TEXTURE_2D, 0);


      ?


      Ceci fonctionne si j'ai une seule texture.
      Mais si j'en ai plusieurs, je fais comment ?
      (Je crée une liste pour chaque texture)
      1. for(int i = 0; i != nombreDeTextures; i++)
      2. {
      3.       glBindTexture (GL_TEXTURE_2D, texture[i]);
      4.       glCallList (list[i]);
      5. }
      6. glBindTexture (GL_TEXTURE_2D, 0);


      Et pour la mise à jour du pilote ça doit être bon (enfin je crois).

      Mais, vous ne savez pas pourquoi, il y a une aussi grande différence entre mes tests et ceux de Yno ?
      Ou alors j'ai vraiment codé comme une quiche :lol: .

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        4 septembre 2007 à 17:15:14

        Citation : Fvirtman

        Ne te fie pas a ce genre de calculs ridicules fait pour "faire vendre"

        En effet, dire "ma carte peut afficher 2 millions de polygones a 24 FPS", dis toi bien que quand ils font leurs tests, ils les font avec :
        - des polygones tres petits (vite affichés)
        - aucun effet de lissage
        - aucun effet en général
        - aucune texture.
        - sans antialisasing.
        - ... sans rien en gros

        bref, dans les conditions les plus rapides (et les plus moches), mais ils peuvent quand meme dire qu'ils ont réussi a afficher leurs 2 millions de polygones a 24 FPS... Oui, ils peuvent le dire... Ce n'est pas un mensonge... C'est juste qu'ils ne se ventent pas des conditions dans lesquelles ils le font...

        mais des que tu mets quelques effets, un peu de lissage, etc etc, la, Plouf !! C'est plus les memes chiffres, mais ça, ils se gardent bien de le dire !


        J'ai certes mis des textures mais pas d'antialiasing, ni de lissage.
        Et puis avec 2 millions de polygones sur un million de pixels sa fait 1/2 pixel le polygone donc c'est normal qu'ils soient petits.
        Yno ne vend pas de cartes graphiques (à ce que je sache) ni de PC donc on ne peut pas dire ça.
        Je pense plutôt qu'Yno a dû ajouter un zéro de trop.
        • Partager sur Facebook
        • Partager sur Twitter
          4 septembre 2007 à 17:50:43

          "J'ai certes mis des textures mais pas d'antialiasing, ni de lissage"

          -> Oui, mais tu n'as surement pas lancé en Flat Shading -> Donc tu as un lissage de Gouraud (ça se voit sur tes screenshots)
          -> Tu as peut etre un éclairage qui traine.
          -> Tu as surement activé le Z-buffer (normal, tu vas me dire), mais bon, sans Z-buffer, tu vas plus vite

          Et plein d'autres trucs qui sont branchés par défaut :)
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            4 septembre 2007 à 19:25:07

            Afin de calmer les rumeurs sur moi et mes tests, sachez que je n'ai pas ajouté de zéro, mais que comme l'a dit Fvirtman, je n'avais affiché >que< des polygones.

            J'avais un lissage gouraud, pas d'antialiasing (enfin, je ne me rappel plus à vrai dire), le Z-buffer activé et une lumière, non configurée. J'avais également défini un matériau.
            La résolution était de 1024*768.

            En fait vous me faites douter de mes tests, je re-essayerai peut-être à l'occasion, si vous le voulez vraiment.
            • Partager sur Facebook
            • Partager sur Twitter
              4 septembre 2007 à 19:33:00

              D'acc :) donc en réduisant encore, tu aurais pu avoir encore de meilleures performances.

              Si Pole a la meme carte graphique que toi, mais n'arrive pas a voir de bons résultats, ce que tu peux faire, peut etre, c'est de lui passer ton EXE qui fait le bench : pour qu'il voit lui, avec le meme programme, a combien il est de FPS : il verra tout de suite si ça vient de son programme ou d'ailleurs (carte, pilote...)

              Une autre explication aussi : outre l'utilisation de glList qui accélere bien : un programme compilé en release est bien plus rapide qu'un programme compilé en debug ! Peut etre que Pole a compilé en Debug, mais que tu peux gagner beaucoup de FPS en compilant en release.
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                4 septembre 2007 à 20:45:20

                Citation : Fvirtman

                un programme compilé en release est bien plus rapide qu'un programme compilé en debug ! Peut etre que Pole a compilé en Debug, mais que tu peux gagner beaucoup de FPS en compilant en release.


                C'est propre au C++ ... ? Je fais du C, et j'ai fait ces tests il y a longtemps, et sous Linux (donc pour l'exec c'est mort).
                • Partager sur Facebook
                • Partager sur Twitter
                  4 septembre 2007 à 20:45:54

                  Tu devrais faire les tuto nehe. Tu apprendrais un peux tout ce qu'il faut, le cellshading, la physique et shaders, le load de model anime.

                  Seul probleme : C'est en anglais mais ca c'est pas trop trop grave encore.

                  PS : utilise la SDL pour un rendu OpenGL ca fait pas trop propre. Sous windows tu peux utiliser l'API qui te donne plus de possibilite, tu peux faire du GUI...
                  Et sous linux Glut qui marche aussi bien mais qui a une architecture differente de l'api win donc si tu veux faire un moteur 3D protable tu devrais te mettre aux lib deja inclue par default avec l'OS, mais c'est assez compliquer.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 septembre 2007 à 20:58:39

                    Citation : Yno

                    C'est propre au C++ ... ? Je fais du C, et j'ai fait ces tests il y a longtemps, et sous Linux (donc pour l'exec c'est mort).



                    Non, il me semble qu'en C, c'est pareil.
                    J'ai peut etre une hypothese :

                    Il me semble que sous Linux, quand tu utilises gcc, machinalement, tu ne mets pas l'option pour activer le debuggage (-g ? -d ? je ne sais plus)
                    Donc du coup, on a tendance a compiler en release quand on ne connait pas.

                    Alors que sous Windows, certains IDE comme Visual C++ mettent par defaut la compilation en debug : du coup, a moins de mettre explicitement en release, beaucoup de programmeurs débutants restent en debug, sans vraiment savoir ce que c'est que debug/release, et donc ont des perfs qui pourraient etre hautement améliorées...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      4 septembre 2007 à 21:10:05

                      Citation : Fvirtman

                      Il me semble que sous Linux, quand tu utilises gcc, machinalement, tu ne mets pas l'option pour activer le debuggage (-g ? -d ? je ne sais plus)


                      Je ne compile jamais avec cette option. De plus, ça serait vraiment débile pour un test de performance...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 septembre 2007 à 21:32:35

                        Evidemment, pour le test de perf, il faut mettre en release :)
                        Mais il faut que l'auteur fasse une release aussi !
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                          22 septembre 2007 à 17:23:46

                          C'est re moi :D .
                          ça fait pas mal de temps que j'ai posté, mais avec la rentrée, j'ai axés a mon pc que le weekend, enfin bref s'est pour ça que je mets plus de temps :'( .

                          Pour avoir les meilleurs performances, je ne savais pas qu'il fallait compiler en "release", donc j'ai fait des tests :D .
                          Comme ça fait pas mal de temps, si je me souviens bien, j'ai du gagner 1 ou 2 FPS.

                          Pour se qui est de l'avancement de mon importateur, normalement j'ai fini ma classe "mesh_obj", Et j'ai voulu faire une classe "texture".
                          Ma classe "texture", enfaite on déclare un objet(texture), et après avec une méthode on envoie les objets(mesh_obj) a l'objet(texture).
                          Ensuite cette classe va se débrouiller pour ouvrir et éviter les copies de texture et envoie les pointeurs qui pointent vers les textures à mes objets(mesh_obj).

                          Voila j'ai voulu faire ça, pour que si vous le voulez, testez un peu.
                          ça s'est l'exe"test.zip"
                          Et pour les courageux :p .
                          Et ça s'est le code source "code source.zip"

                          Le rendu et un rendu classique, et oui parce que avec les autres modes (DL , VBOs), j'ai des problèmes au niveau des textures, quoique en DL ça peut aller, s'est surtout en VBOs que ça bug, donc je fais se que je peux et dés que ça fonctionne correctement je ferai une petite application que je partagerais avec vous (enfin toujours si vous le voulez, je ne vais pas vous obligez :lol: )

                          Il y a 4 meshs, dont 3 que j'ai trouvé la, et le cube s'est moi qui l'ai fait (ça a été dur à faire :lol: ), et j'ai trouvé les textures ici.

                          Et quelques touches si vous testez mon exe.
                          Echap = Quitter
                          -> = mesh suivant
                          <- = mesh précédant
                          t = afficher ou ne pas afficher les textures sur les meshs.


                          Et si vous regardez le code source, et que vous voyez des trucs qu'il ne faut pas faire ou autre chose, je suis à votre écoute ...
                          (je ne suis pas encore un pro :D )

                          Et si vous avez des remarques...

                          Je n'ai pas grand chose à rajouter.

                          ++
                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 septembre 2007 à 18:40:49

                            Joli travail mais :
                            1. unsigned int mesh_obj::conversionCaracterNombre(const char nombre)
                            2. {
                            3.     switch (nombre)
                            4.     {
                            5.         case '0':
                            6.         return 0;
                            7.         break;
                            8.         case '1':
                            9.         return 1;
                            10.         break;
                            11.         case '2':
                            12.         return 2;
                            13.         break;
                            14.         case '3':
                            15.         return 3;
                            16.         break;
                            17.         case '4':
                            18.         return 4;
                            19.         break;
                            20.         case '5':
                            21.         return 5;
                            22.         break;
                            23.         case '6':
                            24.         return 6;
                            25.         break;
                            26.         case '7':
                            27.         return 7;
                            28.         break;
                            29.         case '8':
                            30.         return 8;
                            31.         break;
                            32.         case '9':
                            33.         return 9;
                            34.         break;
                            35.     }
                            36.     return 0;
                            37. }

                            return nombre-'0';
                            suffit (pas trop portable dans l'organisation des caractères ASCII je crois)
                            Et tu ne peux pas choisir en même temps le rendu classique,DL, ou VBO. Donc pas besoin de puissance de 2, tu vires les & machin != 0.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 septembre 2007 à 19:44:07

                              Citation : Pole

                              return nombre-'0';
                              suffit (pas trop portable dans l'organisation des caractères ASCII je crois)


                              Il me semble que si, justement. '0' = '1'-1 = '2'-2 = ...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                22 septembre 2007 à 19:47:20

                                ok ok pour le return nombre-'0';
                                J'ai carément supprimé la méthode :p .

                                Citation : Pole

                                Donc pas besoin de puissance de 2, tu vires les & machin != 0.



                                Désolé mais je ne vois pas trop, tu pourrais me donner la méthode où tu as vu ça, s'il te plait, merci :) .

                                ++
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  22 septembre 2007 à 21:14:01

                                  Je parle de ça :
                                  1. if(rendu != 0)
                                  2.         {
                                  3.             if((rendu & CLASSIQUE) != 0)
                                  4.             {
                                  5.                 m_activeClassique = true;
                                  6.                 renduMode = CLASSIQUE;
                                  7.             }
                                  8.             if((rendu & DL) != 0)
                                  9.             {
                                  10.                 m_activeDL = true;
                                  11.                 utiliserDisplayLists();
                                  12.                 renduMode = DL;
                                  13.             }
                                  14.             if((rendu & VBOs) != 0)
                                  15.             {
                                  16.                 m_activeVBOs = true;
                                  17.                 allocationVBOs();
                                  18.                 renduMode = VBOs;
                                  19.             }
                                  20.         }

                                  Tu ne peux pas avoir un rendu utilisant ET les VBO ET les DL non?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 septembre 2007 à 12:17:10

                                    A oui je vois maintenant :D .

                                    Citation : Pole

                                    Tu ne peux pas avoir un rendu utilisant ET les VBO ET les DL


                                    Je suis d'accord.

                                    Enfaite le code que tu viens de mettre se trouve dans le constructeur.
                                    Quand l'utilisateur crée un objet "mesh_obj", s'il précise rien, ça sera automatiquement le rendu classique qui sera effectué.

                                    L'utilisateur a la possibilité d'utiliser le rendu CLASSIQUE, VBOs ou DL, il peut choisir un des trois, dans ce cas, le mode de rendu qu'il aura spécifié sera mis en œuvre.
                                    Mais imaginons que l'utilisateur veut faire apparaitre son mesh sous plusieurs modes(j'avoue qu'il n'y a pas trop d'utilité, sauf pour faire des tests), il va bien falloir que je garde mes tableaux alloués en fonction de se que l'utilisateur a choisi.

                                    Je ne sais pas si j'ai bien été clair, bon un petit exemple :D .
                                    Imaginons que l'on veuille afficher un mesh grâce au DL et au VBOs(évidement ça ne va pas se passer en même temps).
                                    ça donne ça.
                                    1. mesh_obj test("mesh/test.obj", "mesh", VBOs | DL);

                                    mesh/test.obj c'est notre mesh qui se trouve dans le dossier mesh.
                                    mesh c'est le dossier ou se trouve les textures pour ce mesh.
                                    VBOs | DL c'est les modes que l'on souhaite utiliser.

                                    Ici le mode de rendu qui sera effectué sera les VBOs, il y a une priorité au VBOs, si on ne demande pas les VBOs ça sera les DL et si on demande ni les VBOs ni les DL ça sera le mode CLASSIQUE.
                                    Donc en fonction de ça, la classe va savoir si elle peut "delete" certains tableaux, pour libérer un peu la place et s'il faut qu'elle crée les DL ou pas et enfin 'il faut qu'elle alloue la mémoire pour les VBOs.

                                    Voila le plus gros :D .

                                    Donc si on reprend, et que je fasse un rendu.
                                    1. test.rendu();

                                    Cela fera un rendu VBOs.

                                    Et imaginons que je veuille faire un rendu VBOs et un rendu DL.
                                    1. changerParametre(VBOs);
                                    2. test.rendu();
                                    3. changerParametre(DL);
                                    4. test.rendu();


                                    J'espère avoir été clair.
                                    Mais c'est une mauvaise idée?

                                    __________________________________________________________________

                                    Donc voila j'ai avancé un petit peu et j'ai corrigé le bug qu'il y avait au niveau des DL :D .
                                    Je m'attaque donc au bug des VBOs.
                                    Je crois que je vais vraiment galéré :( .

                                    Il n'y a pas de bug quand j'ai un seul mesh.
                                    Mais quand j'en ai deux, là j'ai le bug.
                                    Quand je fais
                                    1. mesh_obj kart("mesh/kart.obj", "mesh", VBOs);
                                    2. mesh_obj tank("mesh/tank.obj", "mesh", VBOs);

                                    Je charge d'abord kart et après tank.
                                    Maintenant je fais un randu.
                                    1. kart.rendu();
                                    2. tank.rendu();

                                    Et je constate que le tank est correctement affiché, par contre le kart ne ressemble pas à un kart mais s'est le tank avec des bouts en moins et la texture du kart.
                                    Donc j'en ai conclu, que mes données (vertice) dans un premier temps avec le kart, sont écrits correctement dans la mémoire de la carte graphique et lorsque le tank se charge les données (vertice) du tank se chargent mais pardessus celles du kart.

                                    Et là, je suis bien embêtée parce que je ne vois pas comment résoudre ce problème plutôt gênant, si quelqu'un a la solution je serai vraiment reconnaissant.
                                    _____________

                                    Sinon je me disais:
                                    J'arrête là, mon importateur, pour enfaite en refaire un autre, je m'explique.
                                    Maintenant que j'ai appris pas mal, que je sais comment faire :) , grâce à vous je vous remercie d'ailleurs.
                                    Je me suis dit : un jour peut être je passerais à d'autre format (et pourquoi pas un format qui contient des animations), alors j'ai pensé à une classe qui contiendrai les vertices et tout le bordel :lol: pour faire les rendus et tout et tout, puis avec des fonctions ou d'autres classes remplir cette classe.
                                    Comme ça je ne serai pas obligé de refaire tout le système de rendu à chaque fois que je veux passer à un autre format.
                                    Vous en pensez quoi ?


                                    Voila je n'ai plus rien à dire :-° .

                                    ++
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 septembre 2007 à 13:45:17

                                      Citation : culte

                                      A oui je vois maintenant :D .

                                      Citation : Pole

                                      Tu ne peux pas avoir un rendu utilisant ET les VBO ET les DL


                                      Je suis d'accord.

                                      Enfaite le code que tu viens de mettre se trouve dans le constructeur.
                                      Quand l'utilisateur crée un objet "mesh_obj", s'il précise rien, ça sera automatiquement le rendu classique qui sera effectué.

                                      L'utilisateur a la possibilité d'utiliser le rendu CLASSIQUE, VBOs ou DL, il peut choisir un des trois, dans ce cas, le mode de rendu qu'il aura spécifié sera mis en œuvre.
                                      Mais imaginons que l'utilisateur veut faire apparaitre son mesh sous plusieurs modes(j'avoue qu'il n'y a pas trop d'utilité, sauf pour faire des tests), il va bien falloir que je garde mes tableaux alloués en fonction de se que l'utilisateur a choisi.

                                      Je ne sais pas si j'ai bien été clair, bon un petit exemple :D .
                                      Imaginons que l'on veuille afficher un mesh grâce au DL et au VBOs(évidement ça ne va pas se passer en même temps).
                                      ça donne ça.

                                      1. mesh_obj test("mesh/test.obj", "mesh", VBOs | DL);


                                      mesh/test.obj c'est notre mesh qui se trouve dans le dossier mesh.
                                      mesh c'est le dossier ou se trouve les textures pour ce mesh.
                                      VBOs | DL c'est les modes que l'on souhaite utiliser.

                                      Ici le mode de rendu qui sera effectué sera les VBOs, il y a une priorité au VBOs, si on ne demande pas les VBOs ça sera les DL et si on demande ni les VBOs ni les DL ça sera le mode CLASSIQUE.
                                      Donc en fonction de ça, la classe va savoir si elle peut "delete" certains tableaux, pour libérer un peu la place et s'il faut qu'elle crée les DL ou pas et enfin 'il faut qu'elle alloue la mémoire pour les VBOs.

                                      Voila le plus gros :D .

                                      Donc si on reprend, et que je fasse un rendu.

                                      1. test.rendu();


                                      Cela fera un rendu VBOs.

                                      Et imaginons que je veuille faire un rendu VBOs et un rendu DL.

                                      1. changerParametre(VBOs);
                                      2. test.rendu();
                                      3. changerParametre(DL);
                                      4. test.rendu();



                                      J'espère avoir été clair.

                                      Mais c'est une mauvaise idée?



                                      Disons que je n'y vois pas d'intérêt. Si tu as envie d'afficher en DL, pourquoi avoir la possibilité d'afficher en VBOs?

                                      Citation : culte


                                      Donc voila j'ai avancé un petit peu et j'ai corrigé le bug qu'il y avait au niveau des DL :D .
                                      Je m'attaque donc au bug des VBOs.
                                      Je crois que je vais vraiment galéré :( .

                                      Il n'y a pas de bug quand j'ai un seul mesh.
                                      Mais quand j'en ai deux, là j'ai le bug.
                                      Quand je fais

                                      1. mesh_obj kart("mesh/kart.obj", "mesh", VBOs);
                                      2. mesh_obj tank("mesh/tank.obj", "mesh", VBOs);


                                      Je charge d'abord kart et après tank.
                                      Maintenant je fais un randu.

                                      1. kart.rendu();
                                      2. tank.rendu();


                                      Et je constate que le tank est correctement affiché, par contre le kart ne ressemble pas à un kart mais s'est le tank avec des bouts en moins et la texture du kart.
                                      Donc j'en ai conclu, que mes données (vertice) dans un premier temps avec le kart, sont écrits correctement dans la mémoire de la carte graphique et lorsque le tank se charge les données (vertice) du tank se chargent mais pardessus celles du kart.

                                      Et là, je suis bien embêtée parce que je ne vois pas comment résoudre ce problème plutôt gênant, si quelqu'un a la solution je serai vraiment reconnaissant.


                                      Là il faut du code et moi je ne m'y connais pas trop en VBO.

                                      Citation : culte


                                      Sinon je me disais:
                                      J'arrête là, mon importateur, pour enfaite en refaire un autre, je m'explique.
                                      Maintenant que j'ai appris pas mal, que je sais comment faire :) , grâce à vous je vous remercie d'ailleurs.
                                      Je me suis dit : un jour peut être je passerais à d'autre format (et pourquoi pas un format qui contient des animations), alors j'ai pensé à une classe qui contiendrai les vertices et tout le bordel :lol: pour faire les rendus et tout et tout, puis avec des fonctions ou d'autres classes remplir cette classe.
                                      Comme ça je ne serai pas obligé de refaire tout le système de rendu à chaque fois que je veux passer à un autre format.

                                      Vous en pensez quoi ?



                                      Voila je n'ai plus rien à dire :-° .

                                      ++


                                      Il faut faire une scission en 2 class : une qui charge et une qui affiche. Ca me parait bien.
                                      Dans tes class, utilise plus de private et moins de protected.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 septembre 2007 à 14:07:08

                                        Citation : Pole

                                        Disons que je n'y vois pas d'intérêt. Si tu as envie d'afficher en DL, pourquoi avoir la possibilité d'afficher en VBOs?



                                        Enfaite au début, quand on crée l'objet, si on dit que l'on veut utiliser que les DL, on ne pourra pas faire de rendu CLASSIQUE ou VBOs.

                                        Citation : Pole

                                        Il faut faire une scission en 2 class : une qui charge et une qui affiche. Ca me parait bien.
                                        Dans tes class, utilise plus de private et moins de protected.



                                        Ok, je vais refaire tout ça, et peut être que les VBOs fonctionneront, je posterai du code si ça ne fonctionne toujours pas.
                                        Et tant que j'y suis j'enlèverais la possibilité de changer de mode de rendu.

                                        ++
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          7 novembre 2007 à 17:59:18

                                          Me revoila :D .

                                          Ca fait pas mal de temps, mais je n'ai pas abandonner mon projet, c'est juste que je n'ai pas trop le temps :( ...

                                          En récrivant mon code je me suis dit que ça serait cool de pouvoir ouvrir les fichiers .mtl, il a donc fallu que je m'apprenne comment fonctionne les matériaux avec openGL, j'ai trouvé ça et ça.


                                          Tout d'abord j'ai fait une petite application pour vous :p .

                                          Elle se trouve ici, il y a un .exe ainsi que tous les meshs, et dans le dossier testobj vous trouverez le .blend ainsi que tous les fichiers .obj et .mtl que j'ai pu faire pour mes tests.
                                          Et pour les autres meshs, je les ai trouvé, toujours sur le même cite :-° .
                                          Touches;
                                          t = Afficher ou désafficher les textures.
                                          m = Afficher ou désafficher les matériaux.
                                          r = Afficher ou désafficher le repaire.
                                          c = changer le premier mesh avec un autre mesh.
                                          <- ou -> = mesh précédant ou suivant
                                          flèche haut ou flèche bas = changer de rendu si on veut voir le mesh en fil ou ...


                                          Et ici il y a tous mes fichiers cpp et h, ainsi que le projet Code Blocks (c'est pour les courageux :p ).

                                          Je vais essayer d'expliquer le fonctionnement général de ma classe.

                                          Pour le moment je me suis occupé que du rendu classique alors les autres rendus je ne les ai pas encore fait.
                                          Dans un premier temps on créé un objet de type mesh.
                                          Voici deux façons d'ouvrir un .obj:
                                          1. mesh test("mesh/test.obj", "mesh/test.obj", CLASSIQUE);

                                          ou
                                          1. mesh test;
                                          2. test.ouvrir("mesh/test.obj", "mesh/obj", CLASSIQUE);


                                          Dans les deux cas, cela appelle la méthode ouvrir, cette méthode va vérifier si elle connait l'extension (pour l'instant il y en a qu'une, s'est le .obj :D ).
                                          Ensuite elle va appeler une fonction chargementObj avec deux paramètres le non du fichier à ouvrir et une structure que j'ai appelé dataMesh.
                                          1. struct dataMesh
                                          2. {
                                          3.     unsigned int tailleVerticesOrganiser;
                                          4.     unsigned int tailleCoordTexturesOrganiser;
                                          5.     unsigned int tailleNormalesOrganiser;
                                          6.     double *verticesOrganiser;
                                          7.     double *coordTexturesOrganiser;
                                          8.     double *normalesOrganiser;
                                          9.     unsigned int *nombreFacesMaterials;
                                          10.     int nombreMaterials;
                                          11.     std::string *nomTextures;
                                          12.     material *materials;
                                          13. };


                                          La fonction chargementObj va ouvrir le .obj et dans un premier temps elle va compter et mettre les informations dans la structure dataMesh mais que dans la variable nombreMaterials et la structure data qui va compléter que les variables nombreVertices, nombreCoordTextures, nombreNormales, nombreFaces et nomMtl.
                                          1. struct data
                                          2. {
                                          3.     unsigned int nombreVertices;
                                          4.     unsigned int nombreCoordTextures;
                                          5.     unsigned int nombreNormales;
                                          6.     unsigned int nombreFaces;
                                          7.     double *vertices;
                                          8.     double *coordTextures;
                                          9.     double *normales;
                                          10.     unsigned int *indexVertices;
                                          11.     unsigned int *indexCoordMaterials;
                                          12.     unsigned int *indexNormales;
                                          13.     std::string nomMtl;
                                          14. };


                                          Ensuite elle va allouer les tableaux si cela et utile:
                                          verticesOrganiser
                                          coordTexturesOrganiser
                                          normalesOrganiser
                                          nombreFacesMaterials
                                          nomTextures
                                          materials

                                          vertices
                                          coordTextures
                                          normales
                                          indexVertices
                                          indexCoordMaterials
                                          indexNormales


                                          Ensuite elle relève toutes les données dans :
                                          nombreFacesMaterials
                                          nomTextures

                                          vertices
                                          coordTextures
                                          normales
                                          indexVertices
                                          indexCoordMaterials
                                          indexNormales


                                          Et enfin elle appelle la fonction misEnForme et si il y a un fichier .mtl a ouvrir elle va appeler la fonction chargementMtl.
                                          Elle prend deux paramètres, le non du fichier à ouvrir et la structure de la classe mesh dataMesh et à partir de la, elle va remplir le tableau de material qui et contenu dans la structure de dataMesh.
                                          material et enfaite une structure:
                                          1. struct material
                                          2. {
                                          3.     GLfloat ambient[4];
                                          4.     GLfloat diffuse[4];
                                          5.     GLfloat specular[4];
                                          6.     GLfloat shininess;
                                          7. };


                                          Ensuite misEnForme va remplir les tableaux et les variables de dataMesh en fonction des valeurs de data(les valeurs relevées).

                                          Il n'y a plus qu'a envoyer l'objet à un objet texture,

                                          1. texture textures;
                                          2. textures.ajouterMesh(test);


                                          et a fair un rendu.
                                          1. bool Tx = true;
                                          2. bool Ma = true;
                                          3. test.rendu(Tx, Ma);


                                          Si Tx est a true alors on verra les textures, si il y en a, et si il est à false alors on ne verra pas de texture, et c'est pareil avec Ma, sauf que c'est pour les matériaux.

                                          Voila a peu près le principe(si vous voulez d'autre précision je peux en faire :D ).

                                          Mais maintenant j'ai quelque question.

                                          Dans une classe avec des attributs, en dehors de la classe, normalement je n'y ai pas accès.
                                          Mais dans mon code, quand je suis dans ma classe j'appelle une méthode(qui se trouve dans la classe) qui va appeler une fonction(qui ne fait pas parti de la classe), à cette fonction je lui envoie un paramètre qui est un attribut de la classe, et je peux modifier cet attribut, mais pourtant je ne suis pas dans la classe.
                                          Cela fonctionne mais ai je vraiment le droit de le faire ?


                                          A la fin de ma methode renduClassique je fais ceci:
                                          1. if(m_dataMesh.materials != NULL)
                                          2.     {
                                          3.         glMaterialfv(GL_FRONT,GL_AMBIENT, m_dataMesh.materials[m_dataMesh.nombreMaterials].ambient);
                                          4.         glMaterialfv(GL_FRONT,GL_DIFFUSE, m_dataMesh.materials[m_dataMesh.nombreMaterials].diffuse);
                                          5.         glMaterialfv(GL_FRONT,GL_SPECULAR, m_dataMesh.materials[m_dataMesh.nombreMaterials].specular);
                                          6.         glMaterialfv(GL_FRONT,GL_SHININESS, &m_dataMesh.materials[m_dataMesh.nombreMaterials].shininess);
                                          7.     }
                                          8.     glBindTexture(GL_TEXTURE_2D, 0);

                                          Pour indiquer a openGl que je n'utilise plus les textures, et les matériaux.
                                          par contre pour les matériaux(le code dans le if), je n'ai pas trouvé mieux que de recréer des tableaux avec les valeurs par défaut.
                                          Es qu'il y a une façon pour indiquer a openGL que je ne veux plus utiliser les matériaux(donc remettre tout par défaut).


                                          Et j'avais demandé déjà mais je n'ai pas eu de réponse.
                                          Je ne sais pas comment faire pour lisser mes surface(dans blender le bouton Set Smooth).
                                          De quel coté il faut que je cherche parce que j'ai essayer ("Set Smooth" openGL) mais je n'ai pas trouve.



                                          J'aurai bien d'autres trucs à demander mais je vais m'arrêter là :lol: .

                                          Et sinon vous en pensez quoi?

                                          ++
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            24 novembre 2007 à 12:08:55

                                            J'ai l'impression de parler tout seul, enfin se n'est pas grave je vais arrêter là.
                                            J'ai fini les autres mode de rendu, et cette fois ça fonctionne avec les VBOs (j'ai trouvé l'erreur :D ).
                                            Il resterait bien des trucs à améliorer, mais ça je les ferais au fur et a mesure, et si vous le voilez bien, je posterais les sources.

                                            Bon oui, voila les sources pour ceux à qui ça intéresse.

                                            Et je remercie tous les gens qui m'ont aidé à la réalisation de mes codes.

                                            ++
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            [openGL/SDL/...]Aider moi a la réalisation d'un importateur de fichier .obj

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown