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

XNA/Monogame Discussion :

appliquer une texture à la volée sur un mesh (decal, decal volume?)


Sujet :

XNA/Monogame

  1. #1
    Membre régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut appliquer une texture à la volée sur un mesh (decal, decal volume?)
    salut,
    voila d'abord ce que je souhaite faire :
    le but est d'appliquer une texture (image chargée) sur un mesh (un perso dans mon cas, pour faire des effets d'hématomes) quand je clique sur l'endroit spécifié du mesh... pour plus de compréhension, on va la nommer TexDecal

    mon idée de départ :
    je fait un rendu du mesh (sans lumieres AlphaBlendEnable = false; CullMode = none dans un texture (rendutarget déclaré Color), en appliquant comme couleur, l'UV de chaque vertex via les shadders :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output.Color = float4(input.TexCoord.x, input.TexCoord.y, 0.0, 1);
    ensuite, je récupère la couleur dans la texture du rendutarget préalablement transformé en tableau Color, en fonction des coordonnées de la souris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public virtual Vector2 GetUV(Point point)
    {
          if (point.X < 0 || point.X >= viewport.Width) return Vector2.Zero;
          if (point.Y < 0 || point.Y >= viewport.Height) return Vector2.Zero;
          Color t = rendutargetarray[point.X + point.Y * viewport.Width];
          Vector4 v4 = t.ToVector4();
          v4.Normalize();
          Vector2 v2 = new Vector2(v4.X,v4.Y);
          return v2;
    }
    puis j'utilise un shader HLSL pour appliquer ma texture TexDecal (déclarée CLAMP) aux coordonées dans mon pixel shader:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    float2 scaleCenter = float2(0.5f, 0.5f);
    float scale = 10;
    float2 tall =  (pin.TexCoord - scaleCenter) * scale;
    float2 UVdecal = tall + TexCoordH1; //TexCoordH1 = le retour de GetUV(souris)
     
    float4 color = SAMPLE_TEXTURE(Texture, pin.TexCoord); // texture original
    color += SAMPLE_TEXTURE(TexDecal,UVdecal);
    sauf que bon... ça ne positionne pas ma texture la où je clique...

    alors je me pose certaines questions :

    1) la méthode est elle bonne et logique, et dans ce cas ou est l'erreur? sur la récupération de l'uv dans le tableau, ou au moment de l'appliquer dans le shader ....
    2) dois je plutôt m'orienter vers les textures 3d, comme dans l'exemple http://www.humus.name/index.php?page=3D&ID=83, mais je ne sais pas si c'est bon pour mon cas, dans le cas où j'applique une rotation de l'objet...

    merci pour votre aide...

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Le retour de GetUV(), s'il est utilisé pour un accès sur une texture dans un shader, doit être compris entre 0 et 1 (et non en position écran).
    Note: Sinon, pour le pixel shader, les coordonnées écran vont de -1 à 1.
    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 régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,
    Le retour de GetUV(), s'il est utilisé pour un accès sur une texture dans un shader, doit être compris entre 0 et 1 (et non en position écran).
    Bonjour, merci de t'intéresser à mon problème, bein c'est ce que je fait non? je récupère dans R(=U) et G(=V), puis je normalise...

    Citation Envoyé par LittleWhite Voir le message
    Bonjour,
    Note: Sinon, pour le pixel shader, les coordonnées écran vont de -1 à 1.
    je n'ai pas bien saisi pourquoi tu me dis cela???

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Quelles sont les valeurs renvoyées par GetUV(), car j'ai un peu du mal à saisir le code.

    Pour la note, je disais cela, juste au cas ou, des fois, les erreurs sont très simples. Sinon, pouvez vous décrire le bug plus précisément, afin que l'on puisse deviner où cela peut boguer.
    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
    Membre régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Quels sont les valeurs renvoyées par GetUV(), car j'ai un peu du mal à saisir le code.

    Pour la note, je disais cela juste au cas où, des fois, les erreurs sont très simples. Sinon, pouvez vous décrire le bug plus précisément, afin que l'on puisse deviner où cela peut boguer.
    l'erreur fait que la texture s'applique pas à l'endroit où je le souhaite, comme si par exemple (factice) je clique en haut, et elle s'applique en bas à droite...) donc soit mon UV retourné par GetUV() est différent de celui stocké par le shader, soit c'est le code suivant dans le shader qui n'est pas bon...

    TexCoordH1 correspond à l'UV renvoyé par GetUV()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    float2 scaleCenter = float2(0.5f, 0.5f);
    float scale = 10;
    float2 tall =  (pin.TexCoord - scaleCenter) * scale;
    float2 UVdecal = tall + TexCoordH1; 
     
    float4 color = SAMPLE_TEXTURE(Texture, pin.TexCoord); // texture original
    color += SAMPLE_TEXTURE(TexDecal,UVdecal);
    la logique dans ma tête fait que la texture devrait s'appliquer à l'endroit où je clique,, celle-ci étant centré sur l'endroit ou je clique (donc UV retourné par GetUV)


    déjà si tout est bon, sauf que je n'ai pas moyen simple de le vérifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Vector2 v2 = new Vector2(v4.X,v4.Y);(dans c#.net GetUV())
     == 
     float4(input.TexCoord.x, input.TexCoord.y, 0.0, 1);(dans le shader)
    donc GetUV() retourne un vecteur2 avec en X (input.TexCoord.x), et Y (input.TexCoord.y). Ses valeurs sont entre 0 et 1 car j'ai fait un normalize() du pixel codifié en Color, bien sûre, la valeur va changer légèrement vu que ce sera une couleur (renfermant l'UV) calculée par le GPU en fonction du pixel à dessiner.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Essayez sans utiliser le tall du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float2 scaleCenter = float2(0.5f, 0.5f);
    float scale = 10;
    float2 tall =  (pin.TexCoord - scaleCenter) * scale;
    float2 UVdecal = tall + TexCoordH1;
    D'ailleurs, à quoi sert-il ?
    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.

  7. #7
    Membre régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    je vous réponds dans quelques heures/jours, je suis en train de faire des changements et pour l'instant le code n'est pas exécutable...

  8. #8
    Membre régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    bonjour, j'abandonne cette optique j'ai trouvé une alternative avec du picking triangle...

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

Discussions similaires

  1. Appliquer une texture sur un icosaèdre
    Par nouriami dans le forum Images
    Réponses: 10
    Dernier message: 26/11/2013, 16h27
  2. Appliquer une texture sur un cercle
    Par bakman dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 01/07/2010, 15h24
  3. appliquer une texture sur une grille
    Par franc82 dans le forum OpenGL
    Réponses: 6
    Dernier message: 02/03/2007, 17h17
  4. Réponses: 5
    Dernier message: 23/07/2005, 00h40
  5. Réponses: 5
    Dernier message: 18/09/2004, 22h30

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