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 :

Application de textures


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut Application de textures
    Bonjour.
    J'ai écrit un programme qui crée un objet texture échiquier et qui l'applique à un polygone.
    Or, lorsque j'exécute le tout, rien j'obtiens une fenêtre avec un fond noir sans voir mon polygone.
    L'erreur ne doit pas être sorcier mais j'ai beau tourner et retourner mon programme dans tous les sens, je ne la trouve pas.

    Merci d'avance

    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #ifdef WIN32               //Pour la portabilité du code.
         #include <windows.h>
     #endif
     
     #include <gl/gl.h>
     #include <gl/glut.h>
     
    /*créer la texture de l'échiquier*/
    #define checkImageWidth 64
    #define checkImageHeight 64
    static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
     
    static GLuint texName;
     
    void makeCheckImage(void)
    {
        int i, j, c;
     
        for(i = 0; i < checkImageHeight; i++)
        {
            for ( j = 0; j < checkImageWidth; j++)
            {
                c = ((((i&0*8) == 0)^((j&0*8)) == 0))*255;
                checkImage[i][j][0] = (GLubyte) c;
                checkImage[i][j][1] = (GLubyte) c;
                checkImage[i][j][2] = (GLubyte) c;
                checkImage[i][j][3] = (GLubyte) 255;
            }
        }
    }
     
    void init(void)
    {
     
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glShadeModel(GL_FLAT);
        glEnable(GL_DEPTH_TEST);
            printf("main2");
        makeCheckImage();
     
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
     
        glGenTextures(1,&texName);
        glBindTexture(GL_TEXTURE_2D, texName);
     
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
    }
     
    void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        glBindTexture(GL_TEXTURE_2D, texName);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
        glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
     
        glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
        glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
        glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
        glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
        glEnd();
        glFlush();
        glDisable(GL_TEXTURE_2D);
    }
     
    void reshape(int w, int h)
    {
        glViewport(0, 0, (GLsizei) w, (GLsizei) h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.0, 0.0, -3.6);
    }
     
     
    int main(int argc, char** argv)
    {
        printf("main");
        glutInit(&argc,argv);//initialiser le GLUT
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(250, 250);//initialisation de la taille de la fenetre
    	glutInitWindowPosition(100,100);//initialisation de la position de la fenetre
    	glutCreateWindow("Test Echiquier");//creation de la fenetre
     
     
    	init();
     
    	glutDisplayFunc(display);//affichage par l'appel de la fonction display()
    	glutReshapeFunc(reshape);
    	glutMainLoop();
    	return 0;
    }

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


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

    J'ai testé ton programme ( je suis sous linux ).
    Pas mal ton coup du ifdef WIN32 , mais de toute façon l'include windows.h n'est pas utile pour ton programme.
    Parcontre celui de stdio.h l'est.

    Bref, je me suis au confronté à la fenêtre noir. J'ai remarqué une première erreur, qui est que le glEnable(GL_TEXTURE_2D) n'est pas à la bonne place.
    Il ne doit pas être dans le draw, mais dans le init avant les apelle de fonctions glBindTexture() ... ( et tout autre truc de texture ).

    Par contre la texture s'affiche toujours pas , et je comprend pas trop pourquoi.

    Un conseil serai de vérifier les erreurs des fonctions OpenGL
    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é
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut
    Tu veux dire tester leur valeur de retour et ajouter des blocs try c'est ça ?

  4. #4
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Il n'y a pas de problème à mettre glEnable(GL_TEXTURE_2D) dans le draw. Il ne faut par contre pas le mettre dans un bloc glBegin/glEnd.

    Le problème se trouve dans la génération de texture, utilise plutôt quelque chose de ce goût:
    c = ( ((i & 15) < 8) ^ ((j & 15) < 8) ) * 255;

    Ton autre expression renvoyait toujours 0, donc noir sur fond noir, tu n'y verras pas grand chose (Et donc prend l'habitude de changer la couleur de fond quand tu généres une texture, tu verras vite si ton objet est dessiné ou pas )

    PS: l'include windows n'est pas nécessaire dans le cas où tu inclus glut.h *avant* gl.h; sinon, il l'est.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    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 157
    Billets dans le blog
    152
    Par défaut
    Je fus trop nul hier, pour verifier la génération de la texture, j'avais remplacer le c pour la couleur verte par zero et non par 255 ... Donc je voyais pas de changement.

    glEnable(GL_TEXTURE_2D); si on peut le mettre dans le draw() c'est bien. Mais c'est plus rare ( pour ça que je ne le savais pas ). Et puis il me semblait logique de l'activer avec de paramétré d'autre truc qui utilise GL_TEXTURE_2D.
    Mais je crois que de toute façon, c'est pour la phase de rendu qu'il va regarder les glEnable(texture, lighting) et faire le rendu avec les effets correspondant.

    Oui, j'avais oublié pour le windows.h qui était obligatoire pour la version windows de OpenGL ( qui utilise des déclarations windows, qui sont dans windows.h, mais qu'il n'inclue pas par lui même )
    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.

Discussions similaires

  1. Application de textures OpenGL
    Par Fiquet dans le forum Contribuez
    Réponses: 0
    Dernier message: 21/12/2010, 14h58
  2. Application de textures
    Par mohdaef dans le forum OpenGL
    Réponses: 14
    Dernier message: 06/11/2009, 00h26
  3. Application de textures
    Par Elendhil dans le forum OpenGL
    Réponses: 1
    Dernier message: 05/03/2008, 21h51
  4. Réponses: 4
    Dernier message: 28/02/2008, 10h09
  5. application de texture opengl
    Par batman60 dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/06/2005, 17h08

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