[Résolu] Texture2D: Aspect ratio / Blend / Fade / Alpha

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 20 Nov 2017 10:31

Salut,
alors, tout simplement au lieu de mettre du noir dans le RGB, le mettre dans le canal alpha. Il vaut mieux également utiliser l'alpha test (0 ou 1) plutôt que le blending (dégradé) plus lourd et nécessitant le tri.
https://docs.unity3d.com/Manual/SL-AlphaTest.html

Pour que ce soit encore plus optimisé, le mieux est carrément d'annuler le rendu à ces endroits. Je crois qu'il faut faire un simple return dans ce cas. A vérifier.
EDIT: discard ce peut -etre
exemple: https://en.wikibooks.org/wiki/Cg_Progra ... t_Textures
"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

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 20 Nov 2017 15:28

Boubouk,

Merci (une fois de plus) pour ta réponse!
Grâce à ton aide j'ai donc un shader qui fonctionne (ou presque, tu vas voir dans quelques lignes)

Code : Tout sélectionner

Shader "Custom/Screen_Clamped_Emissive_Fade" {
	Properties {
		_Color ( "Main Color", Color ) = ( 1, 1, 1, 1 )
		_Blend ( "Blend", Range ( 0, 1 ) ) = 0.5
		_MainTex ("Main Map", 2D) = "white" {}
		_Texture2 ( "Texture 2", 2D ) = "white" {}
		_EmissionPower ("Emission Power", Range(0,20)) = 1.0
	}
   
	SubShader {
		Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
		ZWrite Off
		Lighting Off 
		Blend SrcAlpha OneMinusSrcAlpha
		LOD 100
      
		Pass
	    {      
			AlphaTest Equal 0.0 // Only render pixels with an alpha equal to 100%
			SetTexture[_MainTex]
			SetTexture[_Texture2]
			{
				ConstantColor ( 0, 0, 0, [_Blend] )
				Combine texture Lerp( constant ) previous
			}    
		}

		Cull Off
      
		CGPROGRAM
		#pragma surface surf Lambert alpha
		#include "UnityCG.cginc"
      
		half4 LightingLambert (SurfaceOutput s, half3 lightDir, half atten) {
			half4 c;
			c.rgb = s.Albedo + s.Emission;
			c.a = s.Alpha;
			return c;
		}
      
		sampler2D _MainTex;
		sampler2D _Texture2;
		fixed4 _Color;
		float _Blend;
		float _EmissionPower;
      
		struct Input {
			float2 uv_MainTex;
			float2 uv_Texture2;
		};
      
		void surf(Input IN, inout SurfaceOutput o) {
			half4 tex = tex2D(_MainTex, IN.uv_MainTex) * _Color;
			float t;
			if (IN.uv_MainTex.x > 1.0 || IN.uv_MainTex.x < 0.0 || IN.uv_MainTex.y > 1.0 || IN.uv_MainTex.y < 0.0){
				t = 0;
			}            
			else{
 				t = 1;
			}
            
			half4 tex2  = tex2D ( _Texture2, IN.uv_Texture2 ) * _Color;
			o.Emission = lerp(tex.rgb * _EmissionPower, tex2 * _EmissionPower, _Blend );
			o.Albedo = fixed4 (0, 0, 0, 0);
			o.Alpha = t;
		}
      
		ENDCG
	}
   
	Fallback "Diffuse"
}
Tu dois peut-être te rappeler que le but premier ici est de faire un blend entre une image et un rendertexture (video).
Alors, le problème maintenant - aïe, je ne sais pas trop comment exprimer cela ;) - c'est que le render texture affiche maintenant du noir dans la portion qui correspond à celle de l'image.
Autrement dit, c'est comme ci la portion d’affichage de la video se voit "augmentée" jusqu'à la portion d'affichage de l'image par du noir.
Je crois qu'une image va tout éclaircir:
Image

As-tu une idée de ce qui se passe et de comment y remédier, stp?

A toute fin utile voici la scène pour ce test: http://www57.zippyshare.com/d/UUelEXEJ/28314/Forum.zip
Dernière édition par Jayme65 le 20 Nov 2017 16:18, édité 1 fois.

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

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 20 Nov 2017 15:51

