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 :

Impossible ? Binder de nouvelles textures sur d'anciennes


Sujet :

OpenGL

  1. #1
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut Impossible ? Binder de nouvelles textures sur d'anciennes
    Voilà j'ai un soucis avec des textures.
    J'ai un programme qui bind une fois 3 textures... Jusque là tout se passe bien... Mon tableau de texture est correctement rempli, les textures s'affichent parfaitement.

    Ensuite, je modifie la zone des pixels des images.... je dois donc changer les textures... et là impossible de re-binder les nouvelles textures. Je n'arrive pas à supprimer les anciennes et les écraser par les nouvelles pour les afficher. Est-ce qu'il va falloir que je créer à chaque fois un nouveau tableau en supprimant l'ancien ? Doit y avoir quelque chose que j'ai pas vu...

    Quelqu'un aurait-il une idée ? Le redbook n'est pas très clair sur le sujet de binder de nouvelles textures pour supprimer les anciennes...

    Merci...

  2. #2
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Salut,

    Qu'est ce que tu entends par binder un nouvelle texture pour supprimer l'ancienne ? o.O

    Si je comprend bien, tu veux mettre à jour un objet texture chargé sur la carte graphique.

    Soit tu le fais en bourrin à la main comme tu as l'air d'essayer de le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // texId est l'identifiant de ta texture.
    glDeleteTextures(1, &texId); // supprime la texture et l'identifiant
    glGenTextures(1, &texId); // recrée l identifiant
    glBindTexture(GL_TEXTURE_2D, texId);
    glTexImage2D(...); // recharge ta texture modifiée
    Mais c'est lent, pas joli et déconseillé :p

    Soit tu utilises la fonction OpenGL qui est là pour ça

    En gros elle permet de mettre à jour juste une portion d'une texture deja chargée.
    Tu peux mettre à jour tout les pixels de la texture si tu en as besoin, ça sera toujours plus rapide que de détruire et recréer la texture.

    Bon courage

  3. #3
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    Houuu merci Harooold ! Ca fait deux fois que tu me sauves la vie...
    La théorie semble bonne mais la pratique s'avère plus compliquée.

    Voilà un bout de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glBindTexture(GL_TEXTURE_2D,m_Textures_num[1]);
    glTexSubImage2D(GL_TEXTURE_2D,4,0,0,hauteur,nbImage, GL_RGB, GL_UNSIGNED_BYTE, _data->imageSequin[0]->keepRGB(vueCote, nbImage,hauteur));
    Est-ce que cela te semble correcte pour remplacer tous les pixels de l'ancienne image? Il s'avère que j'arrive parfaitement à récupérer les bons pixels, je peux les afficher avec un glDrawPixels mais quand je veux afficher la texture binder, il m'affiche l'ancienne. J'en conclus que je ne modifie rien du tout !

    Je m'y prend suremment mal... une idée ?

  4. #4
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Pourquoi mets tu le deuxième paramètre à 4 ?
    C'est le niveau de mipmap..

    A moins que ce ne soit fait exprés pour une gestion de mipmapping, tu ferais mieux de le mettre à 0, qui est le premier niveau de texture ( la texture de base) , celui qui t'interesse quoi

  5. #5
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    J'en peux plus... ça veut pas le faire !
    Voilà comment j'initialise mes textures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    glBindTexture(GL_TEXTURE_2D,m_Textures_num[0]);	
    gluBuild2DMipmaps(GL_TEXTURE_2D,4, largeur,nbImage, GL_RGB, GL_UNSIGNED_BYTE, _data->imageSequin[0]->keepRGB(vueDessous, nbImage, largeur));
    glBindTexture(GL_TEXTURE_2D,m_Textures_num[0]);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    Dans la fonction gluBuild2DMipMaps si je mets un niveau de mapping à 0 au lieu de 4, j'affiche un carré blanc.

    Voilà comment je reclip une nouvelle texture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    glBindTexture(GL_TEXTURE_2D,m_Textures_num[0]);	
    glTexSubImage2D(GL_TEXTURE_2D,0,0,0,largeur,nbImage, GL_RGB, GL_UNSIGNED_BYTE, _data->imageSequin[0]->keepRGB(vueDessous, nbImage, largeur));
    glBindTexture(GL_TEXTURE_2D,m_Textures_num[0]);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    Dans la fonction glTexSubImage2D que je mette un niveau de mapping à 0 ou 4 ne change pas... j'affiche l'ancienne texture.
    Je comprends pas... ça me parait tellement évident que ça devrait marcher... que je ne comprend pas pourquoi ça ne fonctionne pas !

  6. #6
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Dans gluBuild2DMipmap, il n y a pas à préciser le niveau de mipmap, la fonction te construis la pyramide de mipmap toute seule.
    Ce que tu croyais être le niveau de mipmap est le format interne, mets plutot GL_RGB que 4, mais ça ne devrait pas changer grand chose.

    Après je ne pense pas que le problème vienne de ce bout de code.
    Lors de l'appel de glTexSubImage2D ton largeur et nbImage ne sont pas nuls hein ? :p ( on sait jamais ^^ )

  7. #7
    Membre habitué
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Par défaut
    Certain, je fais des affichages de tout à chaque fois.
    J'ai résolu le problème en faisant un appel à glDeleteTextures et glGenTextures et à glBuild2DMipMaps à chaque fois que je change de texture... le tout est assez fluide mais quand on regarde l'état de la mémoire... ouch !

    Ca grossit très vite et pourtant je delete les anciennes textures avant d'allouer les nouvelles.... je comprends pas comment réduire la taille de mon programme.

Discussions similaires

  1. Réponses: 13
    Dernier message: 25/01/2005, 10h05
  2. [Static] nouvelle question sur les blocs static
    Par Alec6 dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2004, 18h09
  3. copier une petite texture sur une grosse texture
    Par gaut dans le forum DirectX
    Réponses: 5
    Dernier message: 15/10/2004, 22h12
  4. Disparition des textures sur certaines cartes 3D
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 01/10/2004, 05h40
  5. Texture sur un cube en rotation sous Delphi !!!
    Par Cosmo dans le forum DirectX
    Réponses: 1
    Dernier message: 06/01/2004, 21h14

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