From ce0b4ff2b2a6a0f9a33973a0906e76ba94fd93e7 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Mon, 16 Dec 2019 14:50:03 +0100 Subject: [PATCH] [unity] Now supporting correct CanvasGroup alpha blending at SkeletonGraphic shaders via an additional parameter `CanvasGroup Compatible`. Closes #1576. --- .../SkeletonGraphic/Spine-SkeletonGraphic-Outline.shader | 1 + .../Spine-SkeletonGraphic-TintBlack-Outline.shader | 1 + .../Spine-SkeletonGraphic-TintBlack.shader | 9 ++++++++- .../Shaders/SkeletonGraphic/Spine-SkeletonGraphic.shader | 6 ++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-Outline.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-Outline.shader index edd26d2f5..05f279ea5 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-Outline.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-Outline.shader @@ -6,6 +6,7 @@ Shader "Spine/Outline/SkeletonGraphic" { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} [Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0 + [Toggle(_CANVAS_GROUP_COMPATIBLE)] _CanvasGroupCompatible("CanvasGroup Compatible", Int) = 0 _Color ("Tint", Color) = (1,1,1,1) [HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp ("Stencil Comparison", Float) = 8 diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack-Outline.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack-Outline.shader index db53433a8..f739f1145 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack-Outline.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Outline/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack-Outline.shader @@ -6,6 +6,7 @@ Shader "Spine/Outline/SkeletonGraphic Tint Black" { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} [Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0 + [Toggle(_CANVAS_GROUP_COMPATIBLE)] _CanvasGroupCompatible("CanvasGroup Compatible", Int) = 0 _Color ("Tint", Color) = (1,1,1,1) _Black ("Black Point", Color) = (0,0,0,0) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack.shader index 95372218d..0e731a730 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack.shader @@ -6,6 +6,7 @@ Shader "Spine/SkeletonGraphic Tint Black" { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} [Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0 + [Toggle(_CANVAS_GROUP_COMPATIBLE)] _CanvasGroupCompatible("CanvasGroup Compatible", Int) = 0 _Color ("Tint", Color) = (1,1,1,1) _Black ("Black Point", Color) = (0,0,0,0) @@ -64,6 +65,7 @@ Shader "Spine/SkeletonGraphic Tint Black" CGPROGRAM #pragma shader_feature _ _STRAIGHT_ALPHA_INPUT + #pragma shader_feature _ _CANVAS_GROUP_COMPATIBLE #pragma vertex vert #pragma fragment frag @@ -128,7 +130,12 @@ Shader "Spine/SkeletonGraphic Tint Black" clip (texColor.a - 0.001); #endif - return (texColor * IN.color) + float4(((1-texColor.rgb) * (_Black.rgb + float3(IN.uv1.r, IN.uv1.g, IN.uv2.r)) * texColor.a * _Color.a * IN.color.a), 0); + half4 color = (texColor * IN.color) + float4(((1-texColor.rgb) * (_Black.rgb + float3(IN.uv1.r, IN.uv1.g, IN.uv2.r)) * texColor.a * _Color.a * IN.color.a), 0); + #ifdef _CANVAS_GROUP_COMPATIBLE + // CanvasGroup alpha sets vertex color alpha, but does not premultiply it to rgb components. + color.rgb *= IN.color.a; + #endif + return color; } ENDCG } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic.shader index 5617a6904..d01657b0c 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic.shader @@ -6,6 +6,7 @@ Shader "Spine/SkeletonGraphic" { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} [Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0 + [Toggle(_CANVAS_GROUP_COMPATIBLE)] _CanvasGroupCompatible("CanvasGroup Compatible", Int) = 0 _Color ("Tint", Color) = (1,1,1,1) [HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp ("Stencil Comparison", Float) = 8 @@ -62,6 +63,7 @@ Shader "Spine/SkeletonGraphic" CGPROGRAM #pragma shader_feature _ _STRAIGHT_ALPHA_INPUT + #pragma shader_feature _ _CANVAS_GROUP_COMPATIBLE #pragma vertex vert #pragma fragment frag #pragma target 2.0 @@ -119,6 +121,10 @@ Shader "Spine/SkeletonGraphic" #endif half4 color = (texColor + _TextureSampleAdd) * IN.color; + #ifdef _CANVAS_GROUP_COMPATIBLE + // CanvasGroup alpha sets vertex color alpha, but does not premultiply it to rgb components. + color.rgb *= IN.color.a; + #endif color *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);