• Unity
  • Alpha blending issues with Spine-Skeleton-Tint.shader

hi guys, currently I am facing an issue where by the sprite mesh is not rendering the alpha accurately on the Spine-skeleton-tint. This issues is not present in the Spine-skeleton-lit version.
What should I do to fix this issue?

// Spine/Skeleton Tint
// - Two color tint
// - unlit
// - Premultiplied alpha blending (Optional straight alpha input)
// - No depth, no backface culling, no fog.

Shader "Spine/Skeleton Tint" {
   Properties {
      _Color ("Tint Color", Color) = (1,1,1,1)
      _Black ("Black Point", Color) = (0,0,0,0)
      [NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {}
      [Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
      _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1
      [HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
      [Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 // Set to Always as default
   }

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

  Fog { Mode Off }
  Cull Off
  ZWrite Off
  Blend One OneMinusSrcAlpha
  Lighting Off

  Stencil {
     Ref[_StencilRef]
     Comp[_StencilComp]
     Pass Keep
  }

  Pass {
     CGPROGRAM
     #pragma shader_feature _ _STRAIGHT_ALPHA_INPUT
     #pragma vertex vert
     #pragma fragment frag
     #include "UnityCG.cginc"
     sampler2D _MainTex;
     float4 _Color;
     float4 _Black;

     struct VertexInput {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
        float4 vertexColor : COLOR;
     };

     struct VertexOutput {
        float4 pos : SV_POSITION;
        float2 uv : TEXCOORD0;
        float4 vertexColor : COLOR;
     };

     VertexOutput vert (VertexInput v) {
        VertexOutput o;
        o.pos = UnityObjectToClipPos(v.vertex);
        o.uv = v.uv;
        o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor.
        return o;
     }

     float4 frag (VertexOutput i) : SV_Target {
        float4 texColor = tex2D(_MainTex, i.uv);

        #if defined(_STRAIGHT_ALPHA_INPUT)
        texColor.rgb *= texColor.a;
        #endif

        return (texColor * i.vertexColor) + float4(((1-texColor.rgb) * _Black.rgb * texColor.a[i]_Color.a[/i]i.vertexColor.a), 0);
     }
     ENDCG
  }

  Pass {
     Name "Caster"
     Tags { "LightMode"="ShadowCaster" }
     Offset 1, 1
     ZWrite Off
     ZTest LEqual

     Fog { Mode Off }
     Cull Off
     Lighting Off

     CGPROGRAM
     #pragma vertex vert
     #pragma fragment frag
     #pragma multi_compile_shadowcaster
     #pragma fragmentoption ARB_precision_hint_fastest
     #include "UnityCG.cginc"
     sampler2D _MainTex;
     fixed _Cutoff;

     struct VertexOutput { 
        V2F_SHADOW_CASTER;
        float4 uvAndAlpha : TEXCOORD1;
     };

     VertexOutput vert (appdata_base v, float4 vertexColor : COLOR) {
        VertexOutput o;
        o.uvAndAlpha = v.texcoord;
        o.uvAndAlpha.a = vertexColor.a;
        TRANSFER_SHADOW_CASTER(o)
        return o;
     }

     float4 frag (VertexOutput i) : SV_Target {
        fixed4 texcol = tex2D(_MainTex, i.uvAndAlpha.xy);
        clip(texcol.a * i.uvAndAlpha.a - _Cutoff);
        SHADOW_CASTER_FRAGMENT(i)
     }
     ENDCG
  }
   }
}
Related Discussions
...

Did you check whether your alpha value is set to 0 and not "nearly 0" in the transparent area?
Could you please show a screenshot of the material's shader parameters?

1ヶ月 後

Did you perhaps export the atlas texture with the (default) Premultiply alpha setting enabled? As your settings show Straight Alpha Texture enabled.

As asked before, did you check the image file whether the alpha value is completely 0 and not only close to 0 in the transparent regions?

yes the alpha value is completely 0, The image was exported as Premultiplied Alpha. I unchecked the Straight alpha texture but it made no difference.
The thing is for Spine-Skeleton-Lit shader it does not show up

Thanks for the info. Could you please send us a minimal Unity project where this problem still occurs as a zip package, to contact@esotericsoftware.com. Then we can have a look at what's going wrong.


Thanks, we received your reproduction package.

I have modified your custom shader code that was included in the package accordingly so that it provides proper alpha clipping. I have removed your additional z-only pass as well as it did not make any sense to me.

Was the original discussion here on the forum also about the version of the shader created/modified by you? Please always mention such important matters up front, otherwise we are wasting a lot of time for nothing.