From 5c1faa85af9ed7a7d265bb8da3c0a5235454fa59 Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Tue, 29 Sep 2020 16:38:37 +0200 Subject: [PATCH] [unity] Fixed all Tint and TintBlack shader blend behaviour, previous changes by commit d43b7b0 were incorrect in some cases. Closes #1756. --- .../CGIncludes/Spine-Skeleton-Tint-Common.cginc | 10 +++++----- .../Spine-SkeletonGraphic-TintBlack.shader | 12 +++++++----- .../spine-unity/Shaders/Spine-Skeleton-Tint.shader | 4 ++-- .../Shaders/Spine-Skeleton-TintBlack.shader | 4 ++-- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Tint-Common.cginc b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Tint-Common.cginc index 9d9989b07..acff8bf8a 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Tint-Common.cginc +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Tint-Common.cginc @@ -1,21 +1,21 @@ #ifndef SKELETON_TINT_COMMON_INCLUDED #define SKELETON_TINT_COMMON_INCLUDED -float4 fragTintedColor(float4 texColor, float3 darkTintColor, float4 lightTintColor, float darkColorAlpha) { +float4 fragTintedColor(float4 texColor, float3 darkTintColor, float4 lightTintColorPMA, float lightColorAlpha, float darkColorAlpha) { - float a = texColor.a * lightTintColor.a; + float a = texColor.a * lightTintColorPMA.a; #if !defined(_STRAIGHT_ALPHA_INPUT) float3 texDarkColor = (texColor.a - texColor.rgb); #else float3 texDarkColor = (1 - texColor.rgb); #endif - float3 darkColor = texDarkColor * darkTintColor.rgb; - float3 lightColor = texColor.rgb * lightTintColor.rgb; + float3 darkColor = texDarkColor * darkTintColor.rgb * lightColorAlpha; + float3 lightColor = texColor.rgb * lightTintColorPMA.rgb; float4 fragColor = float4(darkColor + lightColor, a); #if defined(_STRAIGHT_ALPHA_INPUT) - fragColor.rgb *= fragColor.a; + fragColor.rgb *= texColor.a; #endif #if defined(_DARK_COLOR_ALPHA_ADDITIVE) 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 16954acac..ccf24f53a 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 @@ -109,7 +109,7 @@ Shader "Spine/SkeletonGraphic Tint Black" OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); OUT.texcoord = IN.texcoord; - OUT.color = IN.color * _Color; + OUT.color = IN.color; OUT.darkColor = float4(IN.uv1.r, IN.uv1.g, IN.uv2.r, IN.uv2.g); return OUT; } @@ -125,17 +125,19 @@ Shader "Spine/SkeletonGraphic Tint Black" clip(texColor.a - 0.001); #endif - float4 vertexColor = IN.color; + float4 vertexColor = IN.color * float4(_Color.rgb * _Color.a, _Color.a); #ifdef _CANVAS_GROUP_COMPATIBLE // CanvasGroup alpha multiplies existing vertex color alpha, but // does not premultiply it to rgb components. This causes problems // with additive blending (alpha = 0), which is why we store the // alpha value in uv2.g (darkColor.a). - vertexColor.a = IN.darkColor.a; + float originalAlpha = IN.darkColor.a; + float canvasAlpha = (originalAlpha == 0) ? IN.color.a : IN.color.a / originalAlpha; + vertexColor.a = originalAlpha * _Color.a; #endif - float4 fragColor = fragTintedColor(texColor, _Black.rgb + IN.darkColor, vertexColor, _Black.a); + float4 fragColor = fragTintedColor(texColor, _Black.rgb + IN.darkColor, vertexColor, _Color.a, _Black.a); #ifdef _CANVAS_GROUP_COMPATIBLE - fragColor.rgba *= IN.color.a; + fragColor.rgba *= canvasAlpha; #endif return fragColor; } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-Tint.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-Tint.shader index 06290f609..4595bcb7f 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-Tint.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-Tint.shader @@ -69,7 +69,7 @@ Shader "Spine/Skeleton Tint" { VertexOutput o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; - o.vertexColor = v.vertexColor * _Color; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. return o; } @@ -77,7 +77,7 @@ Shader "Spine/Skeleton Tint" { float4 frag (VertexOutput i) : SV_Target { float4 texColor = tex2D(_MainTex, i.uv); - return fragTintedColor(texColor, _Black.rgb, i.vertexColor, _Black.a); + return fragTintedColor(texColor, _Black.rgb, i.vertexColor, _Color.a, _Black.a); } ENDCG } diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader index 72b069f98..df562da45 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader @@ -75,7 +75,7 @@ Shader "Spine/Skeleton Tint Black" { VertexOutput o; o.pos = UnityObjectToClipPos(v.vertex); // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' o.uv = v.uv; - o.vertexColor = v.vertexColor * _Color; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. o.darkColor = float3(v.uv1.r, v.uv1.g, v.uv2.r); return o; } @@ -84,7 +84,7 @@ Shader "Spine/Skeleton Tint Black" { float4 frag (VertexOutput i) : SV_Target { float4 texColor = tex2D(_MainTex, i.uv); - return fragTintedColor(texColor, _Black.rgb + i.darkColor, i.vertexColor, _Black.a); + return fragTintedColor(texColor, _Black.rgb + i.darkColor, i.vertexColor, _Color.a, _Black.a); } ENDCG }