Effet de mask qui s'étend - Shader version

Questions à propos du scripting Shader.
Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Effet de mask qui s'étend - Shader version

Message par Iwa » 25 Nov 2015 13:35

Bonjour à touuuus,

toujours dans le but de faire ceci viewtopic.php?f=9&t=11468 je suis en train de faire un shader. Enfin... en train de péter un cable serait plus juste. Je pense que dans pas longtemps l'un de mes écrans va valdinguer!

J'ai lu la doc sur la création de shader, j'ai tapé un peu de partout pour comprendre comme ce p**** de b***** de m**** fonctionne et ça résiste. Du coup ça me gonfle très sérieusement. Mais bon à force j'ai fait un truc :

Code : Tout sélectionner

Shader "Custom/test" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Detail ("Detail", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Trasnparent" "Queue"="Transparent" "AllowProjectors"="False" }
		
		blend SrcAlpha OneMinusSrcAlpha
		
		LOD 100
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;
		sampler2D _Detail;

		struct Input {
			float2 uv_MainTex;
			float2 uv_Detail;
		};

		fixed4 _Color;
		float _OuterRadius;

		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
			fixed4 c2 = tex2D (_Detail, IN.uv_Detail);
			o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          	o.Albedo *= tex2D (_Detail, IN.uv_Detail).rgb;
			// Metallic and smoothness come from slider variables
			o.Metallic = 0.;
			o.Smoothness = 0.;
			o.Alpha = 0.;
		}
		ENDCG
	} 
	FallBack "Transparent"
}
J'ai deux map, map que je veux dévoiler et un mask qui n'est autre qu'une cercle blanc avec fond transparent. J'ai tenté des tas d'opération et j'ai même comme vous le voyez mis l'alpha à 0 pour avoir un résultat tout transparent.... et manifestement je m'égare méchamment quelque part parce que c'est noir mais pas transparent....

C'est pareil je pige pas pourquoi chui si sombre que ça...

Bref si vous avez une idée hein ben ça sauvera peut-être un écran. Pendant ce temps je vais continuer de bouillir en silence.

P.S : je ne comprends pas la moitié de ce que j'ai écrit, donc si il y a des conneries, hésitez pas à me dire que je débroussaille cette jungle!
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Effet de mask qui s'étend - Shader version

Message par boubouk50 » 25 Nov 2015 14:19

Déjà, fait attention à l'orthographe:

Code : Tout sélectionner

"RenderType"="Trasnparent"
Ensuite, il faut d'abord que tu choisisses un modèle proche de ce que tu veux. Veux-tu que la lumière influe? Non: Il vaut mieux partir d'u code de shader Unlit.
On va voir ça par étapes:
Quel est la finalité? Pour un élément d'UI? il doit avoir une transparence ou pas?
Quels sont les réglages que tu souhaites? Modifier la couleur de foreground? Du background?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Effet de mask qui s'étend - Shader version

Message par Iwa » 25 Nov 2015 15:07

Ah je suis un boulet.

Alors l'idée c'est d'avoir une image dans ma main texture qui ne bouge pas et une image qui me sert de mask pour faire un Cutout en gros donc qui rend transparent ce qui est transparent dans mon image mask et qui rend tel quel ce qui est dans ma main texture. Et je tilerais via un autre script cette image là. Il faut que ce soit compatible sur un élément d'UI.

Je veux pas que la lumière influe en effet du coup effectivement partir du diffuse c'était idiot de ma part. Du coup je devrais partir du unlit transparent Cutout?
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Effet de mask qui s'étend - Shader version

Message par boubouk50 » 25 Nov 2015 15:20

Iwa a écrit :Ah je suis un boulet.
Oui :langue2:
Iwa a écrit :Alors l'idée c'est d'avoir une image dans ma main texture qui ne bouge pas et une image qui me sert de mask pour faire un Cutout en gros donc qui rend transparent ce qui est transparent dans mon image mask et qui rend tel quel ce qui est dans ma main texture. Et je tilerais via un autre script cette image là. Il faut que ce soit compatible sur un élément d'UI.
> Donc, ce shader peut-être utilisé ailleurs que sur un élément d'UI?
> Pour les tiles, on peut séparer celui du mask de celui de la diffuse.
Iwa a écrit :Je veux pas que la lumière influe en effet du coup effectivement partir du diffuse c'était idiot de ma part. Du coup je devrais partir du unlit transparent Cutout?
> Oui, à voir si la découpe du cutout est pas trop rude.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Effet de mask qui s'étend - Shader version

