Effet de mask qui s'étend - Shader version

Questions à propos du scripting Shader.
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

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

Message par boubouk50 » 26 Nov 2015 10:08

La gueule ouverte.
Perso, j'utilise le Blend plutôt que l'alpha test:

Code : Tout sélectionner

 ZWrite Off
 Blend SrcAlpha OneMinusSrcAlpha
"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 » 26 Nov 2015 10:46

boubouk50 a écrit :La gueule ouverte.
Perso, j'utilise le Blend plutôt que l'alpha test:

Code : Tout sélectionner

 ZWrite Off
 Blend SrcAlpha OneMinusSrcAlpha
Oui, on m'a soufflé cette idée à l'oreillette. Et celle-ci aussi, qui fonctionne bien :

Code : Tout sélectionner

fixed4 frag (v2f i) : SV_Target
			{
				half4 mainColor = tex2D(_MainTex, i.texcoord);
				fixed4 alpha = tex2D(_Detail, i.texcoord);
				fixed4 col = mainColor * alpha;
				if (col.a == 0) discard;
				return col;
			}
Je sais pas trop ce qui est le mieux mais du coup voici mon résultat :

Image

Coool! Bon maintenant prendre en compte les uv :). A tout à l'heuuure

EDIT : Je pensais pas revenir si vite du coup voici le code avec la prise en compte du tilling et de l'offset (OHMYGAD j'ai avancé plus en 10 minutes que en une journée)

Code : Tout sélectionner

fixed4 frag (v2f i) : SV_Target
			{
				half4 mainColor = tex2D(_MainTex, i.texcoord);
				half4 alpha = tex2D(_Detail, i.texcoord*_Detail_ST.xy+_Detail_ST.zw);
				fixed4 col = mainColor * alpha;
				if (col.a == 0) discard;
				return col;
			}
Bon beeeen.... Et si on le faisait grandir notre mask :3 :D
"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 : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

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

Message par boubouk50 » 26 Nov 2015 11:01

Iwa a écrit :

Code : Tout sélectionner

discard;
Effectivement, c'est ce qu'il faut faire pour avoir l'alphaTest en fragment shader.

Code : Tout sélectionner

if (col.a <= _Cutoff) discard;
pour pouvoir gérer le seuil de Cuttout.
Tu n'auras pas de dégradé sur l'alpha cependant.
"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 » 26 Nov 2015 11:07

boubouk50 a écrit :
Iwa a écrit :

Code : Tout sélectionner

discard;
Effectivement, c'est ce qu'il faut faire pour avoir l'alphaTest en fragment shader.

Code : Tout sélectionner

if (col.a <= _Cutoff) discard;
pour pouvoir gérer le seuil de Cuttout.
Tu n'auras pas de dégradé sur l'alpha cependant.

Ahook donc la différence entre les Blend et ça c'est la possibilité d'avoir quelque chose de plus ou moins smooth
"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 : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

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

Message par boubouk50 » 26 Nov 2015 11:45

L'alpha test c'est soit opaque soit transparent. Il n'y pas de demi mesure. C'est plus rapide, il n'y a pas de tri à faire pour savoir s'il y a quelque chose derrière. Bref, la simplicité même. Utile pour les grilles, grillages, barreau, herbes, feuilles, etc.
Le blending, c'est pour les matériaux qui possèdent une transparence. Le verre, les liquides, les rideaux, etc. on peut avoir une valeur d'opacité. C'est plus lourd car il faut trier les objets qui sont devant ou derrière pour en dessiner tout ou une partie. l'avantage, c'est que c'est plus joli au niveau des arêtes, le liseré est plus doux.
Pour faire simple:
AlphaTest = Paint
Blending = Photoshop

Pour de l'UI, le blending est utilisé pour éviter les arêtes franches.
"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
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

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

Message par F@B » 26 Nov 2015 11:49

la semi transparence c'est un peu plus le bordel! (EDIT : comme l'explique bien boubouk) regarde dans les built-in shader le AlphaTest-SoftEdgeUnlit

tu y trouvera ton bonheur je pense.

Code : Tout sélectionner

/*
Renders doubled sides objects without lighting. Useful for
grass, trees or foliage.

This shader renders two passes for all geometry, one
for opaque parts and one with semitransparent details.

This makes it possible to render transparent objects
like grass without them being sorted by depth.
*/