Dans ton shader, l'alpha est celui de ta première image, or lorsque tu passes à la seconde, tu dois aussi le faire avec l'alpha.
Le souci que tu vas avoir est qu'avec l'alpha test, tu ne vas pas avoir de dégradé mais un saut entre les deux images lorsque tu arriveras vers 50% de blending.
Il te faudra donc utiliser l'alpha blending et non plus l'alpha test.
"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

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 20 Nov 2017 16:47

J'ai pensé faire un lerp entre les 2 alpha:

Code : Tout sélectionner

void surf(Input IN, inout SurfaceOutput o) {
    half4 tex = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    float t;
    if (IN.uv_MainTex.x > 1.0 || IN.uv_MainTex.x < 0.0 || IN.uv_MainTex.y > 1.0 || IN.uv_MainTex.y < 0.0){
        t = 0;
    }            
    else{
        t = 1;
    }
           
    half4 tex2  = tex2D ( _Texture2, IN.uv_Texture2 ) * _Color;
			
    o.Albedo = fixed4 (0, 0, 0, 0);
    o.Emission = lerp(tex.rgb * _EmissionPower, tex2 * _EmissionPower, _Blend );
    o.Alpha = lerp(t, tex2.a, _Blend );
}
Alors, si j'enlève le "AlphaTest Equal 0.0" de la pass, j'ai ceci:
Image
et si je le laisse,j'ai ceci (qui est ce qu'on avait jusqu'alors):
Image

Peux-tu me dire où je foire, stp? ;)

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

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 20 Nov 2017 17:16

Ici, comme tu peux le constater sur le deuxième GIF, le blending entre les 2 images fonctionne. Le problème reste donc la bande noire qui reste sur l'image 2. Cela est dû à la combinaison entre les 2 images.
Les deux images ne sont pas au même ratio, donc lorsque l'une est pleine et pas l'autre, l'alpha est interpolé ainsi que la texture. Donc la bande noire apparaît. Il faudrait donc enlever la zone noire de l'interpolation entre texture. Et du coup cela se complique un peu.
2 possibilités qui me viennent:
- Changer la combinaison: passer en additif, les 2 textures s'ajoutent, ainsi le noir n'affecte pas le reste. Par contre, le fondu se fera vers le blanc.
- Faire un cas particulier lorsque les 2 alphas ne sont pas en phase (0 et 1) -> la diffuse équivaut a la texture qui a l'alpha en 1.
"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

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 20 Nov 2017 17:59

boubouk50 a écrit :
20 Nov 2017 17:16
Ici, comme tu peux le constater sur le deuxième GIF, le blending entre les 2 images fonctionne. Le problème reste donc la bande noire qui reste sur l'image 2. Cela est dû à la combinaison entre les 2 images.
Les deux images ne sont pas au même ratio, donc lorsque l'une est pleine et pas l'autre, l'alpha est interpolé ainsi que la texture.
Tu penses que c'est ça!? Il y a quand même un truc à la base qui n'est pas clair pour moi:
Pourquoi, dès que j'enlève "AlphaTest Equal 0.0" one ne voit plus du tout l'effet d'un quelconque alpha?
J'ai bien compris, il me semble, ton explication sur l'AlphaTest et le fait que ça allégeait le calcul...mais sans cela, et avec ce simple exemple (donc on oublie ici le mix entre 2 texture):

Code : Tout sélectionner

