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

 C Discussion :

Effet de scintillement et amélioration des déplacements


Sujet :

C

  1. #1
    Membre confirmé Avatar de Gobelins
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2007
    Messages : 171
    Par défaut Effet de scintillement et amélioration des déplacements
    Bonsoir tout le monde,

    J'écris un programme (projet) en C et en OpenGL, que j'ai intitulé Décor Natuerl sur Visaul C++ 2010 Express. Le projet compile à part quelques warnings qui n'ont pas d'incidents sur l'exécution:

    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
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(125): warning C4047: '='*: les niveaux d'indirection de 'GLuint *' et de 'GLuint' sont différents
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(152): warning C4047: 'fonction'*: les niveaux d'indirection de 'GLuint' et de 'GLuint *' sont différents
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(152): warning C4024: 'glBindTexture'*: types différents pour le paramètre formel et réel 2
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(194): warning C4047: 'fonction'*: les niveaux d'indirection de 'GLuint' et de 'GLuint *' sont différents
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(194): warning C4024: 'glBindTexture'*: types différents pour le paramètre formel et réel 2
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(220): warning C4047: 'fonction'*: les niveaux d'indirection de 'GLuint' et de 'GLuint *' sont différents
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(220): warning C4024: 'glBindTexture'*: types différents pour le paramètre formel et réel 2
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(404): warning C4113: 'void (__cdecl *)()' est différent de 'void (__cdecl *)(void)' dans les listes de paramètres
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(407): warning C4113: 'void (__cdecl *)()' est différent de 'void (__cdecl *)(void)' dans les listes de paramètres
      loader.c
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\loader.c(35): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
              i:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234)*: voir la déclaration de 'fopen'
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\loader.c(109): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
              i:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234)*: voir la déclaration de 'fopen'
      Génération de code en cours...
      Decor_Naturel.vcxproj -> I:\Documents and Settings\Visual Studio 2010\Projects\Decor_Naturel_Solution\Debug\Decor_Naturel.exe
    ========== Régénération globale*: 1 a réussi, 0 a échoué, 0 a été ignoré ==========
    Je voudrais bien les corriger.

    Le projet s'exécute, mais l'affichage présente un effet de scintillement que je n'arrive pas à expliquer. Par ailleurs, Je voudrais améliorer la gestion des déplacements (pouvoir se déplacer dans la nature suivant les hauteurs).

    J'ai mis en pièce jointe, une capture d'écran, puis trois fichiers contenant les codes sources pour que vous puissiez les voir et me proposer des modifications. Merci
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Il est vrai que votre rendu est bizarre ...

    Sinon, pour le déplacement selon la hauteur du terrain, il faut se baser sur la position de la camera, pour retrouver le triangle (ou polygone) au dessus duquel on se trouve. Une fois le polygone trouver, on aura les 3 vertex qui permettront de déterminer la hauteur à utiliser (on lui ajoutera surement un petit décalage, pour être un peu plus haut qu'au raz de l'herbe )

    Pour le scintillement (en tant que scintillement, j'entends un écran noir, une image sur deux) (sinon il faut donner des précisions), le glFLush est inutile, avant un glutSwapBuffer (le glFlush est très souvent inutile, dans n'importe quel cas)

    Je n'ai pas compris pourquoi on faisait une rotation avant le placement de la camera ...
    je l'enleverai

    Sinon, peut être que le calcul de la direction de la camera est faux.
    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 confirmé Avatar de Gobelins
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2007
    Messages : 171
    Par défaut
    Apperemment, il n' y a personne qui veut m'aider pour corriger ces warnings. Je suis bloqué et je n'avance pas.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Les messages d'erreurs sont pourtant explicites, ils ne laissent aucune ambigüité.

    Quelques indices, juste pour le premier warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GLuint load_texture(char *filename, GLuint * texchrg,int n)
    {
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct multitexture{
        char *name;               //son nom pour le chargement de la heightmap
        char *name_texture;       //nom de la texture generee
        float **heightmap;        //la matrice contenant les altitudes correspondant aux niveaux de gris
        GLuint *texchrg;           //la texture "name_texture" chargee
    } multitexture;
    
    ...
    
    multitexture hmt[5];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hmt[i].texchrg=load_texture(hmt[i].name_texture,hmt[i].texchrg+3*sizeof(GLuint),i);
    (Je n'ai pas regardé le reste du code)

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Donc les warnings (c'est assez dur de cette manière):
    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(125): warning C4047: '='*: les niveaux d'indirection de 'GLuint *' et de 'GLuint' sont différents
    Le sizeof est surement à enlever depuis que les déplacements de pointeurs se font automatiquement avec la bonne taille (si le type pointé est indiqué). (Surtout qu'un pointeur c'est toujours la même taille en fait)

    EDIT: Oops ... la remarque de jeroman est plus juste que la mienne. Même si je pense que le sizeof est peut être en trop.

    i:\documents and settings\visual studio 2010\projects\decor_naturel_solution\decor_naturel\terrain.c(152): warning C4047: 'fonction'*: les niveaux d'indirection de 'GLuint' et de 'GLuint *' sont différents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, hmt[0].texchrg);
    Je propose ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, *hmt[0].texchrg);
    Pareil pour la ligne 194 et 220

    Pour la fonction resize(), elle n'a pas besoin d'être statique ... je ne suis pas sur que ce soit le problème pour autant.

    Pour le fichier loader.c il manque un #include <stdio.h> pour fopen.

    Un code comme cela peut s'avérer dangereux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hmt[0].name="textures/heightmap0.bmp";
    Vous devriez faire moins de variable globales ... peut être plus de fichier aussi

    Si mes réponses ne sont pas juste, lisez bien ce que dit le compilateur, faites des essais et voyez si ça passe mieux (ne faites pas des casts)
    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.

  6. #6
    Membre confirmé Avatar de Gobelins
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2007
    Messages : 171
    Par défaut
    Bonjour,

    Pour corriger ce warnings, j'ai procédé de cette façon d'après vos indications:

    terrain.c(125): warning C4047: '='*: les niveaux d'indirection de 'GLuint *' et de 'GLuint' sont différents
    Dans le loader.h, le prototype était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLuint load_texture(char *, GLuint * ,int );
    ça devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLuint *load_texture(char *, GLuint * ,int );
    Dans le loader.c
    La déclaration de la fonction était:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLuint load_texture(char *filename, GLuint * texchrg,int n)
    ça devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLuint *load_texture(char *filename, GLuint * texchrg,int n)
    Pour ce warning:
    terrain.c(152): warning C4024: 'glBindTexture'*: types différents pour le paramètre formel et réel 2
    Dans loader.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multitexture hmt[5];//tableau de multitexture pour les heightmaps
    Dans terrain.c:
    Avant modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, hmt[0].texchrg);
    Après modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, *hmt[0].texchrg);
    Pour ce warning:
    terrain.c(194): warning C4024: 'glBindTexture'*: types différents pour le paramètre formel et réel 2
    Dans loader.c:
    Avant modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, h.texchrg);
    Après modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, *h.texchrg);
    Pour ce warning:
    terrain.c(220): warning C4024: 'glBindTexture'*: types différents pour le paramètre formel et le rééel 2
    Dans loader.c:
    Avant modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, h.texchrg);
    Après modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, *h.texchrg);
    Lorsque je compile, les warnings que j'ai corrigés ont disparu. Cependant, ces warnings suivants, je n'ai pas pu les corriger, elles existaient avant:
    terrain.c(404): warning C4113: 'void (__cdecl *)()' est différent de 'void (__cdecl *)(void)' dans les listes de paramètres
    terrain.c(407): warning C4113: 'void (__cdecl *)()' est différent de 'void (__cdecl
    Pour le fichier loader.c je n'ai pas ajouter un #include <stdio.h> pour fopen. Je peux toujours l'ajouter plus tard pour corriger ces deux warnings de dessus
    Pour le fichier loader.c je n'ai pas ajouter un #include <stdio.h> pour fopen. Je peux toujours l'ajouter plus tard.
    Quand, j'exécute, la fenêtre apparait noir. Puis, un message s'affiche: DecorNatuerl a rencontré un porblème et doit fermer. Quand j'ai lancé le debbogage, il y a évidemment une segmentation fault (débordement de mémoire à cause des pointerus). Avant de corriger les warnings, le projet s'exécutait, et dès que j'ai corrigé quelques warnings, il ne veut plus s'exécuter. Pourriez-vous m'aider, je ne vois pas comment je vais faire?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    J'ai envie de dire que vous aviez eu de la chance que cela ai tombe en marche.
    Maintenant, c'est une probleme avec tout ces pointeur sur GLuint.
    De plus, si vous avez enlever le sizeof, comme je l'avais dit, je vous conseillerai de le remettre (sachant que j'avais peut etre faux)
    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.

  8. #8
    Membre confirmé Avatar de Gobelins
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2007
    Messages : 171
    Par défaut
    C'est quoi la solution? En fait, je suis bloqué. Soit, je laisse les warnings, le programme s'exécute avec les warnings, soit, je corrige les warnings et elles disparaissent, cependant, le programme ne s'exécute pas.

    Pourquoi en corrigeant les warnings, j'ai une segmentation fault. J'ai testé le programmme sous Code::Blocks et Visual C++ Express 2010 et j'ai le meme résultat d'exécution en revanche quand je lance le debogueur des deux, je n'ai pas le meme affichage des erreurs.

    Je vais devenir fous avec ces warnings. Je pense que j'ai tout essayé pour régler le problème. Peut-etre, j'ai oublié de tester ou de revoir certaines lignes. Si vous avez des idées. Proposez-moi une solution?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Citation Envoyé par Gobelins Voir le message
    C'est quoi la solution? En fait, je suis bloqué. Soit, je laisse les warnings, le programme s'exécute avec les warnings, soit, je corrige les warnings et elles disparaissent, cependant, le programme ne s'exécute pas.

    Pourquoi en corrigeant les warnings, j'ai une segmentation fault. J'ai testé le programmme sous Code::Blocks et Visual C++ Express 2010 et j'ai le meme résultat d'exécution en revanche quand je lance le debogueur des deux, je n'ai pas le meme affichage des erreurs.

    Je vais devenir fous avec ces warnings. Je pense que j'ai tout essayé pour régler le problème. Peut-etre, j'ai oublié de tester ou de revoir certaines lignes. Si vous avez des idées. Proposez-moi une solution?
    Il faut savoir que les warnings indiquent (ici) des problemes entre type pointeur et type. Maintenant, je dois dire que si un warning apparait, c'est qu'il y a un probleme. Si on enleve le warnings et qu'il y a un bug, cela veut dire que le probleme est simplement corrige au niveau du compilateur, mais par contre, le bug est toujours la.
    En conclusion un warning est la pour dire: "Je suspecte une erreur, celle-ci peut etre grave ou pas".
    Souvent, les warnings indiquent un crash eminant (que cela ne crash pas est une chance.)

    Maintenant, je l'ai dit plusieurs fois, je doute de votre Car pour moi, cette instruction est fausse. Donc faites des tests.

    Autre point, je vous conseille (au lieu de rouspeter ici) de prendre en main votre debuggueur (celui de VS qui est plus facile a manier, et peut etre meme plus precis) et de commencer a voir pourquoi les pointeurs vont mal.
    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.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Ce qu'il faut comprendre aussi, c'est que le compilateur ne peut pas deviner ce que le programmeur veut faire. Un warning apparait lorsque le compilateur constate qu'il y a quelque chose de pas clair dans le code, style une conversion pas cohérente (pointeur vers entier, etc), un objet non initialisé ou non utilisé, un bout de code qui ne sera jamais exécuté, etc. Une erreur apparait lorsque le compilateur ne comprend pas un bout de code car non conforme au langage (qu'il ne peut donc pas traduire en code machine) ou interdit par le langage (modifier une constante, etc).

    Ce que je veux dire par là, c'est que warning ou pas warning, un programme ne s'improvise pas. Un programme sans warning peut planter en beauté. Il faut bien structurer son programme. Chaque fonction a une tâche spécifique, elle reçoit X arguments, de tel ou tel type, et renvoie ou non une valeur, de tel ou tel type. Si on appelle une fonction dans le but de recevoir une valeur quelconque, cette valeur doit avoir une signification particulière dans l'esprit du programmeur. Il faut donc l'utiliser à bon escient. Modifier "pointeur sur type" en "type", juste parce qu'il y a un warning affiché sans chercher à comprendre pourquoi on utilise tel type au lieu d'un autre, ce n'est pas une bonne manière de faire et ça va même à l'encontre de la résolution du problème (cela risque d'en générer d'autres). La programmation, ce n'est pas du pifomètre.

    Il faut donc premièrement que, dans ton esprit, tu saches comment tu vas concevoir et structurer ton programme :
    Quelles fonctions faut-il créer ? Qu'est-ce que ces fonctions sont supposées faire ? Comment coder pour que leur tâche soit bien accomplie ? Pour accomplir leur tâche, quelles données doit-on leur transmettre ? Quelle valeur et quel type doit-elle renvoyer ? Pourquoi ce type de valeur et pas un autre ? Quelle signification ont ces valeurs ? etc
    Comment gérer les éventuelles erreurs (fichier non trouvé, allocation mémoire échouée, etc) ? etc
    ...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct multitexture{
        char *name;               //son nom pour le chargement de la heightmap
        char *name_texture;       //nom de la texture generee
        float **heightmap;        //la matrice contenant les altitudes correspondant aux niveaux de gris
        GLuint texchrg[1];           //la texture "name_texture" chargee
    } multitexture;
    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
    void load_texture(multitexture* hmt)
    {
         Image* image;
         image = (Image*) malloc(sizeof(Image));
     
        ImageLoad(hmt->name_texture, image);
     
        glEnable(GL_TEXTURE_2D);
        glGenTextures(1, hmt->texchrg);
        glBindTexture(GL_TEXTURE_2D, hmt->texchrg[0]);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
        gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, image->data);
     
        free(image->data);
        free(image);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i = 0; i < nbcarte; i++)
    {
            hmt[i] = concevoir_carte(hmt[i]);
            load_texture(&hmt[i]);
    }

Discussions similaires

  1. CpteDom - amélioration des temps de réponse
    Par Domi2 dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2006, 14h29
  2. [2k3]Effet de scintillement dans un formulaire
    Par nuriel2 dans le forum IHM
    Réponses: 4
    Dernier message: 17/05/2006, 12h20
  3. Réponses: 3
    Dernier message: 19/11/2004, 15h48

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