Message par Iwa » 25 Nov 2015 15:27

boubouk50 a écrit :
Iwa a écrit :Ah je suis un boulet.
Oui :langue2:
Ahgniagniagnia ça va hein ^^ te sentais pas obligé de me conforter dans ma pensée ^^

boubouk50 a écrit :> Donc, ce shader peut-être utilisé ailleurs que sur un élément d'UI?
Nope, il ne doit être employé que sur un élément d'UI
boubouk50 a écrit :> Pour les tiles, on peut séparer celui du mask de celui de la diffuse.
Vi ça je sais (un des rares trucs que je sais ^^)
boubouk50 a écrit :> Oui, à voir si la découpe du cutout est pas trop rude.
Ben chui partie pour tester, on verra après. Si j'arrive à faire une première version avant la fin de la journée je serais déjà contente.
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Effet de mask qui s'étend - Shader version

Message par boubouk50 » 25 Nov 2015 15:43

Basiquement:
> Tu récupères ta diffuse que tu mets dans la sortie couleur RGB
> Tu récupères ton mask que tu multiplies avec l'alpha de ta diffuse et que tu mets en sortie de couleur Alpha.
là, déjà, tu as le masque. Ensuite, la partie la moins simple: l'animation du mask.
Le plus simple mais peu fonctionnel:
> Tu scales ton mask: diminution du tile de mask -> scale par rapport au coin d'origine
Le plus fonctionnel:
> Gérer le scale de ton mask en fonction d'un centre décidé par un Vector2: scale + offset.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Effet de mask qui s'étend - Shader version

Message par Iwa » 25 Nov 2015 16:50

boubouk50 a écrit :Basiquement:
> Tu récupères ta diffuse que tu mets dans la sortie couleur RGB
> Tu récupères ton mask que tu multiplies avec l'alpha de ta diffuse et que tu mets en sortie de couleur Alpha.
là, déjà, tu as le masque. Ensuite, la partie la moins simple: l'animation du mask.
Le plus simple mais peu fonctionnel:
> Tu scales ton mask: diminution du tile de mask -> scale par rapport au coin d'origine
Le plus fonctionnel:
> Gérer le scale de ton mask en fonction d'un centre décidé par un Vector2: scale + offset.
plus facile à dire qu'à faire. je relis la doc en long/large/travers je comprends pas une ligne

Code : Tout sélectionner

Shader "Custom/test" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
	_Detail ("Detail", 2D) = "white" {}
	_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}

ca je pige l'idée, j'ai rajouté un champ pour ma Detail et pas retirer pour le moment l'ami Cutoff parce que j'y vais hyper pas à pas

Code : Tout sélectionner

SubShader {

	Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
	LOD 100
bon soit, je pense que je ne dois rien changer la dedans c'est vraiment ce que je veux faire donc okay

Code : Tout sélectionner

	Lighting Off
oh un truc clair : on dégage l'effet de la lumière OUHOU! X|

Code : Tout sélectionner

	Pass {  
		CGPROGRAM
		
		//Ca j'ai compris que l'un est l'appel à une fonction sur la partie vertex et on appelle la fonction "vert"
			#pragma vertex vert
			
		//Ca j'ai vaguement compris que l'autre est l'appel à une fonction sur la partie fragment (woot?) et on appelle la fonction "frag"
			#pragma fragment frag
			
		//Gros WTF, j'ai vu que c'était important partout mais je comprends toujours pas trop pourquoi
			#pragma multi_compile_fog

Code : Tout sélectionner

			#include "UnityCG.cginc"

			
			struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
				UNITY_FOG_COORDS(1)
			};
Lolilol c'est là que je pige plus rien du tout ce que j'ai vu c'est que le machin POSITION ou SV_POSITION ça sert pour dire des trucs à la GPU mais je comprends pas ce que fagote c'est machin là, quand j'ai tenté de rajouté ma detail dedans il m'a dit "va te faire...". Je comprends pas, ça sert de paramètre à me fonction frag et vert. L'un semblerait servir pour l'autre ...

Code : Tout sélectionner

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			sampler2D _Detail;
			float4 _Detail_ST;
			
			fixed _Cutoff;
Alors là j'ai un sampler 2D et un float4... la différence? Pourquoi deux? L'un semble une référence à la propriété mais l'autre c'est quoi? Une conversion? Un truc pour se foutre de ma gueule?

Code : Tout sélectionner

			
			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				clip(col.a - _Cutoff);
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
		ENDCG
	}
}
}
Je n'émettrais AUCUN commentaire là dessus. Je crois qu'il faut que je rajoute un truc dans ce style :

