Selaa lähdekoodia

[Unity] Fixed incorrect color calculations at TintBlack shaders, TintBlack color was applied incorrectly leading to lighter borders at semitransparent borders. Fixed additive blend mode at `SkeletonGraphic-TintBlack`. Closes #1747.

Harald Csaszar 5 vuotta sitten
vanhempi
commit
4cf792f51d

+ 27 - 0
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Tint-Common.cginc

@@ -0,0 +1,27 @@
+#ifndef SKELETON_TINT_COMMON_INCLUDED
+#define SKELETON_TINT_COMMON_INCLUDED
+
+float4 fragTintedColor(float4 texColor, float3 darkTintColor, float4 lightTintColor, float darkColorAlpha) {
+
+	float a = texColor.a * lightTintColor.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;
+
+	float4 fragColor = float4(darkColor + lightColor, a);
+#if defined(_STRAIGHT_ALPHA_INPUT)
+	fragColor.rgb *= fragColor.a;
+#endif
+
+#if defined(_DARK_COLOR_ALPHA_ADDITIVE)
+	fragColor.a = a * (1 - darkColorAlpha);
+#endif
+	return fragColor;
+}
+
+#endif

+ 9 - 0
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Tint-Common.cginc.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: cc9439c8e75fb7e4c82ad725b649b047
+ShaderImporter:
+  externalObjects: {}
+  defaultTextures: []
+  nonModifiableTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 15 - 20
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/SkeletonGraphic/Spine-SkeletonGraphic-TintBlack.shader

@@ -8,8 +8,9 @@ Shader "Spine/SkeletonGraphic Tint Black"
 		[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)
+		_Color ("Tint Color", Color) = (1,1,1,1)
+		_Black ("Dark Color", Color) = (0,0,0,0)
+		[Toggle(_DARK_COLOR_ALPHA_ADDITIVE)] _DarkColorAlphaAdditive("Additive DarkColor.A", Int) = 0
 
 		[HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp ("Stencil Comparison", Float) = 8
 		[HideInInspector] _Stencil ("Stencil ID", Float) = 0
@@ -66,6 +67,7 @@ Shader "Spine/SkeletonGraphic Tint Black"
 		CGPROGRAM
 			#pragma shader_feature _ _STRAIGHT_ALPHA_INPUT
 			#pragma shader_feature _ _CANVAS_GROUP_COMPATIBLE
+			#pragma shader_feature _ _DARK_COLOR_ALPHA_ADDITIVE
 			#pragma vertex vert
 			#pragma fragment frag
 
@@ -87,9 +89,8 @@ Shader "Spine/SkeletonGraphic Tint Black"
 				float4 vertex   : SV_POSITION;
 				fixed4 color    : COLOR;
 				half2 texcoord  : TEXCOORD0;
-				float2 uv1 : TEXCOORD1;
-				float2 uv2 : TEXCOORD2;
-				float4 worldPosition : TEXCOORD3;
+				float3 darkColor : TEXCOORD1;
+				float4 worldPosition : TEXCOORD2;
 				UNITY_VERTEX_OUTPUT_STEREO
 			};
 
@@ -108,34 +109,28 @@ Shader "Spine/SkeletonGraphic Tint Black"
 				OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
 				OUT.texcoord = IN.texcoord;
 
-				OUT.color = IN.color * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor.
-				OUT.uv1 = IN.uv1;
-				OUT.uv2 = IN.uv2;
+				OUT.color = IN.color * _Color;
+				OUT.darkColor = float3(IN.uv1.r, IN.uv1.g, IN.uv2.r);
 				return OUT;
 			}
 
 			sampler2D _MainTex;
+			#include "../CGIncludes/Spine-Skeleton-Tint-Common.cginc"
 
 			fixed4 frag (VertexOutput IN) : SV_Target
 			{
 				half4 texColor = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd);
-
-				#if defined(_STRAIGHT_ALPHA_INPUT)
-				texColor.rgb *= texColor.a;
-				#endif
-
 				texColor *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
