Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Moteurs de jeux vidéo > XNA
XNA Forum d'entraide sur le développement avec XNA
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/01/2012, 11h05   #1
dark poulpo
Nouveau Membre du Club
 
Homme
médical
Inscription : septembre 2007
Messages : 129
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : médical

Informations forums :
Inscription : septembre 2007
Messages : 129
Points : 34
Points : 34
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 :
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 :
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 :
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...
dark poulpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 13h01   #2
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 438
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 438
Points : 40 254
Points : 40 254
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
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 14h49   #3
dark poulpo
Nouveau Membre du Club
 
Homme
médical
Inscription : septembre 2007
Messages : 129
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : médical

Informations forums :
Inscription : septembre 2007
Messages : 129
Points : 34
Points : 34
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???
dark poulpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 18h26   #4
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 438
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 438
Points : 40 254
Points : 40 254
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
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/01/2012, 21h18   #5
dark poulpo
Nouveau Membre du Club
 
Homme
médical
Inscription : septembre 2007
Messages : 129
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : médical

Informations forums :
Inscription : septembre 2007
Messages : 129
Points : 34
Points : 34
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 :
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 :
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.
dark poulpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 22h24   #6
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 438
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 438
Points : 40 254
Points : 40 254
Essayez sans utiliser le tall du code :
Code :
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
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 14h15   #7
dark poulpo
Nouveau Membre du Club
 
Homme
médical
Inscription : septembre 2007
Messages : 129
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : médical

Informations forums :
Inscription : septembre 2007
Messages : 129
Points : 34
Points : 34
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...
dark poulpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 09h58   #8
dark poulpo
Nouveau Membre du Club
 
Homme
médical
Inscription : septembre 2007
Messages : 129
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : médical

Informations forums :
Inscription : septembre 2007
Messages : 129
Points : 34
Points : 34
bonjour, j'abandonne cette optique j'ai trouvé une alternative avec du picking triangle...
dark poulpo est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h26.


 
 
 
 
Partenaires

Hébergement Web