Blend SrcAlpha OneMinusSrcAlpha

Questions à propos du scripting Shader.
Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Blend SrcAlpha OneMinusSrcAlpha

Message par Warcza » 16 Mars 2016 13:05

Bonjour,

J'ai un petit problème avec Blend SrcAlpha OneMinusSrcAlpha lorsque je Flip mon personnage.
Le Blend ne donne pas le même résultat en fonction d’où est tourné le personnage.
Je sais pas si c'est par rapport a la source qui prend mal l'inversion du sprite?


Si quelqu'un à une idée please ;s.

Merci
Je met au-cas ou le code du shader ci-dessous :

Code : Tout sélectionner

Shader "CTD/Diffuse" {
	Properties{
		_Color("Main Color", Color) = (1,1,1,1)
		_MainTex("Base (RGB) Trans (A)", 2D) = "white" {}
		_BumpMap("Normalmap", 2D) = "bump" { }
		_Cutoff("Alpha Cutoff", Range(0,1)) = 0.5
	}

		SubShader{
		Tags
		{ 
			"Queue" = "Transparent"
			"IgnoreProjector" = "True"
			"RenderType" = "Transparent"
			"PreviewType" = "Plane"
			"CanUseSpriteAtlas" = "True"
		}

			Pass{
			// Only render pixels with an alpha larger than 50%
			AlphaTest Greater 0.5
			SetTexture[_MainTex]{ combine texture }
		}

		LOD 300
		Cull Off
		Lighting On
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha
		Fog{ Mode Off }
			
		//Blend DstAlpha OneMinusSrcAlpha
		
		
			
		CGPROGRAM
		#pragma surface surf Lambert alpha vertex:vert addshadow alphatest:_Cutoff 


		sampler2D _BumpMap;
		sampler2D _MainTex;
		fixed4 _Color;

	struct Input {
		float2 uv_MainTex;
		float2 uv_BumpMap;
		fixed4 color;
	};

	void vert(inout appdata_full v, out Input o)
	{
		#if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
				v.vertex = UnityPixelSnap(v.vertex);
		#endif
		v.normal = float3(0, 0, -1);
		v.tangent = float4(1, 0, 0, 1);

		UNITY_INITIALIZE_OUTPUT(Input, o);
		o.color = _Color;
	}

	void surf(Input IN, inout SurfaceOutput o) {
		fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
		o.Albedo = c.rgb;
		o.Alpha = c.a;
		o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

	}
	ENDCG
	}

		Fallback "Diffuse"
}


/*
Shader "Lynn/Diffuse" {
	Properties
	{
		_ColorTint("Color Tint", Color) = (1,1,1,1)
		_MainTex("Main Texture", 2D) = "White"{}
		_BumpMap("Normal Map", 2D) = "bump" {}
		_RimColor("Rim Color", Color) = (1,1,1,1)
		_RimPower("Rim Power", Range(0.5, 8.0)) = 3.0
	}

	SubShader
	{
		Tags { "RenderType" = "Transparent"}
		Cull Off
		CGPROGRAM
		#pragma surface surf Lambert

		struct Input 
		{
			float4 color : COLOR;
			float2 uv_MainTex;
			float2 uv_BumpMap;
			float3 viewDir;
		};

		float4 _ColorTint;
		sampler2D _MainTex;
		sampler2D _BumpMap;
		float4 _RimColor;
		float _RimPower;

		void surf(Input IN, inout SurfaceOutput o) 
		{
			IN.color = _ColorTint;
			o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * IN.color;

			o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

			half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
			o.Emission = _RimColor.rgb * pow(rim, _RimPower);
		}
		ENDCG

	}
	Fallback "Diffuse"

}
*/
Attention à la section où vous postez, sujet déplacé.
(╯°□°)╯︵ ┻━┻

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

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par Alesk » 16 Mars 2016 13:14

Yo !

Peux tu ajouter des captures d'écran pour illustrer le problème stp ?

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

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par boubouk50 » 16 Mars 2016 14:19

Tu parles du Cull Off plutôt non?

