Changement de texture précis après collision

Questions à propos du scripting Shader.
Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 02 Avr 2015 11:16

Yondaime13 a écrit :Je connais bien l'algo de floodfill (utilisé pour faire un démineur en JAVA ;) ) mais là je viens de faire juste une double boucle for mais bon ça marche que si ça fait une forme rectangulaire et que j'ai que 4 points mais vu que moi ça fait normalement une forme de pointe ça va être plus compliqué :D
Non justement, si tu suis la méthode que je t'ai décrite, ça fonctionnera pour n'importe quelle forme : tu fais une boucle sur tous les pixels, et pour chaque tu vérifies s'il est à l'intérieur ou l'extérieur de la forme délimitée par tes points, peu importe le nombre.
Yondaime13 a écrit :Juste une dernière question, comment tu fais pour réinitialiser ta texture après avoir changé ses pixels ? Parce que en relançant une autre fois après les pixels rouges ne disparaissent pas :oops:
Bah de la même manière tu fais une boucle sur tous les pixels, et tu remets l'alpha à 0.
Sinon, au lieu de modifier directement ta texture originale, tu en fais une copie au démarrage de l'appli et tu ne touches qu'à cette copie.

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 03 Avr 2015 08:41

Avant de mettre tout ça en pratique, juste un petit message pour te remercier pour tout ce que tu as fait afin que je comprenne mieux ce que je dois faire ! :)

Vraiment très cool de ta part ! :D

Bisous !! :P
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 03 Avr 2015 08:50

Yondaime13 a écrit :Avant de mettre tout ça en pratique, juste un petit message pour te remercier pour tout ce que tu as fait afin que je comprenne mieux ce que je dois faire ! :)
Vraiment très cool de ta part ! :D
Y'a pas de quoi, je suis là pour ça :mrgreen:
Yondaime13 a écrit :Bisous !! :P
Heu... Attention, pas trop d'enthousiasme quand même ;)

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 04 Mai 2015 13:59

