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 :

Appli OpenGL pour entretien d'embauche


Sujet :

OpenGL

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut Appli OpenGL pour entretien d'embauche
    Bonjour, je viens d'envoyer une appli OpenGL que j'ai réalisée à une agence de recrutement pour la montrer à un de leurs clients demain. L'appli fonctionne très bien sur mon PC (Windows 8.1) mais le gars de l'agence a fait le test en direct au téléphone avec moi et ça ne fonctionne pas sur son PC (Windows 10), la fenêtre se ferme après le chargement des données sans plus d'informations. Pas de message de DLL introuvable ou autre. Est-ce qu'il se peut que Windows 10 ne soit pas compatible avec OpenGL 2.1 ? Est-ce que quelqu'un a déjà eu affaire à un problème similaire ?

    Il faut que je sois parvenu à résoudre ce problème avant ce soir.

    Merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Si tu n'as fait aucune gestion des erreurs , on va pas pouvoir faire grand chose !
    La cause est peut être a cause de OpenGL ou d'un segfault
    Mais c'est pas vraiment sérieux d'utiliser OpenGL 1 ou 2 pour un OS et des CG moderne

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 292
    Points
    292
    Par défaut
    Comme tu es le développeur tu sais surement à quel moment le Context est créé, et qu'est ce qui est executé après se chargement de données, création d'un shader/program/ draw etc...
    Je sais que les PC en entreprise sont souvent très basique niveau driver, par exemple à mon taff, la version d'opengl est 1.1
    Dans le doute, si le gars ne s'y connais pas en OpenGl(peut etre un recruteur) qu'il test avec glview, mais si il n'y connais rien je doute qu'il comprenne comment ça marche

    Mais Kannagi l'a dis(décidément je paraphrase tout ce qu'il dis ) une gestion d'erreur est primordial.

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Si tu n'as pas au minimum un log de setup pour savoir où ça plante, ni aucune gestion d'erreur pour les écrire dans un fichier, tu n'as absolument aucune chance de savoir ce qu'il se passe.
    Installe-toi une VM Windows 10 et debug-le en local.
    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 régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Merci pour vos réponses, je suis allé jusque dans l'agence pour tester le problème et apparemment ça vient de glGenBuffers(), malheureusement je n'en sais pas plus.

    Edit : Je viens de tester en appelant glGetError() après glewInit() et apparemment il y a une erreur dès cette initialisation.

    J'utilise une machine virtuelle et je constate que le problème se pose également sur mon PC sous Windows 10, le code d'erreur est 1281 mais je ne trouve pas sa signification. Au passage j'aimerais signaler que je n'arrive ABSOLUMENT PAS à compiler sous Windows 10 le même projet avec exactement la même version de CodeBlocks, le message est toujours le même : "GLint does not name a type", pourquoi j'ai ce problème sous Windows 10 et non Windows 8.1 ? Les chemins vers les lib et les includes sont parfaitement définis et les fichiers sont bien présents. J'ai essayé en partant d'un projet vide mais le problème apparaît dès que j'ajoute un fichier contenant "GLint" (Le problème se pose également avec d'autres types et prototypes)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par KevinduC Voir le message
    pourquoi j'ai ce problème sous Windows 10 et non Windows 8.1 ? Les chemins vers les lib et les includes sont parfaitement définis et les fichiers sont bien présents.
    Un truc très bête, ce sont les "" et les <> avec les chemins relatifs ou

    Un scénario possible c'est que tu fais tes include avec des "", mais que sous Windows 8.1 tes bibliothèques sont dans le dossier courant, alors que sous Windows 10 elles sont dans le dossier système.

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Dans les paramètres du projet j'ai bien indiqué l'emplacement du répertoire "include". Sinon il m'aurait dit qu'il ne trouve pas "sdl.h" ou "gl.h"

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Tu ne comprends pas le truc
    Que tes chemins soient bons, c'est d'accord.

    Mais en C/ C++ si tu fais
    • #include "sld.h", le compilateur/ linker va chercher dans le dossier de ton projet (du moins dans le dossier où se trouve le compilateur) Mais si ta bibliothèque se trouve dans un dossier système, il ne le trouvera pas
    • #include <sld.h>, le compilateur/ linker va chercher dans 1 des dossiers système. Mas si ta bibliothèque se trouve dans un dossier de ton projet, il ne le trouvera pas


    Un dossier système c'est par exemple : "c:/program files/XXX" ou "/usr/include/XXX" ou "/include/XXX"

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    J'ai fait #include <sdl.h> et les fichiers se trouvent dans le répertoire d'installation de CodeBlocks (Donc dans un dossier système si je comprends bien)

  10. #10
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Google open gl error code 1281
    https://www.khronos.org/opengl/wiki/OpenGL_Error
    GL_INVALID_VALUE, 0x0501
    Given when a value parameter is not a legal value for that function. This is only given for local problems; if the spec allows the value in certain circumstances, where other parameters or state dictate those circumstances, then GL_INVALID_OPERATION is the result instead.
    GLint does not name a type
    Ces types sont définis dans GL.h il me semble. Tu n'aurais pas oublié de l'inclure tout de même ?
    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.

  11. #11
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Je l'ai inclus bien sûr. Le projet est le même que sous Windows 8.1

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Il faudrait tester avec les bibliothèques dans ton projet et mettre des include "".

    Il se peut que Windows 10 est bloqué le dossier Program Files.
    Le dossier des données est le dossier ProgramData

  13. #13
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Dernières news : Les fichiers tels que "gl.h" ou "sdl.h" apparaissent vide lorsque je les ouvre dans la machine virtuelle, ce qui explique sans doute le problème de compilation.

    @Bousk, je ne comprends pas très bien l'erreur : Ça parle de paramètre invalide mais quel paramètre ? L'erreur vient visiblement de l'appel de glewInit() qui ne prend justement aucun paramètre.

    En envoyant le code d'erreur à glewGetErrorString() ça m'affiche "Unknown error".

  14. #14
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    J'ai essayé de basculer en OpenGL 3.3 (Au cas où le problème serait dû à une incompatibilité Windows 10 - OpenGL 2.1) en remplaçant les lib et les includes de glew par leurs versions 3.3 et en recompilant le projet mais aucun changement.

    (Pour info je compile côté machine hôte et j'exécute côté machine virtuelle via un dossier partagé car je ne peux pas compiler côté machine virtuelle et de toute façon, le clavier fonctionne en QWERTY, ce qui n'aide pas pour taper le code)

  15. #15
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    On en est au 15ème post et on doit toujours deviner ton code pour espérer essayer de trouver l'erreur...
    Des causes d'erreur liés à OpenGL, glew ou tout autre système que tu utilises c'est pas ça qui manquent... mais aux dernières nouvelles voir le code reste la meilleure façon de le debugger...
    glewInit a beau n'avoir aucun paramètre, tu as sûrement plein de code avant pour initialiser le contexte, ouvrir la fenêtre etc. Et si tu ne vérifies aucune erreur nulle part, elle pourrait très bien être bien plus en amont que ça...
    Aux jeux des devinettes, je passe maintenant mon tour.
    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.

  16. #16
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    A aucun moment je n'ai voulu jouer aux devinettes ...
    Laisse-moi quelques minutes le temps que je poste le code

    Voici le code du main :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    int main(int argc,char *argv[])
    {
        SDL_Surface *fenetre;
        SDL_Event evenement;
        Principale infos;
        bool retourCharge;
        Bureau bureau;
        int chroneFrame,dureMesuree;
     
        srand(time(NULL));      //Initialisation générateur pseudo-aléatoire
     
        if(SDL_Init(SDL_INIT_VIDEO)<0)      //Initialisation SDL
        {
            printf("Erreur initialisation SDL");
            getch();
            return 0;
        }
     
        Init(&infos);
     
        infos.getBureau(&bureau);       //Récupération données bureau
     
        putenv("SDL_VIDEO_CENTERED=1");
        fenetre=SDL_SetVideoMode(bureau.largeur,bureau.hauteur,32,SDL_OPENGL|SDL_NOFRAME);      //Fenêtre
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();       //Initialisation OpenGL
     
        glEnable(GL_TEXTURE_2D);
     
        infos.chargeTextures();     //Chargement textures
     
        retourCharge=infos.chargeMap();     //Chargement map (Le problème se produit ici)
        if(!retourCharge)
        {
            SDL_Quit();
            return 0;
        }
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(FOVY,bureau.ratio,NEAR,FAR);     //Paramètres caméra
     
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_LIGHTING);
     
        glEnable(GL_LIGHT0);
     
        glEnable(GL_COLOR_MATERIAL);
        glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);       //Comportement matériaux éclairage
     
        chroneFrame=SDL_GetTicks();     //Chronométrage durée frame
        infos.InitChrono();
        while(1)
        {
            SDL_PollEvent(&evenement);      //Gestion événements
            if(evenement.type==SDL_KEYDOWN)
            {
                if(evenement.key.keysym.sym==SDLK_ESCAPE)
                    break;      //Quitter programme
            }
     
            infos.gestionCam(&evenement);       //Calcul position et orientation caméra
            infos.rendu();      //Rendu 3D
     
            SDL_GL_SwapBuffers();
            glFlush();      //Màj rendu
     
            dureMesuree=SDL_GetTicks()-chroneFrame;
            if(dureMesuree<DUREE_FRAME)
                SDL_Delay(DUREE_FRAME-dureMesuree);     //Gestion durée frame
     
            chroneFrame=SDL_GetTicks();
        }
     
        infos.sauvegarde();
        SDL_Quit();
        return 0;
    }
    J'ai testé avec glGetError() et visiblement, il y a une erreur lors du chargement des textures, voici le code de chargeTextures() :

    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
    void Principale::chargeTextures(void)
    {
        char chemin[50]="Oasis/Caracteres/Carac";
        char chemin2[50]="Oasis/Caracteres/Carac";
        int compteur=0;
        char chiffre[3];
     
        textures[0]=loadTexture("Oasis/MessSauv.tga",0);
        if(textures[0]==0)
            printf("Erreur chargement Oasis/MessSauv.tga\n");
        textures[1]=loadTexture("Oasis/MessChargeSauv.tga",0);
        if(textures[1]==0)
            printf("Erreur chargement Oasis/MessChargeSauv.tga\n");
        textures[2]=loadTexture("Oasis/MessAfficheSauv.tga",0);
        if(textures[2]==0)
            printf("Erreur chargement Oasis/MessAfficheSauv.tga\n");
        textures[3]=loadTexture("Oasis/Curseur.tga",0);
        if(textures[3]==0)
            printf("Erreur chargement Oasis/Curseur.tga\n");
        textures[4]=loadTexture("Oasis/skybox.tga",0);
        if(textures[4]==0)
            printf("Erreur chargement Oasis/skybox.tga\n");
        textures[5]=loadTexture("Oasis/MessSelectDateHeure.tga",0);
        if(textures[5]==0)
            printf("Erreur chargement Oasis/MessSelectDateHeure.tga\n");
        textures[6]=loadTexture("Oasis/Coche.tga",0);
        if(textures[6]==0)
            printf("Erreur chargement Oasis/Coche.tga\n");
        textures[7]=loadTexture("Oasis/skybox_nuit.tga",0);     //Texture du simulateur
        if(textures[7]==0)
            printf("Erreur chargement Oasis/skybox_nuit.tga\n");
     
        while(1)
        {
            sprintf(chiffre,"%d",compteur);
     
            strcat(chemin,chiffre);
            strcat(chemin,".tga");
     
            caracteres[compteur]=loadTexture(chemin,0);
            if(caracteres[compteur]==0)
                printf("Erreur chargement %s\n",chemin);
     
            strcpy(chemin,chemin2);
     
            compteur++;
            if(compteur==NB_CARAC)
                break;
        }       //Texture caractères
    }
    J'ai effectué un test et visiblement, le chargement des textures fonctionne sans problème.
    Voici le code de chargeMap() :

    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
    bool Principale::chargeMap(void)
    {
        int compteur=0;
        bool retour;
        int codeErreur;
     
        FILE *fichierSauv=fopen("Oasis/Sauvegarde.txt","rb");       //Chargement sauvegarde
     
        FMOD_System_Create(&terrain.system_audio);      //Initialisation audio
        FMOD_System_Init(terrain.system_audio,32,FMOD_INIT_NORMAL,NULL);
     
        glewInit();
        codeErreur=glGetError();
        if(codeErreur!=0)
        {
            printf("Erreur '%s', presser une touche pour quitter\n",glewGetErrorString(codeErreur));
            getch();
            return false;
        }		//Ici ça affiche "Erreur 'unknow error', presser une touche pour quitter" mais uniquement sous Windows 10
     
        OBJ_loadObj_Array("Oasis/Map.obj",terrain.vbos,NB_VBOS);        //Chargement map
     
        if(fichierSauv!=NULL)
        {
            retour=chargeSauv(fichierSauv);     //Chargement sauvegarde
            if(!retour)
                return false;
        }
        else
        {
            retour=selectDateHeure();       //Paramétrage date et heure
            if(!retour)
                return false;
        }
     
        SDL_ShowCursor(0);
     
        fclose(fichierSauv);
     
        return true;
    }
    1000 excuses, le code de loadTexture() que je n'ai pas pensé à poster également :

    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
    64
    65
    66
    67
    68
    69
    70
    GLuint loadTexture(const char * filename,int useMipMap)
    {
        GLuint glID;
        SDL_Surface * picture_surface = NULL;
        SDL_Surface *gl_surface = NULL;
        SDL_Surface * gl_fliped_surface = NULL;
        Uint32 rmask, gmask, bmask, amask;
     
        picture_surface = IMG_Load(filename);
        if (picture_surface == NULL)
            return 0;
     
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
     
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
    #else
     
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
    #endif
     
        SDL_PixelFormat format = *(picture_surface->format);
        format.BitsPerPixel = 32;
        format.BytesPerPixel = 4;
        format.Rmask = rmask;
        format.Gmask = gmask;
        format.Bmask = bmask;
        format.Amask = amask;
     
        gl_surface = SDL_ConvertSurface(picture_surface,&format,SDL_SWSURFACE);
     
        gl_fliped_surface = flipSurface(gl_surface);
     
        glGenTextures(1, &glID);
     
        glBindTexture(GL_TEXTURE_2D, glID);
     
     
        if (useMipMap)
        {
     
            gluBuild2DMipmaps(GL_TEXTURE_2D, 4, gl_fliped_surface->w,
                              gl_fliped_surface->h, GL_RGBA,GL_UNSIGNED_BYTE,
                              gl_fliped_surface->pixels);
     
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
                            GL_LINEAR_MIPMAP_LINEAR);
     
        }
        else
        {
            glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
                         gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
                         gl_fliped_surface->pixels);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        }
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
     
     
        SDL_FreeSurface(gl_fliped_surface);
        SDL_FreeSurface(gl_surface);
        SDL_FreeSurface(picture_surface);
     
        return glID;
    }
    Ce code vient en fait d'un professeur (Kayl).

    J'ai tenté d'avancer en mettant en commentaire tous les appels vers loadTexture() et je constate alors que mon programme crash maintenant lors de l'appel vers glGenBuffers() (Sans code d'erreur renvoyé par glGetError()), je poste donc un morceau de mon code qui appelle cette fonction :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    bool OBJ_loadObj_Array(char *filename,OBJ_VBO *VertexBufferObjectArray,const int sizeArray)
    {
        int compteurArray=0,nbVertices,codeErreur;
    	//... Chargement fichier .obj dans "VertexBufferObjectArray"
     
        compteurArray=0;
        while(1)
        {
            nbVertices=3*VertexBufferObjectArray[compteurArray].nbFaces;
            codeErreur=glGetError();
            if(codeErreur!=0)
            {
                printf("Erreur avant glGenBuffers() '%s', presser une touche pour quitter\n",glewGetErrorString(codeErreur));
                getch();
                return false;
            }
     
            glGenBuffers(1,&VertexBufferObjectArray[compteurArray].bufferVRAM);
     
            codeErreur=glGetError();
            if(codeErreur!=0)
            {
                printf("Erreur glGenBuffers() '%s', presser une touche pour quitter\n",glewGetErrorString(codeErreur));
                getch();
                return false;
            }
     
            glBindBuffer(GL_ARRAY_BUFFER,VertexBufferObjectArray[compteurArray].bufferVRAM);      //Bindage vers espace mémoire VRAM
     
            codeErreur=glGetError();
            if(codeErreur!=0)
            {
                printf("Erreur glBindBuffer() '%s', presser une touche pour quitter\n",glewGetErrorString(codeErreur));
                getch();
                return false;
            }
            glBufferData(GL_ARRAY_BUFFER,nbVertices*3*sizeof(float)+nbVertices*2*sizeof(float)+nbVertices*3*sizeof(float)+nbVertices*3*sizeof(float),NULL,GL_STREAM_DRAW);
     
            codeErreur=glGetError();
            if(codeErreur!=0)
            {
                printf("Erreur glBufferData() '%s', presser une touche pour quitter\n",glewGetErrorString(codeErreur));
                getch();
                return false;
            }
     
            glBufferSubData(GL_ARRAY_BUFFER,0,nbVertices*3*sizeof(float),VertexBufferObjectArray[compteurArray].vertices);      //Mise en mémoire coordonnées vertices
            glBufferSubData(GL_ARRAY_BUFFER,nbVertices*3*sizeof(float),nbVertices*2*sizeof(float),VertexBufferObjectArray[compteurArray].coord_tex);      //Mise en mémoire coordonnées de texture
            glBufferSubData(GL_ARRAY_BUFFER,nbVertices*3*sizeof(float)+nbVertices*2*sizeof(float),nbVertices*3*sizeof(float),VertexBufferObjectArray[compteurArray].couleurs);      //Mise en mémoire couleurs
     
            codeErreur=glGetError();
            if(codeErreur!=0)
            {
                printf("Erreur glBufferSubData() '%s', presser une touche pour quitter\n",glewGetErrorString(codeErreur));
                getch();
                return false;
            }
     
            free(VertexBufferObjectArray[compteurArray].vertices);
            free(VertexBufferObjectArray[compteurArray].coord_tex);
            free(VertexBufferObjectArray[compteurArray].couleurs);
     
            glBindBuffer(GL_ARRAY_BUFFER,0);
     
            codeErreur=glGetError();
            if(codeErreur!=0)
            {
                printf("Erreur glBindBuffer() '%s', presser une touche pour quitter\n",glewGetErrorString(codeErreur));
                getch();
                return false;
            }
     
            compteurArray++;
            if(compteurArray==sizeArray)
                break;
        }
     
        printf("Loaded mesh %s (%d VBOs)\n\n",nameObj,sizeArray);
     
        return true;
    }
    Je vous avoue que je suis à court d'idées, je ne vais quand même pas aller vérifier le code de glGenBuffers().

    Edit : Je voudrais ajouter un détail : Lors de ma première rencontre avec cet employé de l'agence de recrutement, je lui ai montré un autre programme que j'avais codé et qui fonctionnait exactement de la même manière et qui avait parfaitement fonctionné sur son PC sous Windows 10. J'ai testé ce programme sur ma machine virtuelle et là bug à nouveau. Pour vous dire l'étrangeté de la situation.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je trouve cela étrange de charger la SDL et GLEW, alors que la SDL peut créer un contexte OpenGL (chose qui ne me semble pas indiqué avec le flag approprié).
    De plus, vous ne vérifiez pas les erreurs correctement pour glewInit(). Voici ce qui est indiqué dans la doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
      /* Problem: glewInit failed, something is seriously wrong. */
      fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
      ...
    }
    Pour les fonction GLEW, le glGetError() n'aura pas vraiment de cohérence.

    Aussi, pour le chargement de la sauvegarde, si le fichier n'existe pas (cas qui semble géré), vous en faites aucun retour. Cela peut aussi aider au débogage.
    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.

  18. #18
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    D'accord, merci pour l'info. J'initialise GLEW pour l'utilisation des Vertex Buffer Objects. Au passage je précise que j'ai envoyé au gars de l'agence de recrutement un autre programme que j'ai codé et qui marchait sur son PC (Lors de notre premier entretien), il vient de m'apprendre que ce programme ne fonctionnait pas non plus, alors que c'est le même programme sur le même PC et que je n'ai pas touché au code depuis.

    Edit : Bon j'ai fait un test en créant un projet à partir de 0 et la conclusion est indéniable : C'est glGenBuffers() qui pose problème :

    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
    int main(int argc,char *argv[])
    {
        SDL_Surface *fenetre;
        SDL_Event evenement;
        GLuint tex1[20],tex2[10];
     
        SDL_Init(SDL_INIT_VIDEO);
     
        fenetre=SDL_SetVideoMode(800,600,32,SDL_OPENGL);
     
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(70,4.0/3,0.1,1000);
     
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_DEPTH_TEST);
     
        GLuint tex=loadTexture("Oasis/Champ.tga",0);
     
        GLuint buffer;
        int retour=glewInit();
        if(retour!=0)
        {
            printf("Erreur initialisation GLEW");
            getch();
            SDL_Quit();
            return 0;
        }
     
        glGenBuffers(1,&buffer);        //ERREUR ICI !!!
     
        while(1)
        {
            SDL_PollEvent(&evenement);
            if(evenement.type==SDL_QUIT)
                break;
     
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     
            SDL_GL_SwapBuffers();
            glFlush();
        }
     
        SDL_Quit();
        return 0;
    }
    Tout allait bien jusqu'à l'ajout de l'appel vers cette fonction (Sous Windows 10 en machine virtuelle). En revanche, ça tourne sans problème sous Windows 8.1. Je précise que l'appli n'affiche aucun message d'erreur à propos de l'initialisation de GLEW.

  19. #19
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    LittleWhite, il n'y a rien d'étrange là-dedans, et je charge OpenGL avec le bon flag :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fenetre=SDL_SetVideoMode(bureau.largeur,bureau.hauteur,32,SDL_OPENGL|SDL_NOFRAME);
    Je clôture de toute façon cette discussion pour annoncer qu'il n'y a malheureusement aucune solution à ce problème mystérieux et pour remercier malgré tout ceux qui sont intervenus.

Discussions similaires

  1. Besoin d'aide pour futur entretien d'embauche
    Par Bobak42 dans le forum Emploi
    Réponses: 7
    Dernier message: 31/01/2012, 09h15
  2. Réponses: 9
    Dernier message: 20/09/2010, 18h18
  3. Entretien d'embauche ERP pour un débutant
    Par miss.zozo dans le forum Entretien
    Réponses: 3
    Dernier message: 28/07/2009, 16h54
  4. Questions pour un entretien d'embauche
    Par CSharper dans le forum Entretien
    Réponses: 14
    Dernier message: 27/03/2008, 21h35

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