mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-06 15:24:55 +08:00
[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:
parent
faf9bbfe87
commit
4cf792f51d
@ -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
|
||||
@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cc9439c8e75fb7e4c82ad725b649b047
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -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,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,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
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user