Shader "Legacy Shaders/Transparent/Cutout/Soft Edge Unlit" {
Properties {
	_Color ("Main Color", Color) = (1, 1, 1, 1)
	_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
	_Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
}

SubShader {
	Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }
	Lighting off
	
	// Render both front and back facing polygons.
	Cull Off
	
	// first pass:
	//   render any pixels that are more than [_Cutoff] opaque
	Pass {  
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

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

			struct v2f {
				float4 vertex : SV_POSITION;
				fixed4 color : COLOR;
				float2 texcoord : TEXCOORD0;
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed _Cutoff;
			
			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.color = v.color;
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 _Color;
			fixed4 frag (v2f i) : SV_Target
			{
				half4 col = _Color * tex2D(_MainTex, i.texcoord);
				clip(col.a - _Cutoff);
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
		ENDCG
	}

	// Second pass:
	//   render the semitransparent details.
	Pass {
		Tags { "RequireOption" = "SoftVegetation" }
		
		// Dont write to the depth buffer
		ZWrite off
		
		// Set up alpha blending
		Blend SrcAlpha OneMinusSrcAlpha
		
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

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

			struct v2f {
				float4 vertex : SV_POSITION;
				fixed4 color : COLOR;
				float2 texcoord : TEXCOORD0;
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _Cutoff;
			
			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.color = v.color;
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 _Color;
			fixed4 frag (v2f i) : SV_Target
			{
				half4 col = _Color * tex2D(_MainTex, i.texcoord);
				clip(-(col.a - _Cutoff));
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
		ENDCG
	}
}

}
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

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 » 26 Nov 2015 12:47

Merci les gars :). Je pige mieux du coup et c'est précieux ça!

J'ai avancé en arrivant à faire un peu mieux que ce que je faisais jusque là. Au lieu de dépendre d'une seconde image que je serais forcé de tiler j'ai réussi à dessiner un cercle qu'avec des maths (merci google my dear friend) et voilà ce que j'ai :

Code : Tout sélectionner

Shader "Custom/test" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
	_CircleCenter ("Circle Center", vector ) = (0,0,0,0)
	_CircleRadius ("Circle Size", float ) = 0.5
}
SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjector" = "True" "RenderType"="Transparent" "PreviewType"="Plane"}
	LOD 100

	Cull Off
	Lighting Off
	ZWrite Off
	ZTest [unity_GUIZTestMode]
	Blend SrcAlpha OneMinusSrcAlpha

	Pass {  
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

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

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			float4 _CircleCenter;
			float _CircleRadius;

			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = v.texcoord;
				//TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				half4 mainColor = tex2D(_MainTex, i.texcoord);
				float circle = distance(float2(_CircleCenter.x,_CircleCenter.y),i.texcoord)*2;
		        float innerCircle = step(_CircleRadius,circle);
		        clip(-innerCircle);
				return mainColor;
			}
		ENDCG
	}
}

}
Effectivement mon cut est "violent", je pourrais peut-être faire une seconde pass avec un rayon plus doux qui mets l'alpha de la couleur a 50% mais ce sera du gros détail quand j'aurai réussi ça bien.

Image

Voilà, donc c'est pas mal, si je change mes paramètres de positions ou de radius ça se met à jour :ghee:

I am happy ( "et j'ai même pas mis une heure! C'est pour rien que c'est ma copine Emilie".... (Vieille pub bonduelle toussa)).

Bref! C'est cool mais il me reste une chose à corriger : mon cercle est actuellement dépendant de la taille de mon image (qui n'est pas carrée la coquine) donc mon cercle est écrabouillé. Et c'est bien malheureux. Donc il me reste un truc à résoudre : avoir le ratio de mon image pour trifouiller mon cercle et qu'il soit circulaire.

En gros la ligne qui va changer c'est elle

Code : Tout sélectionner

float circle = distance(float2(_CircleCenter.x,_CircleCenter.y),i.texcoord)*2;
"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 » 26 Nov 2015 16:20

OHHHH GOOOD FINALLY!

Code : Tout sélectionner

Shader "Custom/test" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
	_CircleCenter ("Circle Center", vector ) = (0,0,0,0)
	_CircleRadius ("Circle Size", float ) = 0.5
	_TexWidth ("TexWidth", float ) = 0
	_TexHeight ("TexHeight", float) = 0
}
SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjector" = "True" "RenderType"="Transparent" "PreviewType"="Plane"}
	LOD 100

	Cull Off
	Lighting Off
	ZWrite Off
	ZTest [unity_GUIZTestMode]
	Blend SrcAlpha OneMinusSrcAlpha

	Pass {  
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

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

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			float4 _CircleCenter;
			float _CircleRadius;
			
			float _TexWidth;
			float _TexHeight;

			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = v.texcoord;
				//TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				half4 mainColor = tex2D(_MainTex, i.texcoord);
				float ratio = _TexWidth/_TexHeight;
				float circle = distance(float2(_CircleCenter.x*_TexWidth,_CircleCenter.y*_TexHeight),float2(i.texcoord.x*_TexWidth, i.texcoord.y*_TexHeight))*2;
		        float innerCircle = step(_CircleRadius*_TexHeight,circle);
		        clip(-innerCircle);
				return mainColor;
			}
		ENDCG
	}
}

}

Ca ne s'étire pas, mais je n'ai plus qu'un petit script tout mignon à faire pour que ça le fasse tout seul! J'ai donc un cercle dans lequel je rend mon image età l'extérieur de ce cercle on voit rien :).

Chui contente :)
Dernière édition par Iwa le 26 Nov 2015 17:24, édité 2 fois.
"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 : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

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

Message par boubouk50 » 26 Nov 2015 17:06

Bravo!

Niveau Opti, il y a encore à faire, genre définir ta propre fonction d'illumination pour avoir le moins de calcul possible, alors que tu utilises le Standard system avec illumination et ombres:

Code : Tout sélectionner

#pragma surface surf Standard fullforwardshadows
Exemple
Le Fallback est aussi important pour le modèle d'illumination, il est issu de celui-ci en fait, tu devrais utiliser le Unlit Transparent, mais vu que tu as choisis le modèle Standard je ne sais pas si c'est compatible avec un legacy.

En tout cas bravo encore, c'est allé plutôt vite! :super:
"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 » 26 Nov 2015 17:25

Euh boubouk je me suis trompée j'ai tout copié mon code mais la moitié était inutile. Du coup j'ai pas de lumière :) puisque c'est de l'UI et que la lumière je m'en fiche :D
"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 »