From 2b28510acd8d0b65b681f9a58ca25922fd44b4bb Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 27 Jul 2022 19:21:34 +0200 Subject: [PATCH] [unity] Fixed SkeletonGraphic shader flickering on low alpha vertex colors in Linear color space. Closes #2128. --- .../Shaders/CGIncludes/Spine-Common.cginc | 14 ++++++++++++++ .../Spine-SkeletonGraphic-NormalPass.cginc | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Common.cginc b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Common.cginc index 442bb3fea..5df8e1632 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Common.cginc +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Common.cginc @@ -39,4 +39,18 @@ inline half4 PMAGammaToTargetSpace(half4 gammaPMAColor) { #endif } +// Saturated version to prevent numerical issues that occur at CanvasRenderer +// shader during linear-space PMA vertex color correction (countering automatic Unity conversion). +// Note: Only use this method when the original color.rgb values lie within [0,1] range and +// it's not an HDR color. This method is usually suitable for vertex color. +inline half4 PMAGammaToTargetSpaceSaturated(half4 gammaPMAColor) { +#if UNITY_COLORSPACE_GAMMA + return gammaPMAColor; +#else + return gammaPMAColor.a == 0 ? + half4(GammaToLinearSpace(gammaPMAColor.rgb), gammaPMAColor.a) : + half4(saturate(GammaToLinearSpace(gammaPMAColor.rgb / gammaPMAColor.a)) * gammaPMAColor.a, gammaPMAColor.a); +#endif +} + #endif diff --git a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc index a5ed3c7ac..9b414b743 100644 --- a/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc +++ b/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/CGIncludes/Spine-SkeletonGraphic-NormalPass.cginc @@ -49,7 +49,8 @@ VertexOutput vert (VertexInput IN) { #else // Note: CanvasRenderer performs a GammaToTargetSpace conversion on vertex color already, // however incorrectly assuming straight alpha color. - float4 vertexColor = PMAGammaToTargetSpace(half4(TargetToGammaSpace(IN.color.rgb), IN.color.a)); + // Saturated version used to prevent numerical issues of certain low-alpha values. + float4 vertexColor = PMAGammaToTargetSpaceSaturated(half4(TargetToGammaSpace(IN.color.rgb), IN.color.a)); #endif OUT.color = vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. return OUT;