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 :

Bug visuel, d'ou vient-il ? [OpenGL 1.x]


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut Bug visuel, d'ou vient-il ?
    Bonjour,

    Je travail sur une vue 3D avec OpenGL sous DELPHI.
    Globalement tout va bien, mais j'ai des "ombres" qui apparaissent sur mon cylindre.



    Je ne comprend pas d'ou viennes ces "ombres". J'ai vérifié les lumieres, les normales... je cale !

    Merci d’avance de l'aide que vous saurez m'apporter !

    Je ne peux pas mettre mes 2000 lignes de code ici, mais voici le coeur du dessin :

    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
    // Dessin d'un point sur le schéma
    procedure TArmaGL.DessinerPoint(P1, P2: TPoint3D2);
    var
      vecNormale: TVecteur;
    begin
      // Calul du vecteur normal
      vecNormale := DoVecteur(P1, P2);
      // Affectation de la normale
      glNormal3f(vecNormale.X, vecNormale.Y, vecNormale.Z);
      // Ajout du point
      glVertex3d(P2.X, P2.Y, P2.Z);
    end;
     
      // Boucle sur les points de l'objet
      for i := 0 to oObjet.TabPoint.Count - 2 do
      begin
        // début de la forme
        glBegin(GL_QUAD_STRIP);
        for j := 0 to m_iQualite do
        begin
          DessinerTexture(j, iTexturePoint, oObjet.TabPoint[i].Norme);
          DessinerPoint( //
            oObjet.TabPoint[i].PointCentral, //
            oObjet.TabPoint[i].TabPointCylind[j]);
          DessinerTexture(j, iTexturePoint, 10);
          DessinerPoint( //
            oObjet.TabPoint[i + 1].PointCentral, //
            oObjet.TabPoint[i + 1].TabPointCylind[j]);
        end;
        // fin de la forme
        glEnd();
      end;

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Salut!

    Ca fait penser à du z-fight.
    Peux-tu montrer comment tu initialises ta matrice de projection? (glFrustum, glOrtho, glPerspective...)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Merci DragonJoker59 de t'interesser à mon problème et de prendre le temps de regarder.
    Voici mon code d'initialisation :

    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
     
      // raz de l'écran
      glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
      // raz de la matrice
      glLoadIdentity();
      // mode de polygone
      if m_bModePolygoneFilaire then
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
      else
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
      // textures ou non
      if m_bTexture then
        glEnable(Gl_texture_2d)
      else
        glDisable(Gl_texture_2d);
      // lumiere et matériaux
      DefinirLumiere();
      // création du quadric
      m_oGluQuadric := gluNewQuadric();
      // mode de polygone de l'objet GLU_POINT GLU_LINE GLU_FILL
      gluQuadricDrawStyle(m_oGluQuadric, GLU_FILL);
      // position de la caméra et du regard
      gluLookAt(m_oCamera.X, m_oCamera.Y, m_oCamera.Z, m_oVise.X, m_oVise.Y,m_oVise.Z, 0, -1, 0);
      // rotation par l'utilisateur
      glRotate(m_iRotationX, 1, 0, 0);
      glRotate(m_iRotationY, 0, -1, 0);
      // dessin des objets
      if m_ListObjet <> nil then
        for i := 0 to m_ListObjet.Count - 1 do
          DessinerObjet(m_ListObjet[i]);
      // suppression du quadric
      gluDeleteQuadric(m_oGluQuadric);
      // envoi à l'affichage
      glFlush();
      SwapBuffers(m_oForm.Canvas.Handle);

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Je suppose que la gestion des lumières peut être liée à mon problème, voici donc le code concerné :

    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
        // Position de la source lumineuse
        PositionSourceLumineuse[0] := 1;
        PositionSourceLumineuse[1] := 1;
        PositionSourceLumineuse[2] := 1;
        PositionSourceLumineuse[3] := 0;
        glLightfv(GL_LIGHT0, GL_POSITION, @PositionSourceLumineuse);
        // Couleur de la source lumineuse
        LumiereDiffuse[0] := 0.5;
        LumiereDiffuse[1] := 0.5;
        LumiereDiffuse[2] := 0.5;
        LumiereDiffuse[3] := 1;
        glLightfv(GL_LIGHT0, GL_DIFFUSE, @LumiereDiffuse);
        // lumiere ambiante
        LumiereAmbiante[0] := 0.5;
        LumiereAmbiante[1] := 0.5;
        LumiereAmbiante[2] := 0.5;
        LumiereAmbiante[3] := 1;
        glLightfv(GL_LIGHT0, GL_LIGHT_MODEL_AMBIENT, @LumiereAmbiante);
        // on active la gestion de la lumiere et la lampe 0
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);

  5. #5
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Je ne vois pas d'appel à gluPerspective/glFrustum/glOrtho.
    Essaie, pour tester, d'appeler gluPerspective avec un zNear à 0.01 et un zFar à genre 100.0.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    De mémoire, c'est le gluLookAt qui remplace cela, mais je vais essayer. Week end oblige, je te tiens au courant lundi, merci beaucoup quoi qu'il arrive !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    méa culpa, en vérifiant j'ai retrouvé celà :p

    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
     
      GL_VUE_DEBUT = 1;
      GL_VUE_FIN = 100000;
    // Redimentionne l'affichage OpenGL
    procedure TArmaGL.Redimentionner();
    begin
      // Envoi les dimensions de la fenêtre pour éviter les déformations
      glViewport(0, 0, m_oForm.ClientWidth, m_oForm.ClientHeight);
      // Définition de la matrice de projection (cf glFrustnum ou glOrtho)
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      gluPerspective(GL_VUE_ANGLE, // Angle de vue, par défaut 45
        m_oForm.ClientWidth / m_oForm.ClientHeight, // Rapport larg/haut de la frm
        GL_VUE_DEBUT, // debut de la vue par rapport à la caméra
        GL_VUE_FIN); // fin de la vue par rapport à la caméra
      // on réactive la matrice de modeleview
      glMatrixMode(GL_MODELVIEW);
    end;

  8. #8
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    As-tu essayé en mettant les valeurs que je t'ai donné?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  9. #9
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Ce n'était pas le même problème, mais l'explication fournie ici pourrait peut-être t'aider.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  10. #10
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Mon site est en rade.. mais pour ceux qui veulent comprendre comment fonctionne le Z-Buffer et pourquoi choisir telle valeur de Zmin et Zmax et leur influence sur la précision, vous pouvez vous référer à cette archive :
    https://web.archive.org/web/20131021...-tutorial.html

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    J'ai bien reçu vos réponses, merci beaucoup. J'étudie cela et je reviens vers vous pour donner le fin mot de l'histoire, et, je l'espères, marquer le post comme résolu !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Vous avez raison, le problème est bien lié au znear / zfar !

    D'après ce que je comprend, il n'y a pas de solution miracle.

    En mettant une plage de vision plus courte, j'ai de bien meilleur résultats, cependant, mes objets peuvent être affichés de très près ou de très loin. Je vais essayer de calculer ces znear/zfar dynamiquement afin de les optimiser...

    Merci encore d'avoir prit du temps pour moi !

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

Discussions similaires

  1. [XL-2010] Utilisation du treeview - bug visuel
    Par Jean-Philippe André dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/02/2014, 12h45
  2. D'où vient le bug sur IE
    Par swissblack dans le forum Flash
    Réponses: 0
    Dernier message: 29/12/2009, 01h55

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