[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.

This commit is contained in:
Harald Csaszar 2020-09-11 18:38:03 +02:00
parent faf9bbfe87
commit 4cf792f51d
5 changed files with 67 additions and 40 deletions

View File

@ -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

View File

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

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}