-
 				#ifdef UNITY_UI_ALPHACLIP
-				clip (texColor.a - 0.001);
+				clip(texColor.a - 0.001);
 				#endif
 
-				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
+				float4 fragColor = fragTintedColor(texColor, _Black.rgb + IN.darkColor, IN.color, _Black.a);
+			#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;
+				fragColor.rgb *= IN.color.a;
+			#endif
+				return fragColor;
 			}
 		ENDCG
 		}

+ 7 - 8
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-Tint.shader

@@ -7,10 +7,11 @@
 Shader "Spine/Skeleton Tint" {
 	Properties {
 		_Color ("Tint Color", Color) = (1,1,1,1)
-		_Black ("Black Point", Color) = (0,0,0,0)
+		_Black ("Dark Color", 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
+		[Toggle(_DARK_COLOR_ALPHA_ADDITIVE)] _DarkColorAlphaAdditive("Additive DarkColor.A", Int) = 0
 		[HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
 		[HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 // Set to Always as default
 
@@ -44,6 +45,7 @@ Shader "Spine/Skeleton Tint" {
 
 			CGPROGRAM
 			#pragma shader_feature _ _STRAIGHT_ALPHA_INPUT
+			#pragma shader_feature _ _DARK_COLOR_ALPHA_ADDITIVE
 			#pragma vertex vert
 			#pragma fragment frag
 			#include "UnityCG.cginc"
@@ -67,18 +69,15 @@ Shader "Spine/Skeleton Tint" {
 				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.
+				o.vertexColor = v.vertexColor * _Color;
 				return o;
 			}
 
+			#include "CGIncludes/Spine-Skeleton-Tint-Common.cginc"
+
 			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*_Color.a*i.vertexColor.a), 0);
+				return fragTintedColor(texColor, _Black.rgb, i.vertexColor, _Black.a);
 			}
 			ENDCG
 		}

+ 9 - 12
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-TintBlack.shader

@@ -9,10 +9,11 @@
 Shader "Spine/Skeleton Tint Black" {
 	Properties {
 		_Color ("Tint Color", Color) = (1,1,1,1)
-		_Black ("Black Point", Color) = (0,0,0,0)
+		_Black ("Dark Color", 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
+		[Toggle(_DARK_COLOR_ALPHA_ADDITIVE)] _DarkColorAlphaAdditive("Additive DarkColor.A", Int) = 0
 		[HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
 		[HideInInspector][Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 // Set to Always as default
 
@@ -47,6 +48,7 @@ Shader "Spine/Skeleton Tint Black" {
 
 			CGPROGRAM
 			#pragma shader_feature _ _STRAIGHT_ALPHA_INPUT
+			#pragma shader_feature _ _DARK_COLOR_ALPHA_ADDITIVE
 			#pragma vertex vert
 			#pragma fragment frag
 			#include "UnityCG.cginc"
@@ -65,8 +67,7 @@ Shader "Spine/Skeleton Tint Black" {
 			struct VertexOutput {
 				float4 pos : SV_POSITION;
 				float2 uv : TEXCOORD0;
-				float2 uv1 : TEXCOORD1;
-				float2 uv2 : TEXCOORD2;
+				float3 darkColor : TEXCOORD1;
 				float4 vertexColor : COLOR;
 			};
 
@@ -74,20 +75,16 @@ 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 * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor.
-				o.uv1 = v.uv1;
-				o.uv2 = v.uv2;
+				o.vertexColor = v.vertexColor * _Color;
+				o.darkColor = float3(v.uv1.r, v.uv1.g, v.uv2.r);
 				return o;
 			}
 
+			#include "CGIncludes/Spine-Skeleton-Tint-Common.cginc"
+
 			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 + float3(i.uv1.r, i.uv1.g, i.uv2.r)) * texColor.a*_Color.a), 0);
+				return fragTintedColor(texColor, _Black.rgb + i.darkColor, i.vertexColor, _Black.a);
 			}
 			ENDCG
 		}