• Unity
  • How to change color in default spine shader ?

Related Discussions
...

I want to change color to Gray or other when the character under attack.
I modify the default shader:

Why there is no effect by "LightMode"="ShadowCaster" ?
Does there another way?

Shader "Spine/SkeletonHero" {
   Properties {
      _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1
      _MainTex ("Texture to blend", 2D) = "black" {}
      _MainColor ("Main Color", Color) = (1.0, 1.0, 1.0, 1.0)
   }
   // 2 texture stage GPUs
   SubShader {
      Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
      LOD 100

  Cull Off
  ZWrite Off
  Blend One OneMinusSrcAlpha
  Lighting Off

  Pass {
     ColorMaterial AmbientAndDiffuse
     SetTexture [_MainTex] {
        Combine texture * primary
     }
  }   
  Pass {
     Name "Caster"
     Tags {"LightMode"="ShadowCaster"}
     Offset 1, 1
     
     Fog { Mode Off }
     ZWrite On
     ZTest LEqual
     Cull Off
     Lighting Off

     CGPROGRAM
     #pragma vertex vert
     #pragma fragment frag
     #pragma multi_compile_shadowcaster
     #pragma fragmentoption ARB_precision_hint_fastest
     #include "UnityCG.cginc"
     struct v2f { 
        V2F_SHADOW_CASTER;
        float2  uv : TEXCOORD0;
     };

     uniform float4 _MainTex_ST;

     v2f vert (appdata_base v) {
        v2f o;
        TRANSFER_SHADOW_CASTER(o)
        o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
        return o;
     }

     uniform sampler2D _MainTex; 
     uniform fixed _Cutoff;
     float4  _MainColor;

     float4 frag (v2f i) : COLOR {
        fixed4 texcol = tex2D(_MainTex, i.uv);
        clip(texcol.a - _Cutoff);
        if(_MainColor.r == 0)
        {
           float gray = dot(texcol.rgb, float3(0.299, 0.587, 0.114)); 
           texcol.rgb = float3(gray, gray + 0.1, gray + 0.2);   
           return texcol;
        }
        else if(_MainColor.b == 0)
        {
           float gray = dot(texcol.rgb, float3(0.299, 0.587, 0.114)); 
           texcol.rgb = float3(gray - 0.1,gray + 0.05,gray + 0.2);   

           return texcol;
        }
        else if(_MainColor.g == 0)
        {
           float gray = dot(texcol.rgb, float3(0.1, 0.247, 0.014)); 
           texcol.rgb = float3(gray, gray, gray);   

           return texcol;
        }
        
        SHADOW_CASTER_FRAGMENT(i)
     }
     ENDCG
  }

  
   }
   // 1 texture stage GPUs
   SubShader {
      Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
      LOD 100

  Cull Off
  ZWrite Off
  Blend One OneMinusSrcAlpha
  Lighting Off

  Pass {
     ColorMaterial AmbientAndDiffuse
     SetTexture [_MainTex] {
        Combine texture * primary DOUBLE, texture * primary
     }
  }
   }
}

I found when I use

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

instead

Tags {"LightMode"="ShadowCaster"}

It works, but has some problem.

Thanks.

Easiest way is to use Skeleton.color.

GetComponent<SkeletonRenderer>().skeleton.SetColor( Color )

I want to set colo to Black white Color
like this:
dot(texcol.rgb, float3(0.299, 0.587, 0.114))

GetComponent<SkeletonRenderer>().skeleton.color only set RGBA color.

like this:
freeze boy:

normal boy