Shader de remplacement de couleur pour sprite

Questions à propos du scripting Shader.
Avatar de l’utilisateur
manthoR
Messages : 180
Inscription : 15 Mai 2014 11:43
Localisation : Paris, France
Contact :

Shader de remplacement de couleur pour sprite

Message par manthoR » 08 Fév 2015 14:39

Salut !

Je cherche à faire un shader pour remplacer un à plat gris par du transparent. Plus généralement un remplacement de couleur par une autre.

Voici ce que j'ai fait simplement :
Deux properties :

Code : Tout sélectionner

 _Color1in ("Color 1 In", Color) = (1,1,1,1)
 _Color1out ("Color 1 Out", Color) = (1,1,1,1)
Et un simple remplacement :

Code : Tout sélectionner

texColor = all(texColor == _Color1in) ? _Color1out : texColor;
Je peux de fait choisir une couleur et la remplacer par du transp.
Le soucis c'est que l'image source est pas parfaite et le remplacement est franchement crade :
Image

Je vous avoue etre complètement perdu dans la philosophie même de la conception de shader.
J'ai eu l'idée d'ajouter à mon truc une sorte de "tolerance" ou de "blend" paramétrable par range :

Code : Tout sélectionner

_Tolerance ("Tolerance", Range(0,1)) = 0.0
mais je vois pas trop comment effectuer une opération mathématique de comparaison de couleur pour remplacer plus proprement ce satané gris...

Si vous avez des idées... :)
Sinon, j'abandonne et je laisse un fond gris, na !
Flavien - Social networkons ! Twitter - Google+ - Facebook
Image

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Shader de remplacement de couleur pour sprite

Message par F@B » 08 Fév 2015 16:51

si ton gris est uniforme tu peux faire un truc du genre dans le Fragment Shader (avec le 0.8 en paramètre) sinon un seuil et comparer >= ?

Code : Tout sélectionner

   
	void surf (Input IN, inout SurfaceOutput o) {
	   fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
			
	    if (c.r == 0.8 && c.g == 0.8 && c.b == 0.8 ){
            	c.a=1;
            }
			o.Albedo = c.rgb;
			o.Alpha = c.a;
	    }
	}
je sais pas si c'est clair? dans le pixel tu teste sa valeur r g b et si c'est bon pour les trois t'y met de l'alpha, tu dois aussi pouvoir faire clip(); je me souviens plus trop son fonctionnement.

si t'es plus ou moins gris tu clamp ton test entre deux valeur? ou t'ajoute une tolérance
ʕ·͡ᴥ·ʔ ==> 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
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Shader de remplacement de couleur pour sprite

Message par F@B » 09 Fév 2015 12:43

un petit shader de remplacement de gris par de la transparence!

Code : Tout sélectionner



Shader "Custom/Cutout/Grey 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
	_Gris ("gris cutoff", Range (0,1)) = .5
	_GrisDelta ("gris delta", Range (0.001,0.5)) = .1
}

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
			
			#include "UnityCG.cginc"

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

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

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _Cutoff;
			float _Gris;
			float _GrisDelta;
			
			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);
				return o;
			}
			
			float4 _Color;
			half4 frag (v2f i) : COLOR
			{
				half4 col = tex2D(_MainTex, i.texcoord);
		        if (all(col.rgb >= _Gris) && all(col.rgb < _Gris+_GrisDelta) ){
		        	col.a=0;
		        	col.a=lerp(0, 1,_Gris+_GrisDelta-col.r );
		        }		        
				clip(col.a - _Cutoff);
				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
manthoR
Messages : 180
Inscription : 15 Mai 2014 11:43
Localisation : Paris, France
Contact :

Re: Shader de remplacement de couleur pour sprite

Message par manthoR » 09 Fév 2015 12:53

Canon !!!

F@b is my hero \o/

Rendu final des icones proprement détourés :

Image
Flavien - Social networkons ! Twitter - Google+ - Facebook
Image

Avatar de l’utilisateur
axel
Messages : 1924
Inscription : 26 Avr 2012 09:10
Localisation : Lille - Dunkerque
Contact :

Re: Shader de remplacement de couleur pour sprite

Message par axel » 11 Fév 2015 12:40

merci à toi. :)
Mais on dirait que la "main color" ne sert à rien dans ce shader? elle est déclarée mais je ne vois pas où elle est utilisée.

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Shader de remplacement de couleur pour sprite

Message par F@B » 11 Fév 2015 12:48

exact!

il faudrait remplacer

Code : Tout sélectionner

            return col;
par

Code : Tout sélectionner

            return col * _Color ;
pour multiplier par la couleur apres le détourage.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

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

Répondre

Revenir vers « les Shaders »