Si tu tournes ton sprite à 180°, il est à l'envers, mais tu veux le voir, donc tu as mis un Cull Off. Or, la face visible est inversée et la lumière est calculée en fonction de cette face, donc elle ne prendra pas la lumière correctement.
C'est pour cela que cette méthode n'est bonne que si le sprite ne prend pas en compte la lumière.
Au choix:
Tu peux jouer avec l'échelle du Sprite, en le rendant négatif (sur x?), ton perso se tournera mais la face visible sera toujours la bonne.
Tu peux également jouer avec les UVs en les inversant en x.
Tu peux dupliquer ton sprite et inverser sa normale.
Tu peux en shader simuler la face invisible en reprogrammant le Cull Off qui inversera la normale... Mais bon.

En espérant que ce soit ça! ;-)
"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

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par Warcza » 16 Mars 2016 15:01

Pour la rotation du personnage j'utilise bien :
Tu peux jouer avec l'échelle du Sprite, en le rendant négatif (sur x?), ton perso se tournera mais la face visible sera toujours la bonne..
Enfaite le problème que j'ai exactement c'est :
En plus de l'effet d'ombrage que je devais mettre sur le personnage, je dois finalement simulé aussi une ombre derrière le personnage :gene: .
J'ai réussi avec le code si dessus à faire apparaitre mon ombre derrière le personnage mais j'avais un problème avec le

Code : Tout sélectionner

_Cutoff(Alpha Cutoff", Range(0,1)) = 0.5
qui me faisait un contour pixélisé noir autour de mon personnage.

Le seul moyen que j'ai trouvé pour l'enlevé c'est d'utiliser :

Code : Tout sélectionner

Blend SrcAlpha OneMinusSrcAlpha
Sur le coté d'origine ça marche nikel, sauf que lorsque mon personnage ce tourne le contour pixelisé ce voit encore (beaucoup moins, mais il se voit).

Edit : Pour le contour pixelisé, enfaite lorsqu'il ce tourne les pixels qui contournes mon personnage sont noircis, y a pas de couches qui ce rajoute.
Je sais pas si c'est très clair ce que je viens de dire?? ;o
Dernière édition par Warcza le 16 Mars 2016 15:18, édité 1 fois.
(╯°□°)╯︵ ┻━┻

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par Warcza » 16 Mars 2016 15:18

Image

Image

Voila pour l'effet.

Edit : jviens de voir, normal que sur un coté le perso ce retrouve derrière les ptits carré?? ;o
Enfaite, c'est ça le problème lol.
(╯°□°)╯︵ ┻━┻

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

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par boubouk50 » 16 Mars 2016 15:29

Pour ton code, il faut surement virer tout ce qui fait référence à l'alphaTest pour éviter le cutout, pas seulement la variable.
Genre: AlphaTest Greater 0.5
"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

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par Warcza » 16 Mars 2016 15:39

Effectivement c'est ça.
Mais si je l’enlève du coup l'ombre ne correspond plus à l'image mais au sprite entier (un rectangle en gros).

Est-ce qu'il y aurait une autre maniérè de faire le même effet sans utilisé AlphaTest dans les shader ?
(╯°□°)╯︵ ┻━┻

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

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par boubouk50 » 16 Mars 2016 16:04

Le problème c'est la transparence des ombres. Normalement le blending devrait te donner des ombres avec une opacité différente et ça c'est chaud. C'est plutôt soit ombre, soit éclairé. C'est pour cela qu'on utilise le cutout pour les ombres portées.

Tiens une lecture: http://forum.unity3d.com/threads/no-sha ... ders.9909/

Tu y trouveras un peu plus d'info pour garder les ombres je pense (je n'ai pas tout lu)
"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

Warcza
Messages : 160
Inscription : 18 Fév 2016 20:49

Re: Blend SrcAlpha OneMinusSrcAlpha

Message par Warcza » 16 Mars 2016 16:57

Ouai c'est bon j'ai trouvé, dans ton lien j'ai vue qu'une personne avec utilisé 2 SubShader dans son code du shader.
Du coup j'ai voulue test ce que ça donnerait si j'en faisais également un deuxième juste pour l'ombre (en reprenant les AlphaTest du coup), et ça marche nickel.

Merci en tout cas :-D .

PS : Par contre je sais pas si c'est conseillé d'avoir plusieurs SubShader dans un même code?
(╯°□°)╯︵ ┻━┻

Répondre

Revenir vers « les Shaders »