Pour le remplissage de la zone de pixels, il y aurait bien une fonction du type floodfill, mais ça ne conviendrait pas à tous les coups (et serait relativement compliqué à mettre en place).
Le mieux est encore de considérer les 4 points testés comme formant un polygone (donc il faut bien les assigner à ta classe dans l'ordre) et de détecter si chaque pixel se trouve dedans ou en dehors de ce polygone.
Juste une question encore, j'ai un peu de mal là, le tableau que te renvoie GetPixels est un tableau de Colors[] donc comment avoir les coordonnées des pixels concernés ?

Je bloque dessus ... :oops:
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 14 Mai 2015 00:47

Oui effectivement, ça te retourne un tableau à une dimension alors que ta texture en a deux :D
Les pixels sont stockés dedans ligne par ligne, les unes à la suite des autres.

pour touver l'index d'un pixel dans le tableau à partir de coordonées 2D x,y sur la texture, il faut faire :

Code : Tout sélectionner

int index = (y * largeur_texture) + x
et pour trouver x et y à partir de l'index dans le tableau :

Code : Tout sélectionner

int y = Mathf.floor(index / largeur_texture);
int x = index - (y*largeur);
Et si je ne dis pas de bêtise, le coin correspondant au point 0,0 de la texture est le coin inférieur gauche.

Mais attention, ne t'amuse pas à tester tous les pixels pour trouver lesquels sont colorés, ça serait beaucoup trop lent !
Il faut partir des coordonnées que tu connais, en déduire le polygone, et directement remplir les pixels concernés dans le tableau.

Un peu de lecture :
http://www.cs.rit.edu/~icss571/filling/index.html
https://www.cosc.brocku.ca/Offerings/3P ... ctures/2d/

L'intérêt de tout ça, c'est que ça te fait étudier plein de trucs sympas... Par contre je te recommande d'essayer quand même la solution avec le render to texture, qui sera à mon avis plus rapide ;)

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 15 Mai 2015 14:13

Ben de toute façon comme tu me l'avais conseillé j'ai réduit la zone ou je prend les pixels, à partir de mes 4 points d'intersections je fais cela

Code : Tout sélectionner

if (drill) {



			Xmin = (int)pixelUV[0].x;
			Xmax = (int)pixelUV[2].x;

			Ymin = (int)pixelUV[0].y;
			Ymax = (int)pixelUV[2].y;


			if(Xmin > 0 && Xmax > 0 && Ymin > 0 && Ymax > 0){

				pix = temp.GetPixels(Xmin,Ymin,Xmax-Xmin,Ymax-Ymin);

				Color BloodRed = new Color(0.776f,0.031f,0);

				for( int j=0; j < pix.Length ; j++){

					float y = Mathf.Floor(j /(Xmax-Xmin) );
					float x = j - (y*(Xmax-Xmin));

					if(pointInPolygon(x,y))
						pix[j] = BloodRed;
				}


				if( Mathf.Abs(Xmax-Xmin) < 100){
						temp.SetPixels(Xmin,Ymin,Xmax-Xmin,Ymax-Ymin,pix);

					temp.Apply();
				}
			}

Bien sur l'application de l'algo ne marche pas pour l'instant ( j'ai pris un des algo du lien que tu m'avais passé auparavant ).

Et s'agissant du RenderTexture je viens de regarder des tutos là dessus et c'est vrai que ça à l'air intéressant mais le problème je pense que les vues dans mon projet sont pas exactement au dessus de la vertèbre, un tout petit peu décalé. Mais même tu m'as dit qu'il fallait que je filme d'une manière alternative mes objets ? C'est cela que j'ai pas trop bien compris, car j'ai une texture spécial pour ma vertèbre et mon outil, il faudrait que je les duplique pour les mettre en blanc pour la vertèbre et rouge pour l'outil ? :roll:
Et j'imagine qu'avec cette méthode, le fait de devoir laisser la trace de l'outil ne marche pas car il est obligé qu'il y ai l'outil pour faire le multiply non ?


PS : Quant tu parles de mode de fusion, tu fais référence aux Shaders ?
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 15 Mai 2015 17:47

Yondaime13 a écrit :Ben de toute façon comme tu me l'avais conseillé j'ai réduit la zone ou je prend les pixels, à partir de mes 4 points d'intersections je fais cela
ok très bien
Yondaime13 a écrit :Et s'agissant du RenderTexture je viens de regarder des tutos là dessus et c'est vrai que ça à l'air intéressant mais le problème je pense que les vues dans mon projet sont pas exactement au dessus de la vertèbre, un tout petit peu décalé. Mais même tu m'as dit qu'il fallait que je filme d'une manière alternative mes objets ? C'est cela que j'ai pas trop bien compris, car j'ai une texture spécial pour ma vertèbre et mon outil, il faudrait que je les duplique pour les mettre en blanc pour la vertèbre et rouge pour l'outil ? :roll:
Et j'imagine qu'avec cette méthode, le fait de devoir laisser la trace de l'outil ne marche pas car il est obligé qu'il y ai l'outil pour faire le multiply non ?
Si ce n'est pas pile au dessus, ce n'est pas grave. La caméra secondaire utilisée pour le rendertotexture doit simplement être alignée avec le plan de coupe de la vertèbre.
Ensuite, tu peux créer un layer spécifique où tu va placer une copie de ton outil avec un shader tout blanc, il faut alors créer la caméra secondaire qui ne visualisera que ce layer, et sur fond noir.
Il faut bien penser à désactiver l'option d'effacement du fond de la caméra pour que ça laisse une trace du passage de ton outil.
Il vaut mieux utiliser une caméra orthographique, et la cadrer pour qu'elle visionne exactement la zone correspondant à l'espace UV de ta vertèbre, pour que ça tombe pile poil.
C'est cette caméra secondaire qui met à jour la rendertexture, qui sera alors une image en noir et blanc représentant la couche alpha à appliquer à ta texture principale.
Le plus simple étant de te faire un shader spécifique pour mixer tout ça (c'est pas très compliqué dans ce cas)
Yondaime13 a écrit :PS : Quant tu parles de mode de fusion, tu fais référence aux Shaders ?
oui

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 15 Mai 2015 20:53

Code : Tout sélectionner

Ensuite, tu peux créer un layer spécifique où tu va placer une copie de ton outil avec un shader tout blanc, il faut alors créer la caméra secondaire qui ne visualisera que ce layer, et sur fond noir.
Il faut bien penser à désactiver l'option d'effacement du fond de la caméra pour que ça laisse une trace du passage de ton outil.
Il vaut mieux utiliser une caméra orthographique, et la cadrer pour qu'elle visionne exactement la zone correspondant à l'espace UV de ta vertèbre, pour que ça tombe pile poil.
C'est cette caméra secondaire qui met à jour la rendertexture, qui sera alors une image en noir et blanc représentant la couche alpha à appliquer à ta texture principale.
Le plus simple étant de te faire un shader spécifique pour mixer tout ça (c'est pas très compliqué dans ce cas)
Je veux bien te croire que ce n'est pas compliqué mais comme je te l'ai dit je suis novice sur ce logiciel, je n'ai que quelques mois de pratique et je n'ai jamais encore abordé les Shaders, c'est pour cela que moi ça me parait super compliqué. Si tu as un tuto spécifique en rapport avec ce que je veux faire à me recommander je suis preneur ! :lol:
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 16 Mai 2015 01:25

Commence déjà par faire le reste avec la gestion du rendu de la caméra secondaire, pour le shader on verra ensuite.
Je te filerais un coup de main là dessus si besoin, ça sera plus rapide que de trouver un tuto qui fait ça spécifiquement et ça ne sera pas compliqué à expliquer.

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 16 Mai 2015 11:39

Je viens de voir ta réponse ! :D
Je viens de faire ce que tu m'as dit mais pour simplifier le truc j'ai fait un projet à part entière où je remplace ma vertèbre par un cube aplatit et mon outil par un vulgaire cylindre allongé ! :lol:
Je te mets en ci-joint ce que je viens de faire :)
Je savais pas trop de quoi tu parlais quand tu me disais de désactiver l'option d'effacement de la caméra, j'en ai déduit que c'était le paramètre "Occlusion Culling" ;)
Pièces jointes
TextureRenderer_Shader.rar
(183.09 Kio) Téléchargé 172 fois
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Répondre

Revenir vers « les Shaders »