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

DirectX Discussion :

[c#]Création d'une texture à partir d'autres


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut [c#]Création d'une texture à partir d'autres
    Bonjour,

    Je souhaite créer une grande texture à partir de plusieurs petites (c'est pour ma heightmap).

    Je voudrais en quelques sortes faire des copiers coller de texture en fonction d'une position et du type de terrain (herbe, sable etc).

    Même si vous répondez en c++ ça me convient.

    Merci

  2. #2
    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 Re: [c#]Création d'une texture à partir d'autres
    Citation Envoyé par backfire
    Même si vous répondez en c++ ça me convient.
    Encore faudrait-il poser une question. Tu as déjà fait quoi ? Qu'est-ce qui te pose problème exactement ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    C'est vrai il n'y avait pas de question explicitement lol.

    En fait j'ai déjà créé la map mais je ne fais que répéter la même texture pour chaque case. Ce qui est ridicule. Pour plus de réalisme je veux créer une texture dynamiquement (pas une grande texture préconçue) en fonction du type de la case. Donc je veux arriver à créer une nouvelle texture à partir de plusieurs petites...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Voilà mon approche : utiliser des surfaces pour les copier dans une texture finale, mais je n'arrive pas à effectuer la copie...

    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
    Surface srcSurf = null;
                Surface destSurf = null;
                Texture[] tex = new Texture[2];            
     
                texMap = TextureLoader.FromFile(device, "nature1.dds");
     
                tex[0] = TextureLoader.FromFile(device, "nature1.dds");
                ImageInformation infoDestImg = TextureLoader.ImageInformationFromFile("nature1.dds");                        
                tex[1] = TextureLoader.FromFile(device, "travaux.jpg");
                ImageInformation infoSrcImg = TextureLoader.ImageInformationFromFile("travaux.jpg");
     
     
                srcSurf = tex[1].GetSurfaceLevel(0); // travaux.jpg
                destSurf = tex[0].GetSurfaceLevel(0);            
     
                Rectangle srcRect = new Rectangle(0, 0, infoSrcImg.Width, infoSrcImg.Height);
                Rectangle destRect = new Rectangle(0, 0, 256, 256);
     
                SurfaceLoader.FromSurface(destSurf, destRect, srcSurf, destRect, Filter.None, 0);
    Et puis que fait cette fonction SurfaceLoader.FromSurface() puisqu'elle ne renvoie rien (void) ?

  5. #5
    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
    Citation Envoyé par backfire
    Et puis que fait cette fonction SurfaceLoader.FromSurface() puisqu'elle ne renvoie rien (void) ?
    Copier srcSurf sur destSurf ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Oui, ça je l'avais compris mais la question principale demeure : commment copier une surface surface sur une texture ?

  7. #7
    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
    J'imagine qu'en choisissant judicieusement les rectangles source et destination, SurfaceLoader.FromSurface devrait faire le job. Qu'est-ce qui ne va pas exactement avec ton code ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Le problème c'est qu'une surface et une texture sont incompatibles entre elles. On peut extraire une surface d'une texture mais on ne peut pas copier une surface dans une texture. Car sans ça je ne peux pas mapper mon terrain. Mon code ne fait que copier une surface plus petite dans une plus grande. Il me manque la copie de destSurf vers ma texMap...

  9. #9
    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
    Je ne comprends pas ton problème.

    Tu extrais la surface de niveau 0 de ta texture, tu écris dedans, tu régénères les niveaux suivants si nécessaire, et puis voilà. A quel niveau se situe le problème ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Et comment régénère-t-on les niveaux suivants ? car je ne trouve pas de SetSurfaceLevel() ? Il est là mon problème. Je dois mal m'exprimer.

    Je récapitule :
    Je récupère la texture dans une surface avec GetSurfaceLevel(0) et je la copie (la surface) dans une autre plus grande.
    Ensuite ce que je n'arrive pas à faire c'est la recopier dans une texture (et non une surface). Je ne vois pas comment être plus explicite...

  11. #11
    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
    GetSurfaceLevel(0) ne te renvoies pas une copie de la surface de niveau 0 de la texture, tu travailles directement sur la surface originelle et toute modif apportée sera donc repercutée sur la texture.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Ah d'accord ! merci. C'est étrange que la fonction comporte un "Get". Le fonctionnement de DirectX est étrange parfois...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Donc comment dois-je m'y prendre pour créer une texture de 256x256 par exemple à partir de textures de 8x8 différentes afin faire des tiles (herbe, sable, roche, etc) ?

  14. #14
    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
    Désolé de répondre ça une fois de plus, mais... tu utilises les bonnes fonctions, donc où est le problème exactement ? Est-ce que tu cherches un algorithme pour mixer tes textures ? Ou on reste vraiment dans un problème purement lié à DirectX ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Tu as raison il s'agit plus d'un algo pour mixer des textures. Je suis en train d'essayer une technique. On va voir si j'y parviens.

  16. #16
    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
    Sinon tu peux toujours poster sur le forum Algorithmes, également.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Voici ce que j'ai réussi à faire :

    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
    tex[0] = TextureLoader.FromFile(device, "eau.dds");        
            tex[1] = TextureLoader.FromFile(device, "terre.dds");        
            tex[2] = TextureLoader.FromFile(device, "roche.dds");        
            tex[3] = TextureLoader.FromFile(device, "herbe.dds");
     
            // grande texture principale
            texMap = new Texture(device, size.Width * 16, size.Height * 16, 1, 0, Format.D16, Pool.Default);
            // surface de destination -> texMap
            destSurf = texMap.GetSurfaceLevel(0);
     
            srcRect = new Rectangle(new Point(0, 0), new Size(16, 16) );
     
            for (int j = 0; j < size.Height; j++)
            {
              for (int i = 0; i < size.Width; i++)
              {
                if(altMap[i,j]<=0.25f) // eau
                  srcSurf = tex[0].GetSurfaceLevel(0);
                else if (altMap[i, j] <= 0.5f) // herbe
                  srcSurf = tex[3].GetSurfaceLevel(0);
                else if (altMap[i, j] <= 0.75f) // terre
                  srcSurf = tex[1].GetSurfaceLevel(0);
                else // roche
                  srcSurf = tex[2].GetSurfaceLevel(0);
     
                destRect = new Rectangle(new Point(i*16, j*16), new Size(16, 16));
     
                SurfaceLoader.FromSurface(destSurf, destRect, srcSurf, srcRect, Filter.None, 0);            
              }
            }
    Cependant il m'affiche une erreur d'exécution sur le Filter.None... L'erreur vient sûrement d'ailleurs.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    C'est bon j'ai réussi ! le problème venait du format de l'image, ça ne marchait pas en D16, j'ai donc tout mis en A8R8G8B8 :

    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
    private void CreateTextureMap()
          {
            Surface srcSurf = null;
            Surface destSurf = null;
            Texture[] tex = new Texture[4];
            Rectangle srcRect;
            Rectangle destRect;        
     
            tex[0] = TextureLoader.FromFile(device, "eau.dds");        
            tex[1] = TextureLoader.FromFile(device, "terre.dds");        
            tex[2] = TextureLoader.FromFile(device, "roche.dds");        
            tex[3] = TextureLoader.FromFile(device, "herbe.dds");
     
            // grande texture principale
            texMap = new Texture(device, size.Width , size.Height , 1, 0, Format.A8R8G8B8, Pool.Default);
            // surface de destination -> texMap
            destSurf = device.CreateOffscreenPlainSurface(size.Width * 16, size.Height * 16, Format.A8R8G8B8, Pool.Default);
            destSurf = texMap.GetSurfaceLevel(0);
     
            srcRect = new Rectangle(0, 0, 16, 16);
     
            for (int j = 0; j < size.Height; j++)
            {
              for (int i = 0; i < size.Width; i++)
              {
                srcSurf = device.CreateOffscreenPlainSurface(16, 16, Format.A8R8G8B8, Pool.Default);
                if(altMap[i,j]<=0.25f) // eau
                  srcSurf = tex[0].GetSurfaceLevel(0);
                else if (altMap[i, j] <= 0.5f) // herbe
                  srcSurf = tex[3].GetSurfaceLevel(0);
                else if (altMap[i, j] <= 0.75f) // terre
                  srcSurf = tex[1].GetSurfaceLevel(0);
                else // roche
                  srcSurf = tex[2].GetSurfaceLevel(0);
     
                destRect = new Rectangle(i * 16, j * 16, 16, 16);
                SurfaceLoader.FromSurface(destSurf, destRect, srcSurf, srcRect, Filter.None, 0);
              }
            }
     
            //texMap = TextureLoader.FromFile(device, "eau.dds");
     
          }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/04/2014, 10h16
  2. [Débutant] Création d'une classe à partir de deux autres
    Par a.floranc dans le forum VB.NET
    Réponses: 13
    Dernier message: 10/06/2012, 20h41
  3. Création d'une courbe à partir de deux autres
    Par Nathaniel_etudiant dans le forum Simulink
    Réponses: 2
    Dernier message: 12/10/2010, 15h01
  4. Création d'une BDD à partir d'une autre BDD
    Par louroulou dans le forum Modélisation
    Réponses: 1
    Dernier message: 18/01/2008, 22h05
  5. Création d'une table à partir d'une autre table en VB6
    Par mqsi dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/07/2007, 14h22

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