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 :

debutant opengl : d'ou viennent ces problemes ?


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Par défaut debutant opengl : d'ou viennent ces problemes ?
    Bonjour,

    Je developpe depuis environ deux semaines avec OpenGL. Je m'arrache les cheveux depuis 3 jours. J'obtiens des effets "bizarres", lorque j'utilise le blending (+/- le fog). J'ai lu et relu mon code, des tutorials sur le net, mais rien faire.

    Voici les captures des differents effets que j'obtiens (les "lignes" sont detaillees dans le code source) :

    Cas 1 :
    ligne I : commenté
    ligne II : non commenté
    ligne III : commenté


    Cas 2 :
    ligne I : non commenté
    ligne II : non commenté
    ligne III : commenté


    Cas 3 :
    ligne I : commenté
    ligne II : non commenté
    ligne III : non commenté


    Cas 4 :
    ligne I : non commenté
    ligne II : non commenté
    ligne III : non commenté


    Le code source :
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glut.h>


    GLsizei w, h;
    GLfloat fogColor [4] = {1.0, 1.0, 0.5, 1.0};


    void init (void) {
    glClearColor (1.0, 1.0, 0.5, 1.0);
    glShadeModel (GL_SMOOTH);

    glEnable (GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);

    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective (30, 1.0, .1, 15);

    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();

    // Initialisation du blending + lissage
    glHint (GL_LINE_SMOOTH_HINT, GL_FASTEST);
    glHint (GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
    glLineWidth (1.5);
    glEnable (GL_LINE_SMOOTH);
    // glEnable (GL_POLYGON_SMOOTH); // <<<======================= Ligne I
    glEnable (GL_BLEND); // <<<===================================== Ligne II
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // Initialisation du fog
    glFogi (GL_FOG_MODE, GL_EXP);
    glFogf (GL_FOG_DENSITY, .5);
    glFogfv (GL_FOG_COLOR, fogColor);
    glHint (GL_FOG_HINT, GL_FASTEST);
    glFogf (GL_FOG_START, 1.0);
    glFogf (GL_FOG_END, 5.0);
    glEnable (GL_FOG); // <<<======================================= Ligne III
    }


    void display (void) {
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Transformation de visualisation
    glPushMatrix ();
    glRotatef (0, 0, 1, 0);
    glTranslatef (0, 0, -9);

    glDepthMask (GL_FALSE);

    // Dessine 2 lignes croisees
    glColor4f (1.0, .0, 1.0, 1.0);
    glBegin (GL_LINES);
    glVertex3f (-.5, -.5, 0);
    glVertex3f (1.5, .5, 0);
    glVertex3f (.5, -.5, 0);
    glVertex3f (-1.5, .5, 0);
    glEnd ();

    glPushMatrix ();
    glColor4f (1.0, .0, .5, .4);
    glTranslatef (1.75, 0, -1.0);

    // Dessine le triangle
    glPushMatrix ();
    glTranslatef (-1.5, 0.0, 0);
    glBegin (GL_TRIANGLES);
    glVertex3f (-.5, -.5, 0);
    glVertex3f (.5, -.5, 0);
    glVertex3f (0, .5, 0);
    glEnd ();
    glPopMatrix ();


    // Dessine 3 spheres
    glutSolidSphere (1.0, 20, 16);
    glTranslatef (-1.5, 0, -1.5);
    glTranslatef (-1.5, 0, -1.5);
    glutSolidSphere (1.0, 20, 16);
    glTranslatef (-1.5, 0, -1.5);
    glutSolidSphere (1.0, 20, 16);

    glPopMatrix ();
    glPopMatrix ();

    glDepthMask (GL_TRUE);
    glutSwapBuffers ();
    }


    int main (int argc, char ** argv) {
    w = 400;
    h = 400;

    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize (w, h);
    glutInitWindowPosition (0, 0);
    glutCreateWindow (argv[0]);
    init ();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
    }
    Je ne comprends pas les différents effets que j'obtiens et les moyens de les contourner.

    Pour le cas 1, seul le blending est activé, çà fonctionne normalement.

    Pour le cas 2, j'ai activé le blending et le lissage des polygones. Les traits qui correspondent au chevauchement des polygones peuvent etre supprimé (je crois) par le multi-echantillonage. Cela, signifie-t-il qu'on ne peut pas utiliser le lissage des polygones dans la majorité des situations ?

    Pour le cas3, j'ai activé le blending et le fog, cependant on obtient le meme resultat que dans le cas 1 (avec les couleur un peu plus claires). Les spheres ne se trouvant pas à la meme profondeur ont devrait constater une difference de couleur.

    Pour le cas 4, j'ai activé le blending avec lissage des polygones et le fog. Là, je comprends strictement rien.


    Ma carte video est une ATI rage mobility P/M. Je sais que c'est de la dob. Le problème pourrait-il venir de là.

    Je sais que çà fait beaucoup de questions pour un seul post.

    Merci pour vos réponses.

  2. #2
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    ouaip en fait le blending (qui veut dire mélange) mélange donc la couleur obtenue avec l'ancienne couleur se trouvant dans le backbuffer... c'est à dire que si tu n'affiche pas tes sphères dans un certain ordre : (du plus loin au plus pret) eh bas tu auras ce résultat final

    en fin c'est ce que je pense j'a pas lu le code

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Par défaut probleme avec le blending et le fog
    bob.killer,

    en koi le fait d'afficher mes objet dans un certain ordre va-t-il resoudre les effets que j'obtiens sur mes spheres dans le cas 2, et supprimer les effets "louches" que j'obtiens dans le cas 4 ?

    De plus, si tu regardes mon code , tu verras que j'ai desactivé le mode ecriture dans le Z-buffer ==> glDepthMask(GL_FALSE);

    Losque tu veux afficher des objets opaques et translucides, il est vrai que tu dois commencer par afficher les objets opaques, puis desactiver l'ecriture du Z-buffer, puis de dessiner les objets transparents. Or, ma scene est composée d'objets translucides sauf les deux droites.

    Merci pour ta reponse.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Par défaut problemes avec le blending et le fog
    Petite precision, dans le cas 2, les effets indesirables ne sont pas le chevauchement des spheres, mais mais celui des QUADS sur chage spheres.

    Si, vous voulez des precisions, demandez moi.

  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
    Tiré de la doc de glBlendFunc :

    Transparency is best implemented using glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) with primitives sorted from farthest to nearest.

    la fonction de blending que tu utilises est dépendante de l'ordre d'affichage de tes objets

    assures toi d'afficher tes polygones du plus lointain au plus proche et regardes le résultat

    par contre je ne comprend pas ton histoire de quads dans le cas 2, tu n'affiches aucun quad :
    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
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par shenron666
    par contre je ne comprend pas ton histoire de quads dans le cas 2, tu n'affiches aucun quad :
    Je pense qu'il parle du fait qu'on voit la triangulation des sphères...

    Jc

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 11
    Par défaut probleme avec le fog et le blending
    Oui, en effet, la primitive geometrique de la sphere n'existe pas, donc les spheres sont composées de GL_QUADS.
    Dans le cas 2, on le voit nettement avec le probleme que j'ai : les lignes sur les spheres sont un effet provoqué par le lissage des polygones entre les GL_QUADS.

    Par contre, afficher les polygones dans un certain ordre (profondeur) suppose que l'on connaisse les coordonnées des polygones apres transformation de MODEL_VIEW et de PROJECTION. Existe-t-il une fonction permettant de recuperer ces coordonnees ? Ou faut-il le faire "à la main" en multipliant les coordonnees du sommet par la matrice de modelisation et de projection ce qui serait une perte de temps ?

    Je sais ! Il faudrait que j'essaie de faire des phrases plus courte.

  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 connaitre les coordonnées de tes objets et de ton point de vue
    tu fais des calculs de distance d'un point à un autre, c'est approximatif mais suffisant
    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.

Discussions similaires

  1. je suis super debutant et j'ai un petit probleme
    Par trkvampiros dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/02/2007, 13h39
  2. Réponses: 2
    Dernier message: 03/10/2006, 22h41
  3. [debutant] form1.EXE a rencontré un probleme,paradox-ttable
    Par sam591 dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/08/2005, 21h25
  4. [debutant]opengl avec sdl sous visual c++
    Par bourinator dans le forum OpenGL
    Réponses: 1
    Dernier message: 13/06/2005, 11h24
  5. [DOM] d'où viennent ces méthodes ?
    Par Kendael dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 02/06/2005, 14h05

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