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 :

plusieurs textures en OpenGL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    KaD
    KaD est déconnecté
    Membre habitué
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut plusieurs textures en OpenGL
    Salut,
    Vala j'ai un petit problème en opengl (je precise que je sdebute en 3D)
    je veut afficher plusieur textures, seulement on ne peut en activer une seule a la fois.
    Donc je genere la texture avant l'affichage de chaque objet.
    Le seul probleme c'est que quand je tourne autour de l'objet par exemple, ben a chaque rotation, il me regenère les textures et ça rame pas mal.
    Donc je cherche une solution plus optimisé.

    Merci de votre aide

    Voici le code :
    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
     
    void displayFunction(void)
    {
    	glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
     
     
    	gluLookAt(0.0, 0.0, eloi, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
     
       /* remplissage de l'ecran avec la couleur de fond */
       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     
     
     
          /* on fait tourner le repère local */
          glRotatef((GLfloat)rX, 1.0, 0.0, 0.0);
          glRotatef((GLfloat)rY, 0.0, 1.0, 0.0);
    	  tex->Gen_Texture();
     
    	  /*On trace les faces du cube*/
    	  glBegin(GL_QUADS);  	
    		/* on desine des carrées avec la texture*/
    		glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
    		glTexCoord2i(1,0);glVertex3i(+1,-1,-1);
    		glTexCoord2i(1,1);glVertex3i(+1,+1,-1);
    		glTexCoord2i(0,1);glVertex3i(-1,+1,-1);
     
     
    		glTexCoord2i(0,0);glVertex3i(-1,-1,+1);
    		glTexCoord2i(1,0);glVertex3i(+1,-1,+1);
    		glTexCoord2i(1,1);glVertex3i(+1,+1,+1);
    		glTexCoord2i(0,1);glVertex3i(-1,+1,+1);
     
     
    		glTexCoord2i(0,0);glVertex3i(+1,-1,-1);
    		glTexCoord2i(1,0);glVertex3i(+1,-1,+1);
    		glTexCoord2i(1,1);glVertex3i(+1,+1,+1);
    		glTexCoord2i(0,1);glVertex3i(+1,+1,-1);
     
     
    		glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
    		glTexCoord2i(1,0);glVertex3i(-1,-1,+1);
    		glTexCoord2i(1,1);glVertex3i(-1,+1,+1);
    		glTexCoord2i(0,1);glVertex3i(-1,+1,-1);
     
     
    		glTexCoord2i(1,0);glVertex3i(-1,+1,-1);
    		glTexCoord2i(1,1);glVertex3i(+1,+1,-1);
    		glTexCoord2i(0,1);glVertex3i(+1,+1,+1);
    		glTexCoord2i(0,0);glVertex3i(-1,+1,+1);
     
     
    		glTexCoord2i(1,0);glVertex3i(-1,-1,+1);
    		glTexCoord2i(1,1);glVertex3i(+1,-1,+1);
    		glTexCoord2i(0,1);glVertex3i(+1,-1,-1);
    		glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
     
    		/*dessin du sol*/
    		glTexCoord2i(1,0);glVertex3i(-15,-3,+15);
    		glTexCoord2i(1,1);glVertex3i(+15,-3,+15);
    		glTexCoord2i(0,1);glVertex3i(+15,-3,-15);
    		glTexCoord2i(0,0);glVertex3i(-15,-3,-15);
     
    	  glEnd();
    	  /* couleur dela sphere*/
          glColor3f (0.0, 0.0, 0.7);
    	  glutSolidSphere(20.0, 50, 50);
    	  /* couleur des objets: blanc */
          glColor3f (1.0, 1.0, 1.0);
    	  texciel->Gen_Texture();
    	  gluSphere(qobj,15,50,50);
    	  gluQuadricTexture(qobj,1);
     
       /* inversion des buffers */
       glutSwapBuffers();	
    }

  2. #2
    Membre du Club

    Profil pro
    Inscrit en
    Février 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 12
    Par défaut
    Tu n'as pas besoin de regénérer les textures à chaque fois, tu les crée une fois pour toute, et ensuite tu les « active » en faisant un appel à glBindTexture() (cherche google la doc sur cette fonction) à chaque fois que tu veux changer de texture.

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    En fait les textures OpenGL fonctionne de la facon suivante :

    -> charge une texture A en memoire et la stock
    -> charge une texture B en memoire et la stock
    -> charge une texture C en memoire et la stock

    -> appel par bind de A
    -> affichage de A
    -> appel par bind de C
    -> affichage de C
    -> appel par bind de B
    -> affichage de B
    -> appel par bind de A
    -> affichage de A
    -> appel par bind de C
    -> affichage de C

    le probleme que l'operation bind est tres couteuse justement.
    donc pour palier se probleme tu reuni A, B et C au sein de la meme texture, ainsi :

    -> appel par bind de ABC
    -> affichage de A
    -> affichage de C
    -> affichage de B
    -> affichage de A
    -> affichage de C

    et une fois que tu es sur de ne plus avoir besoin de cette texture tu fait un delete de ABC

  4. #4
    KaD
    KaD est déconnecté
    Membre habitué
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut
    Ah je savais pas que l'on pouvais appeller plusieurs texture en même temps avec Bind.
    Par exemple j'ai une texture pour mon cube et une pour le ciel.
    Comment vais-je dire que pour le cube il doit utiliser cette texture, et pour le ciel cette autre texture, si je les appelle toutes en meme temps avec Bind?
    Merci pour les réponses déjà fournies!
    KaD

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    imagine le cas suivant :
    - 1 texture CUBE.PNG et 1 texture CIEL.PNG

    tu prend alors paint, photoshop ou ce que tu veux et tu les fusionne pour obtenir par exemple : PACK01.PNG

    tu la cherge avec bind normalement, par contre quand tu vas selectionner ta texture tu va modifié les parametre de glTexCoord2f() de facon a ne selectionner que la sous-texture que tu veux (ciel ou cube).

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Le plus simple est encore de faire comme ça :

    - Bind de la texture du ciel
    - Affichage du ciel

    - Bind de la texture du cube
    - Affichage du cube

    Réserver la combinaison de plusieurs textures en une pour les cas plus poussés

  7. #7
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    et puis pourquoi faire une texture sous paint/photoshop alos que tu peut gerer ta memoire video par toi même avec la virtualisation de texture... ca marche tres bien, la preuve : Ennemy territoy Quake war utilise ça
    et puis pourquoi faire simple quand on peut faire compliqué
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    Je ne fais que répondre a sa question, et ca ne fait pas de mal de connaitre une technique supplémentaire, même si elle n'est pas justifié dans tous les cas.

    Par contre bafman, je ne connais pas le concept que tu as énuméré, pourrait-tu en faire une rapide description ?


  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Par contre bafman, je ne connais pas le concept que tu as énuméré, pourrait-tu en faire une rapide description ?
    Lorsqu'on charge les textures d'un fichier, avant de les passer à OpenGL, on utilise la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glTexImage2Dvoid glTexImage2D(  GLenum target,  GLint level,  GLint internalformat,  GLsizei width,  GLsizei height,  GLint border,  GLenum format,  GLenum type,  const GLvoid *pixels);
    Rien ne nous empêche de charger l'image A et l'image B, coller les images ensemble dans un tableau plus grand (le mieux c'est de charger les images directement dans le tableau correctement, cela évitera la recopie) et de passer cette nouvelle image plus grande à OpenGL. Ensuite, on en ferait l'usage que tu proposes...

    Est-ce que je me trompe bafman?

  10. #10
    KaD
    KaD est déconnecté
    Membre habitué
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Par défaut
    Oki d'ac merci beacoup, a résolu le problème.
    Je vais essayer d'optimiser encore avec vos techniques, notament avec ta méthode ash.ice.loky, histoire que si je fais des truc un peu plus poussé, je sache comment faire.


  11. #11
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    Citation Envoyé par fearyourself
    Est-ce que je me trompe bafman?
    oui
    en fait la virtualisation de texture est un enorme truc de bourrin apporté par les derniere carte graphiques.
    en gros, ce n'est plus le driver qui gere la memoire video des texture mais le developpeur lui même qui a un acces direct a la memoire video pour pouvoir bidouille tout ce qu'il veut...
    bien entendu c'est super tendu a realiser comme truc mais par contre le mossibilitée que ca offre sont enormes... imaginer un jeu dont l'ensemble du niveau n'est formé que par une seule grande texture sur laquel on peut effectuer des modification en cours de jeu sans avoir a repasser par la memoire central... fini les probleme de decals qu'on doit faire disparaitre au bout d'un certaine temps et qui possent des probleme de Z fighting, fini les probleme de texture multiples sur les rendu de terrain ou on est obligé de faire des fondu entre plusieurs textures...
    bref on a un potentiel enorme qui est deja en partie expoité par le moteur de Doom 3 dans Ennemy territory Quake war, ou le rendu du terrain utilise cette methode (il n'y a qu'une seule texture pour tout le terrain)
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  12. #12
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    hola, bien trop compliqué pour mon pauvre moteur de jeu

    KaD >> c'est une excellente technique.
    elle est utilisé dans le logiciel RPGmaker (si tu connais).

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/03/2008, 19h08
  2. Réponses: 13
    Dernier message: 25/01/2005, 10h05
  3. texture sous opengl : objets complexes
    Par pouleriguen dans le forum OpenGL
    Réponses: 1
    Dernier message: 20/11/2004, 19h47
  4. Combiner plusieurs textures avec couches alpha
    Par TibobiT dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2004, 15h20
  5. BP avec Textures en OpenGL
    Par skyghis dans le forum OpenGL
    Réponses: 11
    Dernier message: 27/11/2003, 17h15

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