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 :

Vertex arrays et textures


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut Vertex arrays et textures
    Bonjour à tous..

    J'ai besoin d'aide avec les textures.. en fait il ne veulent tout simplement pas s'afficher.. J'utilse la fonction glDrawRangeElements pour dessiner 6 faces qui composent un cube.. glEnable(GL_TEXTURE2D) est bien appelée dans mon code..

    Voilà mes sources simplifiées :

    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
    GLfloat vertices[] = {1,1,1, 1,1,0, 0,1,0, 0,1,1,
    		    0,0,1, 0,0,0, 1,0,0, 1,0,1,
    		    1,0,1, 1,0,0, 1,1,0, 1,1,1,
    		    0,1,1, 0,1,0, 0,0,0, 0,0,1,
    		    1,0,1, 1,1,1, 0,1,1, 0,0,1,
    		    1,1,0, 1,0,0, 0,0,0, 0,1,0};
     
    GLubyte indices[] = {0,1,2,3,4,5,6,7,7,6,1,0,3,2,5,4,7,0,3,4,1,6,5,2};
     
    GLfloat texCoord[] = {1,1, 0,1, 0,0, 1,0,
    		    0,0, 1,0, 1,1, 0,1,
    		    0,0, 1,0, 1,1, 0,1,
    		    1,1, 0,1, 0,0, 1,0,
    		    1,0, 1,1, 0,1, 0,0,
    		    0,1, 0,0, 1,0, 1,1};
     
    GLuint texture;
     
    void loadCubeTextures(void) {
    	texture = loadTexture("data/stone.png");
    }
     
    void drawQuad(unsigned short face) {
    	glEnableClientState(GL_VERTEX_ARRAY);
    	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
    	glVertexPointer(3, GL_FLOAT, 0, vertices);
    	glTexCoordPointer(2, GL_FLOAT, 0, texCoord);
     
    	glBindTexture(GL_TEXTURE_2D, texture);
     
    	if (face == 4) {		// Face du dessus
    		glDrawRangeElements(GL_QUADS, 0,3, 4, GL_UNSIGNED_BYTE, indices);
    	}
    	else if (face == 5) {	// Face du dessous
    		glDrawRangeElements(GL_LINE_LOOP, 4,7, 4, GL_UNSIGNED_BYTE, indices+4);
    	}
    	else if (face == 0) {	// Face nord
    		glDrawRangeElements(GL_LINE_LOOP, 8,11, 4, GL_UNSIGNED_BYTE, indices+8);
    	}
    	else if (face == 1) {	// Face sud
    		glDrawRangeElements(GL_LINE_LOOP, 12,15, 4, GL_UNSIGNED_BYTE, indices+12);
    	}
    	else if (face == 2) {	// Face est
    		glDrawRangeElements(GL_LINE_LOOP, 16,19, 4, GL_UNSIGNED_BYTE, indices+16);
    	}
    	else {			// Face ouest
    		glDrawRangeElements(GL_LINE_LOOP, 20,23, 4, GL_UNSIGNED_BYTE, indices+20);
    	}
     
    	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    	glDisableClientState(GL_VERTEX_ARRAY);
    }
    Voilà je ne comprend vraiment pas pourquoi ça me met tout blanc.. Rien n'est texturé du tout..
    J'espère que vous pouvez m'aider.. À+

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


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

    J'aimerais voir le code de la fonction loadTextures();

    Si le cube est blanc, c'est qu'il est texturé, mais que les textures ne sont pas valides.
    Je vous conseille de faire un glGetError avant et après le chargement de la texture, et aussi quelques un dans la fonction de dessin.
    Finalement, je voudrais précisé qu'une texture à toujours besoin de ces paramètres pour être valide.
    Ici une aide -> http://nehe.developpez.com/tutoriel/06-texture/
    Les lignes a ajouter doivent ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Filtrage lineaire
          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);  
          // Filtrage lineaire
          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    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 du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    J'aimerais voir le code de la fonction loadTextures();

    Si le cube est blanc, c'est qu'il est texturé, mais que les textures ne sont pas valides.
    Salut.. merci d'avoir répondu j'étais désespéré.. Voilà la fonction loadTexture()..

    Bon.. voici la 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
    GLuint loadTexture(const char *filename, bool 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;
     
    }
    J'ai déjà utilisé cet fonction auparavant.. mais j'utilisais glBegin, glVertex3f, etc... je croît que le problème vient vraiment des vertex arrays..

    PS : Les cubes était blanc bien avant que je commence à travailler sur les textures!

    Merci d'avance à+

    EDIT : Ah oui et.. j'obtiens toujours GL_NO_ERROR.. donc je voit vraiment pas.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 136
    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 136
    Billets dans le blog
    150
    Par défaut
    J'espère que le glEnable(GL_TEXTURE2D); et bien executé avec le chargement de la texture.
    Sinon, je dirais, essayer de binder la texture avec d'activer les tableaux.
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    glBindTexture(GL_TEXTURE_2D, texture);
     
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoord);
    Meme si je ne me rappelle pas si cela a une importance.
    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.

  5. #5
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    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 033
    Billets dans le blog
    12
    Par défaut
    Ce bout de code n'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	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);
    	}
    Il faut en effet que tu sortes la partie 'glTexImage2D' de ton 'if' car sinon OpenGL ne peut pas générer de mipmaps et tu te retrouves avec un cube blanc :
    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
     
    	glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
    		    gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
    		    gl_fliped_surface->pixels);
     
    	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
    	{
    		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	}
    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).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    non..

    rien ne fonctionne. s'il vous plaît aidez-moi.. Je ne peut plus avancer dans mon programme depuis au moin 2-3 jours à cause des textures..

    J'en ai vraiment besoin et je croit que le probleme vient des vertex array.. car la fonction loadTexture fonctionne très bien avec glTexCoord2d() glVertex3f(), etc...

    Merci d'avance à+

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

Discussions similaires

  1. Vertex Array et Textures
    Par sye-laptop dans le forum OpenGL
    Réponses: 4
    Dernier message: 02/12/2010, 15h11
  2. Appliquer une texture en utilisant les Vertex Array
    Par ryosnake dans le forum OpenGL
    Réponses: 3
    Dernier message: 10/06/2009, 10h07
  3. Vertex Arrays : Multy textures
    Par Nikowa dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/05/2009, 05h45
  4. vertex array
    Par Jbx 2.0b dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/07/2004, 11h37
  5. Performance des vertex array
    Par Mathieu.J dans le forum OpenGL
    Réponses: 13
    Dernier message: 25/06/2004, 10h47

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