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 :

pb de transparence (facetisation)


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut pb de transparence (facetisation)
    Bonjour,

    Disclaimer: veuillez me pardonner pour le manque flagrant d'accent, je suis sur un clavier qwerty, et je ne sais pas comment on les fait

    J'ai un autre probleme sur mon appli (le premier etant expose ici)

    Ma transparence ne se fait pas correctement. Voici ce que ca donne :


    J'ai lu sur le forum qu'il fallait aider un peu openGl en triant les faces, de la plus loin a la plus proche. J'ai donc fait un tri grossier sur l'axe des z (tri grossier dans la mesure ou il peut subsister quelques erreurs, car au lieu de me baser sur le centre de la face, je me base sur l'un de ses sommet), mais cela ne change rien du tout au rendu.

    Je n'utilise pas de lumiere perso, puisque je n'en ai pas reelement l'utilite. Peut etre que ca pourrait regler le probleme ?

    J'ai vu aussi sur un topic que le probleme pouvait venir du z-buffer, et qu'il fallait donc le desactiver en ecriture lors de l'affichage des objet transparent, mais je ne voit pas comment on peut desactiver l'ecriture et pas le test, sachant qur la seule option que j'ai trouve est Gl_DEPTH_TEST (pas de *_WRITE a l'horizon)

    Voila donc si quelqu'un eut m'aider a resoudre ce probleme, j'ai beau avoir parcouru le net, pas moyen de trouver reponse a ma question.


  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    pour desactiver l'ecriture du z-buffer, il suffit de faire un glDepthMask(GL_FALSE).
    sinon, tu utilise quoi comme mode de blending ?
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glEnable(GL_BLEND);						
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    Je n'ai pas ete chercher bien loin pour le mode de blending j'avou.

    Je vais essayer en desactivant l'ecriture sur le Z-buffer deja

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    Eh ben ! C'est deja beaucoup mieux en desactivant l'ecriture dans le Z-buffer.
    Mais il reste encore de probleme.

    Je ne sais pas si vous le voyez bien sur mon screen au dessu, mais c'est toute la surface de la patatoide qui est transparente.

    J'ai l'impression qu'il met la couleur de la face de derriere sur la face de devant.
    Sur les partie bleu, ca ne ce voit maintenant quasiment plus, mais sur les partie rose, j'ai des taches bleu

    Voyez sur cet example, avec d'autre couleur, en plein puis tranparent.


    Il semble qu'il n'arrive pas a choisir la bone couleur. Le probleme doit donc venir de ma fonction de blend je suppose. je vais regarder ca de plus pres.

    Mais sinon les question que je e pose sont donc :
    - Comment faire en sorte que la premiere couleur filtre la deuxieme ?
    - Peut-on plutot forcer la premiere couleur a cacher completement la seconde ?

  5. #5
    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
    Tu es sûr de ton tri des faces ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    Non absolument pas.
    D'ailleurs en essayant de vous le commenter je m'apercoit qu'il ne fait pas du tout ce que je veux qu'il fasse
    Jva le reprendre.

    Au passage : savez-vous comment on calcul les coordonnees du centre de la face (a partir des coordonnees de ses 3 sommets) , histoire que mon tri soit plus precis ? Je n'ai pas trouve comment faire.

  7. #7
    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
    Non absolument pas.
    D'ailleurs en essayant de vous le commenter je m'apercoit qu'il ne fait pas du tout ce que je veux qu'il fasse
    Jva le reprendre.
    Pas la peine de s'embêter, en C++ tu as std::sort pour trier. Ou mieux selon la manière dont tu stockes tes triangles.

    Au passage : savez-vous comment on calcul les coordonnees du centre de la face (a partir des coordonnees de ses 3 sommets) , histoire que mon tri soit plus precis ? Je n'ai pas trouve comment faire.
    Le centre est la moyenne des 3 sommets.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    hum ... je ne vois pas comment std::sort pourrait savoir tout seul sur quoi se baser pour faire son tri.

    Voila la definition de mes faces :

    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
     
    class Vertex {
     public:
      Vertex();
     
      float x, y, z;    // coordonnee du sommet
      float mep, eal, iel, pol;    // donnees
     
    };
     
    class Face {
     public:
      Face();
      Face(const Face &face);
      ~Face();
     
      Vertex *v1, *v2, *v3;   // pointeurs vers les 3 sommets qui composent la face
    };
    J'ai un tabeau pour les vertex, et un pour les faces

  9. #9
    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
    hum ... je ne vois pas comment std::sort pourrait savoir tout seul sur quoi se baser pour faire son tri.
    Faut lire la FAQ
    http://c.developpez.com/faq/cpp/?pag...TL_custom_sort

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    Certes ... et je vois la dedans qu'il y a plein d'autre chose que je ne connais pas (a peu pres tout a vrai dire), choses qui peuvent tres certainement m'etre utile.

    Bon donc j'etudi tout ca, et je fait mon tri correctement, et je reviens vous voir

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    Bon, aye c'est tout jolie c'est tout beau.
    J'ai fait une "belle" fonction de tri qui fait bien son boulot, et du coup la transparence marche nikel.
    Je n'ai pas utilise le std::sort puisque je devais pour cela revoir toutes l'architecture des mes donnes (pour utiliser des vector). J'ai esssaye sans (utiliser les classe vector ou assimile) ca ne marchait pas.

    Bon par contre maintenant va falloir que je trouve une methode de tri correcte, parce que celle que j'ai implemente, si elle marche bien, met beaucoup de temps (environ 30s sur une machine sgi). J'ai en effet a peu pres 10 000 faces.

    Voila donc merci bien, mon probleme redeviens purement algorithmique, de ca je pourrai m'en sortir.

  12. #12
    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
    Tu peux utiliser std::sort avec n'importe quel conteneur, même un tableau brut. Du moment que les éléments sont accessibles via un indice.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Vector3D* Faces = new Vector3D[10000];
    ...
    std::sort(Faces, Faces + 10000, LeFoncteurQuiVaBien());

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    C'est bien ce qu'il m'a semble, et j'ai essaye de faire ca, mais les valeurs devenaient n'importe quoi apres le tri.
    j'ai utlisier un foncteurQuiVaBien (puisque la meme chose que mon tri perso qui marche), et passe les bon arguments a la methode (les meme que toi a peu de chose pres), sauf que je n'ai pas fait de declaration en Vector3D (d'ailleurs elle sort d'ou cette classe, je ne la trouve pas dans les ref cpluplus.com ?), j'ai garde ma declaration perso en tableau tout simple.

    sdt:sort est-il capable de gerer les pointeur que contient ma classe Face ?
    Et autre question, quel methode de tri cela utilise-t-il ?

  14. #14
    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
    Vector3D (d'ailleurs elle sort d'ou cette classe, je ne la trouve pas dans les ref cpluplus.com ?)
    Elle n'existe pas, c'était juste pour l'exemple, vu qu'on stocke des points 3D (d'ailleurs ici c'est faux, on stocke des triangles). Enfin bref

    sdt:sort est-il capable de gerer les pointeur que contient ma classe Face ?
    Ca dépend ce que tu appelles "gérer les pointeurs".

    Et autre question, quel methode de tri cela utilise-t-il ?
    Le quick-sort. Peut-être des versions améliorées selon l'implémentation.

    Je pense qu'on irait plus vite si tu nous montrait directement ton code qui ne fonctionne pas

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    Certes, ce sera plus simple avec le code. Le voici donc :

    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
     
    // constructeur de copie pour la classe Face
    Face::Face(const Face &face) {
      v1 = new Vertex(*(face.v1));
      v2 = new Vertex(*(face.v2));
      v3 = new Vertex(*(face.v3));
    };
     
    //Foncteur pour le tri
    struct sortByZ {
      bool operator ()(const Face f1, const Face f2) const {
        return f1.center.z < f2.center.z;
      }
    };
     
    //tri
    std::sort(faces, faces+10, sortByZ());
    Citation Envoyé par resultat
    0.127843 0.19277 2.20787
    0.53407 0.09176 2.34185
    1.14985 0.109973 2.70073
    1.80748 0.0608867 2.93993
    3.42365 0.08753 3.85092
    5.04416 0.0996033 3.99429
    0.290193 0.372723 2.46509
    0.27976 0.54131 2.63036
    1.05352 0.564953 3.06317
    1.12314 0.82039 3.24289
    ////////////////////////////////// APRES
    0.127843 0.19277 2.20787
    0 0 0
    0 0 0
    0 0 0
    0 0 0
    0 0 0
    0 0 0
    0 0 0
    0 0 0
    0 0 0
    Comme vous pouvez le voir, les valeurs ne sont plus bonnes apres le tri (la derniere fois j'avais des valeur en xE-39).

    Je ne pense pas que cela vienne de mon constructeur de copie puisque celui-ci a fait son boulot dans mon tri a bulle (par contre la memoire saturait aussi au bout d'un moment).

    De plus, si je fais le tri sur l'ensemble de mes faces, j'ai un joli "bus error". Et en ayant implemente le tri rapide moi-meme, j'ai eu le droit a un beau "stack exceeded" en critical error

    Quand je demandais s'il savait gerer mes pointeur, c'etait en rapport avec mon constructeur de copie. Le sort s'en sert-il ? (logiquement oui)
    Donc je pense que mes prob de memoire vienne de la, je libere mal la place. Mais par contre je ne comprend pas pourquoi mes valeurs deviennent autre chose avec le std::sort.

  16. #16
    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
    Il y a quelques mauvaises manipulations de mémoire dans ton code

    Pourquoi allouer les sommets du triangle dynamiquement ? D'autant plus que ça te fait définir inutilement un constructeur par défaut, un constructeur par copie, un destructeur et un opérateur d'affectation, le tout juste pour une structure qui ne fait qu'aggréger 3 ou 4 Vertex (qui eux-même ne font qu'aggréger 3 float normalement).

    Ensuite ton foncteur devrait prendre ses paramètres par référence constante, là tu va faire un nombre incalculable de copies inutiles de tes éléments.

    Bref la méthode est bonne, je pense que tes problèmes viennent simplement d'une mauvaise gestion de la mémoire.

    En l'occurence j'ai vu que la variable centre n'était pas initialisée dans le constructeur par copie, ce qui fait qu'elle sera toujours à 0, ce qui expliquerait le tri foireux.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    Mince je n'avais pas vu la reponse, j'etais reste sur la premiere page Je me galere tout seul pour rien (enfin ca m'a permis d'etudier plusieurs methode de tri)

    Citation Envoyé par Laurent Gomila
    Pourquoi allouer les sommets du triangle dynamiquement ? D'autant plus que ça te fait définir inutilement un constructeur par défaut, un constructeur par copie, un destructeur et un opérateur d'affectation, le tout juste pour une structure qui ne fait qu'aggréger 3 ou 4 Vertex (qui eux-même ne font qu'aggréger 3 float normalement).
    Et bien tout simplement parce que je ne les connais pas a l'avance. Je lis toutes mes donnees dans un fichier, qui contient les coordonnees de chaque sommet, puis pour chaque face, les numeros de ses 3 sommets.
    Je ne suis pas assez maso pour utiliser du dynamique alors que du statique marche a merveille.

    Citation Envoyé par Laurent Gomila
    Ensuite ton foncteur devrait prendre ses paramètres par référence constante, là tu va faire un nombre incalculable de copies inutiles de tes éléments.
    En effet, j'ai pas fait gaffe a ca.

    Citation Envoyé par Laurent Gomila
    En l'occurence j'ai vu que la variable centre n'était pas initialisée dans le constructeur par copie, ce qui fait qu'elle sera toujours à 0, ce qui expliquerait le tri foireux.
    Ah oui tiens, j'ai oublie de mettre a jour mon constructeur de copie lorsque j'ai rajoute la variable center



    Bon, petites corrections effectuees, maintenant je retrouve mes valeurs bizarre. En fait elles sont sur les valeur pointee.
    Voila ce que ca donne : J'affiche faces[i].v1->x puis le y puis le z
    Citation Envoyé par resultat
    0.12745 0.39226 2.33909
    0.36725 0 2.0828
    0.91917 0 2.5254
    1.61218 0 2.79238
    3.05108 0 3.63614
    4.81859 0 4.04328
    0.12745 0.39226 2.33909
    0.12745 0.39226 2.33909
    0.93311 0.67795 3.16892
    0.93311 0.67795 3.16892
    //////////////////////////////////
    0.12745 0.39226 2.33909
    3.33871e-29 1.53448 4.03379
    3.33871e-29 1.53448 4.03379
    3.33871e-29 1.53448 4.03379
    3.3382e-29 1.25745 4.06285
    3.33871e-29 1.53448 4.03379
    3.3382e-29 1.25745 4.06285
    3.3382e-29 1.25745 4.06285
    3.33871e-29 1.53448 4.03379
    3.33871e-29 1.53448 4.03379

  18. #18
    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
    Et bien tout simplement parce que je ne les connais pas a l'avance. Je lis toutes mes donnees dans un fichier, qui contient les coordonnees de chaque sommet, puis pour chaque face, les numeros de ses 3 sommets.
    Et ? En quoi le fait de ne pas allouer dynamiquement tes variables poserait problème ?

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut
    ben je ne connais pas le nombre de sommets ni de faces avant de lancer le programme et de charger le fichier.

    Ou alors tu parle du fait de d'utiliser des pointeurs dans ma class Face ?
    C'est pour ne pas recopier inutilement plein de fois chaque sommets. En fait mes pointeurs ne font que pointer sur un truc existant deja, dans le tableau de vertex. Je ne fait pas de new lorsque je cree une face.

    Le probleme vient surement de la en fait en y pensant. Lors de l'appel au destructeur, je detruit un objet alors que d'autres peuvent encore pointer dessus ...

  20. #20
    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
    Je suis d'accord pour l'allocation dynamique lorsque tu as un tableau de taille inconnue à la compilation, mais je parlais ici des sommets de la classe Face. Il y en a 3, pourquoi les allouer chacun dynamiquement ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. comment faire un background transparent?
    Par guigui1005 dans le forum Composants
    Réponses: 5
    Dernier message: 17/05/2012, 21h45
  2. [Composant] La transparence
    Par Nuts07 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/05/2003, 14h51
  3. Comment rendre transparent le tour d un icone
    Par NeoRonin dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/03/2003, 01h40
  4. Réponses: 1
    Dernier message: 23/02/2003, 06h22
  5. ouverture d'une form en fondu transparent
    Par nicholz dans le forum Composants VCL
    Réponses: 9
    Dernier message: 08/01/2003, 11h06

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