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 :

glLinkProgram et GL_COMPILE_STATUS


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut glLinkProgram et GL_COMPILE_STATUS
    Bonjour à tous

    Ceci n'est pas réellement un problème mais une question qui me taraude depuis une heure sans que je parvienne à trouver la réponse sur internet.
    J'utilise 2 shaders attachés à un programme que je link :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glAttachShader(m_program,m_vertexShader->getShaderId());
    glAttachShader(m_program,m_fragmentShader->getShaderId());
    glLinkProgram(m_program);
    Pour pouvoir facilement accéder aux éventuelles erreurs, un petit ensemble de lignes de codes suffit :
    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
    GLsizei logsize = 0;
        GLint compileStatus = GL_TRUE;
        char *log = NULL;
        glGetProgramiv(m_program, GL_COMPILE_STATUS, &compileStatus);
        if(compileStatus!=GL_TRUE)
        {
            glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &logsize);
     
            log = new char[logsize+1];
            if(log==NULL)
            {
                std::cout<<"Probleme d'allocation memoire, impossible de recuperer l'erreur de chargement du programme";
                if(m_vertexShader!=NULL&&m_fragmentShader!=NULL)
                    std::cout<<" contenant "<<m_vertexShader->getFileName()<<" et "<<m_fragmentShader->getFileName()<<std::endl;
                else if(m_vertexShader!=NULL)
                    std::cout<<" contenant "<<m_vertexShader->getFileName()<<std::endl;
                else if(m_fragmentShader!=NULL)
                    std::cout<<" contenant "<<m_fragmentShader->getFileName()<<std::endl;
                else
                    std::cout<<std::endl;
                return;
            }
     
            log[logsize] = '\0';
            glGetProgramInfoLog(m_program, logsize, &logsize, log);
            std::string ErrorsWarnings(log);
            std::cout<<"Impossible de compiler le programme";
            if(m_vertexShader!=NULL&&m_fragmentShader!=NULL)
                std::cout<<" contenant "<<m_vertexShader->getFileName()<<" et "<<m_fragmentShader->getFileName()<<std::endl;
            else if(m_vertexShader!=NULL)
                std::cout<<" contenant "<<m_vertexShader->getFileName()<<std::endl;
            else if(m_fragmentShader!=NULL)
                std::cout<<" contenant "<<m_fragmentShader->getFileName()<<std::endl;
            else
                std::cout<<std::endl;
            std::cout<<">>> "<<ErrorsWarnings<<std::endl;
     
            delete log;
        }
    Voici mon problème : j'ai 2 shaders parfaitement chargés qui ne génèrent aucune erreur et qui sont attachés au programme. Je link le programme et récupère les erreurs.
    Au départ, mes shaders étaient plus ou moins corrects donc les erreurs étaient justifiées mais après correction le glLinkProgram entraine GL_COMPILE_STATUS à false, et donc l'affichage d'une erreur liée au programme.
    Voici cette erreur, qui n'en est pas une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fragment shader(s) linked, vertex shader(s) linked
    C'est donc pour moi totalement incompréhensible puisque le shader fonctionne correctement mais GL_COMPILE_STATUS est quand même à false après le link du programme.

    Une explication ?

    Je voulais également savoir ce qui déterminais la valeur de la fonction
    Si vous pouvez m'éclairer n'hésitez pas

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 166
    Billets dans le blog
    154
    Par défaut
    Bonjour,

    Pour la fonction glGetAttribLocation, le résultat vient du pilote graphique. Celui-ci définit un ID par variable attribute qu'il croise (généralement en partant de 0 et il va dans l'ordre, enfin du moins, chez NVIDIA).

    Pour votre autre erreur, faites des tests avec glGetError() après chaque fonction OpenGL. Vous avez peut être une autre erreur qui s'est glissée.
    Avec un débogueur (ou gDEBugger) vous pouvez vérifier si les IDs sont bons.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    gDEBugger m'indique que tous les ID correspondent entre eux, donc je ne pense pas que le problème vienne de là.
    J'insiste d'ailleurs sur le fait que ce n'est pas réellement un problème mais comme une erreur est indiquée alors qu'elle n'a pas lieu d'être cela me perturbe

    Si personne n'a d'idée ce n'est pas très grave cela fera juste un peu tâche dans mon programme (j'essaie de m'en convaincre moi même car je déteste les résultats sales )

    Enfin bref toute suggestion sera bienvenue

    PS : voici ce que m'indique gDEBugger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ------ Build Started: GL Context 3 ------
    Compiling...
    Linking...
    Program 3
         Fragment shader(s) linked, vertex shader(s) linked. 
     
    Validating...
    Program 3
         Fragment shader(s) linked, vertex shader(s) linked. 
          Validation successful. 
    ----------------- Done -----------------
       Compile: 2 Succeeded, 0 Failed
       Link: Succeeded
       Validate: Succeeded

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 154
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    GL_COMPILE_STATUS n'est pas un paramètre autorisé pour glGetProgramiv.
    On compile les shader, on les link au programme.

    Soit tu veux tester que le shader a compilé sans erreur, et il faut utiliser glGetShaderiv(shaderId, GL_COMPILE_STATUS, &status);.
    Soit tu veux tester que le programme a linké sans erreur, et il faut utiliser glGetProgramiv(programId, GL_LINK_STATUS, &status);.

    Dans ton cas, status vaut très certainement GL_INVALID_ENUM, puisque le paramètre n'est pas correct. Qui est donc != GL_TRUE et rentre dans la condition.
    Tu peux aussi forcer le test à == GL_FALSE, ce qui assure que la fonction a échoué, évitant toutes les autres erreurs.

    http://www.opengl.org/sdk/docs/man/x...GetProgram.xml
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Effectivement c'est tout à fait ça
    Quelle erreur bête !

    Merci beaucoup, sujet résolu

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

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