SubShader {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    ZWrite Off
    Lighting Off 
    Blend SrcAlpha OneMinusSrcAlpha
    
   .....

void surf(Input IN, inout SurfaceOutput o) {
    half4 tex = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    float t;
    if (IN.uv_MainTex.x > 1.0 || IN.uv_MainTex.x < 0.0 || IN.uv_MainTex.y > 1.0 || IN.uv_MainTex.y < 0.0){
        t = 0;
    }            
    else{
        t = 1;
    }
           
    o.Albedo = fixed4 (0, 0, 0, 0);
    o.Emission = tex;
    o.Alpha = t;
}
...on devrait voir la texture avec son alpha (c-a-d masquée), non? Or on voit ceci:
Image
...j'ai l'impression que le problème commence là, non? Pourquoi ne voit-on pas le masque alpha en blending?

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

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 20 Nov 2017 18:18

Humm...
Alors là, je ne vois pas effectivement, peux-tu me mettre tout le code plutôt que les ... au milieu stp? Car tel quel, je pense que cela devrait marcher.
Je me demande si c'est pas un comportement par défaut. Dans ta passe, si tu n'as pas de test d'alpha, alors il prend l'alpha de ton image, qui n'existe pas puisque tu le crées dans le surface shader, donc tout est plein.
"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

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 20 Nov 2017 20:13

Voici le code (c'est exactement le même que posté précédemment...mais sans l'AlphaTest et avec l'alpha de l'image 1 uniquement, pour illustrer mon dernier propos :

Code : Tout sélectionner

Shader "Custom/Screen_Clamped_Emissive_Fade" {
	Properties {
		_Color ( "Main Color", Color ) = ( 1, 1, 1, 1 )
		_Blend ( "Blend", Range ( 0, 1 ) ) = 0.5
		_MainTex ("Main Map", 2D) = "white" {}
		_Texture2 ( "Texture 2", 2D ) = "white" {}
		_EmissionPower ("Emission Power", Range(0,20)) = 1.0
	}
   
	SubShader {
		Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
		ZWrite Off
		Lighting Off 
		Blend SrcAlpha OneMinusSrcAlpha
		LOD 100
      
		Pass
	    {      
			//AlphaTest Equal 0.0 // Only render pixels with an alpha larger than 50%
			SetTexture[_MainTex]
			SetTexture[_Texture2]
			{
				ConstantColor ( 0, 0, 0, [_Blend] )
				Combine texture Lerp( constant ) previous
			}    
		}

		Cull Off
      
		CGPROGRAM
		#pragma surface surf Lambert alpha
		#include "UnityCG.cginc"
      
		half4 LightingLambert (SurfaceOutput s, half3 lightDir, half atten) {
			half4 c;
			c.rgb = s.Albedo + s.Emission;
			c.a = s.Alpha;
			return c;
		}
      
		sampler2D _MainTex;
		sampler2D _Texture2;
		fixed4 _Color;
		float _Blend;
		float _EmissionPower;
      
		struct Input {
			float2 uv_MainTex;
			float2 uv_Texture2;
		};
      
		void surf(Input IN, inout SurfaceOutput o) {
			half4 tex = tex2D(_MainTex, IN.uv_MainTex) * _Color;
			float t;
			if (IN.uv_MainTex.x > 1.0 || IN.uv_MainTex.x < 0.0 || IN.uv_MainTex.y > 1.0 || IN.uv_MainTex.y < 0.0){
				t = 0;
			}            
			else{
 				t = 1;
			}
           
			half4 tex2  = tex2D ( _Texture2, IN.uv_Texture2 ) * _Color;
			
			o.Albedo = fixed4 (0, 0, 0, 0);
			o.Emission = lerp(tex.rgb * _EmissionPower, tex2 * _EmissionPower, _Blend );
			//o.Alpha = lerp(t, tex2.a, _Blend );
			o.Alpha = t;
		}
      
		ENDCG
	}
   
	Fallback "Diffuse"
}

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 20 Nov 2017 20:29

Oups..attend! Je (on) était tellement obnubilé par le noir du début
Image
...que je ne me suis même pas rendu compte que ça marchait là!:
Image

... on n'a plus de noir, ce que l'on voit c'est juste le fondu vers la texture! On s'en rend mieux compte avec un fond blanc!
Image

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

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 21 Nov 2017 10:13

Hum, je me demande si c'est pas un effet d'optique, mais si ça te va alors ça me va :)
Par contre, pour le AlphaTest Equal 0.0, je ne sais pas, comme je t'ai dit surement un comportement par défaut de prise en compte de l'alpha sur une image qui n'en possède pas. :?:
"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

Répondre

Revenir vers « Unity le logiciel »