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 :

Crash OpenGL avec les cartes graphiques NVidia


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut Crash OpenGL avec les cartes graphiques NVidia
    Bonjour,

    Je code actuellement un viewer d'objet 3D. Mon logiciel contient 4 fenêtres montrant l'objets sous différents Angles.
    Jusque là tout va plutôt bien. Je développe ce logiciel avec Qt et utilise donc les Objets OpenGL de cette librairie.

    Mon problème est que sur les PC contenant une carte graphique NVidia, le logiciel crash dès que le logiciel essai d'afficher l'objet. J'ai donc tenté d'installer une carte graphique NVidia sur mon PC de développement ( je retrouve mon crash), mon problème est que le logiciel ne crash pas lorsque j'essai de le lancer en mode Debug.

    Les informations que j'ai pu récupérer de ce crash sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <EXE NAME="nvoglv64.DLL" FILTER="CMI_FILTER_THISFILEONLY">
        <MATCHING_FILE NAME="nvoglv64.dll" SIZE="30487880" CHECKSUM="0x5AA5A01B" BIN_FILE_VERSION="10.18.13.5362" BIN_PRODUCT_VERSION="10.18.13.5362" PRODUCT_VERSION="10.18.13.5362" FILE_DESCRIPTION="NVIDIA Compatible OpenGL ICD" COMPANY_NAME="NVIDIA Corporation" PRODUCT_NAME="NVIDIA Compatible OpenGL ICD" FILE_VERSION="10.18.13.5362" ORIGINAL_FILENAME="nvoglv32.dll" INTERNAL_NAME="nvoglv32.dll" LEGAL_COPYRIGHT="(C) 2015 NVIDIA Corporation. All rights reserved." VERDATEHI="0x0" VERDATELO="0x0" VERFILEOS="0x40004" VERFILETYPE="0x2" MODULE_TYPE="WIN32" PE_CHECKSUM="0x1D17BE1" LINKER_VERSION="0x10064" UPTO_BIN_FILE_VERSION="10.18.13.5362" UPTO_BIN_PRODUCT_VERSION="10.18.13.5362" LINK_DATE="07/23/2015 00:14:44" UPTO_LINK_DATE="07/23/2015 00:14:44" EXPORT_NAME="nvoglv64.dll" VER_LANGUAGE="Anglais (États-Unis) [0x409]" EXE_WRAPPER="0x0" />
    </EXE>
    <EXE NAME="kernel32.dll" FILTER="CMI_FILTER_THISFILEONLY">
        <MATCHING_FILE NAME="kernel32.dll" SIZE="1163264" CHECKSUM="0xADFC88B8" BIN_FILE_VERSION="6.1.7601.23392" BIN_PRODUCT_VERSION="6.1.7601.23392" PRODUCT_VERSION="6.1.7601.18015" FILE_DESCRIPTION="DLL du client API BASE Windows NT" COMPANY_NAME="Microsoft Corporation" PRODUCT_NAME="Système d’exploitation Microsoft® Windows®" FILE_VERSION="6.1.7601.18015 (win7sp1_gdr.121129-1432)" ORIGINAL_FILENAME="kernel32" INTERNAL_NAME="kernel32" LEGAL_COPYRIGHT="© Microsoft Corporation. Tous droits réservés." VERDATEHI="0x0" VERDATELO="0x0" VERFILEOS="0x40004" VERFILETYPE="0x2" MODULE_TYPE="WIN32" PE_CHECKSUM="0x11D048" LINKER_VERSION="0x60001" UPTO_BIN_FILE_VERSION="6.1.7601.23392" UPTO_BIN_PRODUCT_VERSION="6.1.7601.23392" LINK_DATE="03/17/2016 22:56:03" UPTO_LINK_DATE="03/17/2016 22:56:03" EXPORT_NAME="KERNEL32.dll" VER_LANGUAGE="Français (France) [0x40c]" EXE_WRAPPER="0x0" />
    </EXE>
    Voici la manière dont j'affiche mes objets :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    void Apercu3D::AfficheObjet3D(unsigned int indice, bool picking)
    {
     
        QMap<int, QGLBuffer>::Iterator itVertex = listeVertexBuffer.find(listeDesObjets.GetObjectByIndice(indice).GetID());
     
        int nbPoint = listeDesObjets.GetObjectByIndice(indice).GetNbTriangles() * 3;
        if (itVertex == listeVertexBuffer.end())
        {
            vector<CPoint> listePoint = listeDesObjets.GetObjectByIndice(indice).GetPointDessin();
            vector<CPoint> listeNormal = listeDesObjets.GetObjectByIndice(indice).GetPointNormal();
     
            int nbPointVBO = static_cast<int>(listePoint.size());
            int nbNormal = static_cast<int>(listeNormal.size());
            vector<CPoint> laVBO;
            laVBO.reserve(nbPointVBO + nbNormal);
            for (int i = 0; i < nbPointVBO; ++i)
            {
                laVBO.push_back(listePoint[i]);
                laVBO.push_back(listeNormal[i]);
            }
            itVertex = listeVertexBuffer.insert(listeDesObjets.GetObjectByIndice(indice).GetID(), QGLBuffer());
            itVertex.value().create();
            itVertex.value().bind();
            itVertex.value().allocate((nbPointVBO + nbNormal) * sizeof(CPoint));
            itVertex.value().write(0, laVBO.data(), ((int)laVBO.size() * sizeof(CPoint)));
            itVertex.value().release();
        }
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_NORMAL_ARRAY);
        glEnable(GL_PROGRAM_POINT_SIZE);
     
        itVertex.value().bind();
        // Vertex attribute
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 2 * sizeof(CPoint), (GLvoid*)0);
        glEnableVertexAttribArray(0);
          // Normal attribute
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 2 * sizeof(CPoint), (GLvoid*)sizeof(CPoint));
        glEnableVertexAttribArray(1);
     
        //Choix du mode d'affichage
        if (modeAffichage == FIL_DE_FER)
        {
            glLineWidth(1);
            glPolygonMode(GL_FRONT_AND_BACK , GL_LINE);
        }
        else if (modeAffichage == VERTEX)
        {
            glPointSize(5.0);
            glPolygonMode(GL_FRONT_AND_BACK , GL_POINT);
        }
        else
            glPolygonMode ( GL_FRONT_AND_BACK , GL_FILL);
     
        glDrawArrays(GL_TRIANGLES,0,nbPoint);
     
        itVertex.value().release();
     
        glPolygonMode ( GL_FRONT_AND_BACK , GL_FILL ) ;
     
        glDisable(GL_PROGRAM_POINT_SIZE);
        glEnableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
    }
    Avez vous déjà eu ce genre de problème?
    Y a t'il quelques chose à ajouter pour gérer les carte NVIDIA?
    Voyez vous des choses suspects dans mon code?

    Merci d'avance pour vos futurs réponses.

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int i = 0; i < nbPointVBO; ++i)
    c'est avec QVector ?
    En principe avec la STL et donc std::vector qui doit être exactement la même chose que les conteneurs de Qt pour parcourir une liste de vectors on déclare ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int i = 0; i < nbPointVBO; i++)
    le i est incrémenté par la suite.
    Un exemple ici

    http://www.cplusplus.com/reference/v...ector/operator[]/

    Tu peux pas mettre un point d'arrêt pour déboguer
    Le paramètrage de la nVidia je ne pense pas que cela influence les choses étant donné que le but d'Open GL c'est de faire abstraction de la carte.

  3. #3
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 034
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int i = 0; i < nbPointVBO; ++i)
    c'est avec QVector ?
    En principe avec la STL et donc std::vector qui doit être exactement la même chose que les conteneurs de Qt pour parcourir une liste de vectors on déclare ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (int i = 0; i < nbPointVBO; i++)
    le i est incrémenté par la suite.
    Gné???

    La différence entre pré-incrémentation et post-incrémentation n'a aucune influence sur le bon déroulement de la boucle, et de par le comportement de la post-incrémentation, il est généralement conseillé de prendre l'habitude d'utiliser la pré-incrémentation (pour éviter la création d'objet temporaire, notamment...)

    Après, pour la différence entre les cartes graphiques, dans le meilleur des mondes ce serait comme tu le décris, malheureusement les constructeurs font un peu ce qu'ils veulent dans leur implémentation de la spéc.
    Donc on peut effectivement se retrouver avec ce genre de soucis de plantage avec un GPU et pas un autre, voire d'une version de driver à une autre.
    C'est d'ailleurs par là que je commencerais, changer de version du driver (plus vieux ou plus récent).
    Je te conseille aussi d'abuser de glGetError et des extensions de debug ARB, KHR ou AMD (glDebugMessageCallback et comparses), elles peuvent te sauver des cheveux...

    Ensuite, si tu as un crash en Release et pas en Debug, ça laisse penser que ce n'est pas forcément le GPU le problème, mais qu'il sert de révélateur à un problème dans ton code.
    Sais-tu sur quelle ligne de ton code le plantage apparaît?
    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).

  4. #4
    Membre éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut
    La différence entre pré-incrémentation et post-incrémentation n'a aucune influence sur le bon déroulement de la boucle, et de par le comportement de la post-incrémentation, il est généralement conseillé de prendre l'habitude d'utiliser la pré-incrémentation (pour éviter la création d'objet temporaire, notamment...)
    En effet on m'a dit il y a peu que le ++i est plus opti que le i++ dans les boucle for car il ne passe pas par un objet temporaire.

    Je te conseille aussi d'abuser de glGetError et des extensions de debug ARB, KHR ou AMD (glDebugMessageCallback et comparses), elles peuvent te sauver des cheveux...
    Concernant les glGetError j'ai essayer de mettre ce bout de code entre chaque ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if ((errCode = glGetError()) != GL_NO_ERROR)
        {
            qDebug()<< gluErrorString(errCode);
        }
    Mais cela ne m'a rien renvoyé du tout.

    Concernant les extensions de debug ARB, KHR ou AMD, étant relativement novice avec openGL je ne connais pas du tout. Pourrais-tu éventuellement m'en dire un peu plus là dessus ( ne t'inquiètes pas je chercherais quand même de mon coté )


    Ensuite, si tu as un crash en Release et pas en Debug, ça laisse penser que ce n'est pas forcément le GPU le problème, mais qu'il sert de révélateur à un problème dans ton code.
    Comment se ferrait-il que cela ne planterai qu'avec les carte NVidia alors? AMD serait plus souple? Je ne pense pas que cela soit dû a autre chose que l'affichage ( pas a l'importation,l'instanciation de l'objet, ou ajout dans la liste) .

    Sais-tu sur quelle ligne de ton code le plantage apparaît?
    Absolument pas du tout. Je sais juste que la seul différence entre le moment ou dans ma scène je n'ai pas d'objets et celui ou j'en ai, est en terme d'affichage, cette fonction.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Gné???

    La différence entre pré-incrémentation et post-incrémentation n'a aucune influence sur le bon déroulement de la boucle, et de par le comportement de la post-incrémentation, il est généralement conseillé de prendre l'habitude d'utiliser la pré-incrémentation (pour éviter la création d'objet temporaire, notamment...)
    autant pour moi j'ai fait une erreur je viens de vérifier avec Visual C++

  6. #6
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 034
    Billets dans le blog
    12
    Par défaut
    Si tu es sous Visual Studio, tu peux tenter une compilation Release avec les informations de débogage, sinon il ne te reste plus qu'à débugger au std::cout, pour trouver la ligne incriminée.
    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).

  7. #7
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Par défaut
    Je ne sais pas quel contexte OpenGL tu utilises , mais par exemple en OpenGL 3.2 core profile, l'utilisation des VAO est obligatoire. Certaines carte graphiques l'accepterons sans (par exemple si elle bascule en non core profile) d'autres feront tout simplement crasher le programme. Après le fait que ça marche en Debug et pas en Release est vraiment étrange, peut être des optimisations de compilation font que le programme plante.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/06/2014, 13h37
  2. [Carte mère] La meilleurs carte mère SLI avec deux carte graphique NVIDIA GeForce GTX 780 Ti 3Go
    Par raizakelly dans le forum Composants
    Réponses: 0
    Dernier message: 27/01/2014, 17h33
  3. installer unix avec une carte graphique NVIDIA
    Par info_t dans le forum Unix
    Réponses: 0
    Dernier message: 31/10/2009, 11h29
  4. Update 2009 pour les cartes graphiques NVIDIA
    Par kOrt3x dans le forum Apple
    Réponses: 0
    Dernier message: 27/01/2009, 00h02
  5. Ma carte graphique nVidia GeForce4
    Par Invité4 dans le forum Matériel
    Réponses: 3
    Dernier message: 28/04/2005, 21h47

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