Code : Tout sélectionner

fixed4 col = tex2D(_MainTex, i.texcoord);
fixed4 col = tex2D(_Detail , i.detailMap);
col.a = alpha;
EDIT :
En écrivant ça je me suis dit HEY!

J'ai tenté ça :

Code : Tout sélectionner

fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				fixed4 alpha = tex2D(_Detail, i.texcoord);
				col.a = alpha;
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
il s'en fiche, je vous dis même pas comment. Ca ou pisser dans un violon...

Et je viens de lire le Why on a le Sampler 2D et le float4.... en fait l'un contient la texture et l'autre les coordonnées d'application de cette texture! Mon monde s'éclaircit!

EDIT 2 :
The geometry of your model is first passed through a function called vert which can alter its vertices. Then, individual triangles are passed through another function called frag which decides the final RGB colour for every pixel
Ahhhhhhhhhhhhhhhhhhhh! Okay cool!
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Effet de mask qui s'étend - Shader version

Message par Iwa » 25 Nov 2015 18:07

Code : Tout sélectionner

fixed4 frag (v2f i) : SV_Target
			{
				half4 mainColor = tex2D(_MainTex, i.texcoord);
				half4 alpha = tex2D(_Detail, i.texcoord);
				UNITY_APPLY_FOG(i.fogCoord, mainColor);
				return mainColor * alpha;
			}
HURRAY! Ca fait quelque chose ça!

Par contre j'ai toujours pas de rendu transparent et ca c'est pénible.

Voilà mon rendu actuel :
Image

Reste à trouvé pourquoi mon noir est noir et faire le reste 8|
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Effet de mask qui s'étend - Shader version

Message par boubouk50 » 25 Nov 2015 18:11

Ben ça avance pas mal! (Je vois même que tu réponds à tes propres questions avant que je ne le fasse)
C'est sur il y'a encore plein de choses inutiles, genre le fog pour l'UI.

N'oublie pas le façon de gérer l'alpha. Ex:
AlphaTest Greater 0.5

pour les exemples, je m'aide énormément de la doc ShaderLab et de ses exemples.

EDIT - Donc _ST sont comme tu l'as vu les valeurs d'offset et de Tile qui te permettra donc de changer la taille du mask sans changer celle de la diffuse.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Effet de mask qui s'étend - Shader version

Message par Iwa » 25 Nov 2015 18:40

boubouk50 a écrit :Ben ça avance pas mal! (Je vois même que tu réponds à tes propres questions avant que je ne le fasse)
C'est sur il y'a encore plein de choses inutiles, genre le fog pour l'UI.
Ah ouais je me suis pas encore occupée de ça ^^
boubouk50 a écrit :N'oublie pas le façon de gérer l'alpha. Ex:
AlphaTest Greater 0.5
Ah donc c'est obligatoire en fait, c'est pour ça... bon ben je vais tester des tags dans ce goût là.
boubouk50 a écrit :pour les exemples, je m'aide énormément de la doc ShaderLab et de ses exemples.
Ok je vais lire tout ça alors :)
boubouk50 a écrit :EDIT - Donc _ST sont comme tu l'as vu les valeurs d'offset et de Tile qui te permettra donc de changer la taille du mask sans changer celle de la diffuse.
Ah ok, ben je vais fouiller, je crois que je comprends ce que je dois faire. Merci pour le coup de main :)

EDIT : Euuuuh
Note: AlphaTest commands have no effect when fragment programs are used
Ca veut dire que je peux crever?
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Répondre

Revenir vers « les Shaders »