Skip to content

Commit fef6658

Browse files
committed
[unity] Every Spine URP shader now has an Outline option to switch to the respective Outline shader variant. Closes #1824.
1 parent 0b6dda9 commit fef6658

22 files changed

+754
-14
lines changed

spine-unity/Assets/Spine/Editor/spine-unity/Editor/Shaders/SpineSpriteShaderGUI.cs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public class SpineSpriteShaderGUI : SpineShaderWithOutlineGUI {
4444
static readonly string kShaderLitLW = "Lightweight Render Pipeline/Spine/Sprite";
4545
static readonly string kShaderLitURP = "Universal Render Pipeline/Spine/Sprite";
4646
static readonly string kShaderLitURP2D = "Universal Render Pipeline/2D/Spine/Sprite";
47+
48+
static readonly string kShaderLitURPOutline = "Universal Render Pipeline/Spine/Outline/Sprite";
49+
static readonly string kShaderLitURP2DOutline = "Universal Render Pipeline/2D/Spine/Outline/Sprite";
50+
4751
static readonly int kSolidQueue = 2000;
4852
static readonly int kAlphaTestQueue = 2450;
4953
static readonly int kTransparentQueue = 3000;
@@ -217,8 +221,8 @@ public override void AssignNewShaderToMaterial (Material material, Shader oldSha
217221
if (oldShader.name != kShaderVertexLit && oldShader.name != kShaderPixelLit && oldShader.name != kShaderUnlit &&
218222
oldShader.name != kShaderVertexLitOutline && oldShader.name != kShaderPixelLitOutline && oldShader.name != kShaderUnlitOutline &&
219223
oldShader.name != kShaderLitLW &&
220-
oldShader.name != kShaderLitURP &&
221-
oldShader.name != kShaderLitURP2D) {
224+
oldShader.name != kShaderLitURP && oldShader.name != kShaderLitURPOutline &&
225+
oldShader.name != kShaderLitURP2D && oldShader.name != kShaderLitURP2DOutline) {
222226
SetDefaultSpriteKeywords(material, newShader);
223227
}
224228

@@ -362,27 +366,27 @@ protected virtual bool RenderModes () {
362366
foreach (Material material in _materialEditor.targets) {
363367
switch (lightMode) {
364368
case eLightMode.VertexLit:
365-
if (material.shader.name != kShaderVertexLit)
369+
if (material.shader.name != kShaderVertexLit && material.shader.name != kShaderVertexLitOutline)
366370
_materialEditor.SetShader(Shader.Find(kShaderVertexLit), false);
367371
break;
368372
case eLightMode.PixelLit:
369-
if (material.shader.name != kShaderPixelLit)
373+
if (material.shader.name != kShaderPixelLit && material.shader.name != kShaderPixelLitOutline)
370374
_materialEditor.SetShader(Shader.Find(kShaderPixelLit), false);
371375
break;
372376
case eLightMode.Unlit:
373-
if (material.shader.name != kShaderUnlit)
377+
if (material.shader.name != kShaderUnlit && material.shader.name != kShaderUnlitOutline)
374378
_materialEditor.SetShader(Shader.Find(kShaderUnlit), false);
375379
break;
376380
case eLightMode.LitLightweight:
377381
if (material.shader.name != kShaderLitLW)
378382
_materialEditor.SetShader(Shader.Find(kShaderLitLW), false);
379383
break;
380384
case eLightMode.LitUniversal:
381-
if (material.shader.name != kShaderLitURP)
385+
if (material.shader.name != kShaderLitURP && material.shader.name != kShaderLitURPOutline)
382386
_materialEditor.SetShader(Shader.Find(kShaderLitURP), false);
383387
break;
384388
case eLightMode.LitUniversal2D:
385-
if (material.shader.name != kShaderLitURP2D)
389+
if (material.shader.name != kShaderLitURP2D && material.shader.name != kShaderLitURP2DOutline)
386390
_materialEditor.SetShader(Shader.Find(kShaderLitURP2D), false);
387391
break;
388392
}
@@ -1003,11 +1007,13 @@ static bool IsLWRPShader (MaterialEditor editor, out bool mixedValue) {
10031007
}
10041008

10051009
static bool IsURP3DShader (MaterialEditor editor, out bool mixedValue) {
1006-
return IsShaderType(kShaderLitURP, editor, out mixedValue);
1010+
return IsShaderType(kShaderLitURP, editor, out mixedValue) ||
1011+
IsShaderType(kShaderLitURPOutline, editor, out mixedValue);
10071012
}
10081013

10091014
static bool IsURP2DShader (MaterialEditor editor, out bool mixedValue) {
1010-
return IsShaderType(kShaderLitURP2D, editor, out mixedValue);
1015+
return IsShaderType(kShaderLitURP2D, editor, out mixedValue) ||
1016+
IsShaderType(kShaderLitURP2DOutline, editor, out mixedValue);
10111017
}
10121018

10131019
static bool IsShaderType (string shaderType, MaterialEditor editor, out bool mixedValue) {
@@ -1047,9 +1053,11 @@ static eLightMode GetMaterialLightMode (Material material) {
10471053
return eLightMode.Unlit;
10481054
} else if (material.shader.name == kShaderLitLW) {
10491055
return eLightMode.LitLightweight;
1050-
} else if (material.shader.name == kShaderLitURP) {
1056+
} else if (material.shader.name == kShaderLitURP ||
1057+
material.shader.name == kShaderLitURPOutline) {
10511058
return eLightMode.LitUniversal;
1052-
} else if (material.shader.name == kShaderLitURP2D) {
1059+
} else if (material.shader.name == kShaderLitURP2D ||
1060+
material.shader.name == kShaderLitURP2DOutline) {
10531061
return eLightMode.LitUniversal2D;
10541062
} else { // if (material.shader.name == kShaderVertexLit || kShaderVertexLitOutline)
10551063
return eLightMode.VertexLit;

spine-unity/Assets/Spine/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "com.esotericsoftware.spine.spine-unity",
33
"displayName": "spine-unity Runtime",
44
"description": "This plugin provides the spine-unity runtime core and examples. Spine Examples can be installed via the Samples tab.",
5-
"version": "4.3.43",
5+
"version": "4.3.44",
66
"unity": "2018.3",
77
"author": {
88
"name": "Esoteric Software",

spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/2D/Outline.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
Shader "Universal Render Pipeline/2D/Spine/Outline/Skeleton" {
2+
Properties {
3+
_Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.1
4+
[NoScaleOffset] _MainTex("Main Texture", 2D) = "black" {}
5+
[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
6+
[MaterialToggle(_TINT_BLACK_ON)] _TintBlack("Tint Black", Float) = 0
7+
_Color(" Light Color", Color) = (1,1,1,1)
8+
_Black(" Dark Color", Color) = (0,0,0,0)
9+
[HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
10+
[Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 // Set to Always as default
11+
12+
// Outline properties are drawn via custom editor.
13+
[HideInInspector] _OutlineWidth("Outline Width", Range(0,8)) = 3.0
14+
[HideInInspector][MaterialToggle(_USE_SCREENSPACE_OUTLINE_WIDTH)] _UseScreenSpaceOutlineWidth("Width in Screen Space", Float) = 0
15+
[HideInInspector] _OutlineColor("Outline Color", Color) = (1,1,0,1)
16+
[HideInInspector][MaterialToggle(_OUTLINE_FILL_INSIDE)]_Fill("Fill", Float) = 0
17+
[HideInInspector] _OutlineReferenceTexWidth("Reference Texture Width", Int) = 1024
18+
[HideInInspector] _ThresholdEnd("Outline Threshold", Range(0,1)) = 0.25
19+
[HideInInspector] _OutlineSmoothness("Outline Smoothness", Range(0,1)) = 1.0
20+
[HideInInspector][MaterialToggle(_USE8NEIGHBOURHOOD_ON)] _Use8Neighbourhood("Sample 8 Neighbours", Float) = 1
21+
[HideInInspector] _OutlineOpaqueAlpha("Opaque Alpha", Range(0,1)) = 1.0
22+
[HideInInspector] _OutlineMipLevel("Outline Mip Level", Range(0,3)) = 0
23+
}
24+
25+
SubShader {
26+
// Universal Pipeline tag is required. If Universal render pipeline is not set in the graphics settings
27+
// this Subshader will fail.
28+
Tags { "RenderPipeline" = "UniversalPipeline" "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
29+
LOD 100
30+
Cull Off
31+
ZWrite Off
32+
Blend One OneMinusSrcAlpha
33+
34+
Stencil {
35+
Ref[_StencilRef]
36+
Comp[_StencilComp]
37+
Pass Keep
38+
}
39+
40+
Pass {
41+
Cull Off
42+
ZWrite Off
43+
Blend One OneMinusSrcAlpha
44+
45+
Name "Outline"
46+
Tags { "LightMode" = "SRPDefaultUnlit" "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
47+
HLSLPROGRAM
48+
// Required to compile gles 2.0 with standard srp library
49+
#pragma prefer_hlslcc gles
50+
#pragma exclude_renderers d3d11_9x
51+
52+
//--------------------------------------
53+
// GPU Instancing
54+
#pragma multi_compile_instancing
55+
56+
#pragma vertex vertOutline
57+
#pragma fragment fragOutline
58+
#pragma shader_feature _ _USE8NEIGHBOURHOOD_ON
59+
#pragma shader_feature _ _USE_SCREENSPACE_OUTLINE_WIDTH
60+
#pragma shader_feature _ _OUTLINE_FILL_INSIDE
61+
62+
#pragma fragmentoption ARB_precision_hint_fastest
63+
#pragma multi_compile_local _ PIXELSNAP_ON
64+
65+
#define USE_URP
66+
#define fixed4 half4
67+
#define fixed3 half3
68+
#define fixed half
69+
#define NO_CUTOFF_PARAM
70+
#include "../../Include/Spine-Input-Outline-URP.hlsl"
71+
#include "../../Include/Spine-Outline-Pass-URP.hlsl"
72+
ENDHLSL
73+
}
74+
75+
UsePass "Universal Render Pipeline/2D/Spine/Skeleton/UNIVERSAL2D"
76+
}
77+
78+
FallBack "Universal Render Pipeline/2D/Sprite-Unlit-Default"
79+
CustomEditor "SpineShaderWithOutlineGUI"
80+
}

spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/2D/Outline/Spine-Skeleton-Outline-URP-2D.shader.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
Shader "Universal Render Pipeline/2D/Spine/Outline/Skeleton Lit" {
2+
Properties {
3+
[NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {}
4+
[NoScaleOffset] _MaskTex("Mask", 2D) = "white" {}
5+
[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
6+
[MaterialToggle(_LIGHT_AFFECTS_ADDITIVE)] _LightAffectsAdditive("Light Affects Additive", Float) = 0
7+
[MaterialToggle(_TINT_BLACK_ON)] _TintBlack("Tint Black", Float) = 0
8+
_Color(" Light Color", Color) = (1,1,1,1)
9+
_Black(" Dark Color", Color) = (0,0,0,0)
10+
[HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
11+
[Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Compare", Float) = 8 // Set to Always as default
12+
13+
// Outline properties are drawn via custom editor.
14+
[HideInInspector] _OutlineWidth("Outline Width", Range(0,8)) = 3.0
15+
[HideInInspector][MaterialToggle(_USE_SCREENSPACE_OUTLINE_WIDTH)] _UseScreenSpaceOutlineWidth("Width in Screen Space", Float) = 0
16+
[HideInInspector] _OutlineColor("Outline Color", Color) = (1,1,0,1)
17+
[HideInInspector][MaterialToggle(_OUTLINE_FILL_INSIDE)]_Fill("Fill", Float) = 0
18+
[HideInInspector] _OutlineReferenceTexWidth("Reference Texture Width", Int) = 1024
19+
[HideInInspector] _ThresholdEnd("Outline Threshold", Range(0,1)) = 0.25
20+
[HideInInspector] _OutlineSmoothness("Outline Smoothness", Range(0,1)) = 1.0
21+
[HideInInspector][MaterialToggle(_USE8NEIGHBOURHOOD_ON)] _Use8Neighbourhood("Sample 8 Neighbours", Float) = 1
22+
[HideInInspector] _OutlineOpaqueAlpha("Opaque Alpha", Range(0,1)) = 1.0
23+
[HideInInspector] _OutlineMipLevel("Outline Mip Level", Range(0,3)) = 0
24+
}
25+
26+
HLSLINCLUDE
27+
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
28+
ENDHLSL
29+
30+
SubShader {
31+
// UniversalPipeline tag is required. If Universal render pipeline is not set in the graphics settings
32+
// this Subshader will fail.
33+
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" "IgnoreProjector" = "True" }
34+
Cull Off
35+
ZWrite Off
36+
37+
Stencil {
38+
Ref[_StencilRef]
39+
Comp[_StencilComp]
40+
Pass Keep
41+
}
42+
43+
Pass {
44+
ZWrite Off
45+
Cull Off
46+
Blend One OneMinusSrcAlpha
47+
48+
Name "Outline"
49+
Tags { "LightMode" = "SRPDefaultUnlit" "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
50+
HLSLPROGRAM
51+
// Required to compile gles 2.0 with standard srp library
52+
#pragma prefer_hlslcc gles
53+
#pragma exclude_renderers d3d11_9x
54+
55+
//--------------------------------------
56+
// GPU Instancing
57+
#pragma multi_compile_instancing
58+
59+
#pragma vertex vertOutline
60+
#pragma fragment fragOutline
61+
#pragma shader_feature _ _USE8NEIGHBOURHOOD_ON
62+
#pragma shader_feature _ _USE_SCREENSPACE_OUTLINE_WIDTH
63+
#pragma shader_feature _ _OUTLINE_FILL_INSIDE
64+
65+
#pragma fragmentoption ARB_precision_hint_fastest
66+
#pragma multi_compile_local _ PIXELSNAP_ON
67+
68+
#define USE_URP
69+
#define fixed4 half4
70+
#define fixed3 half3
71+
#define fixed half
72+
#define NO_CUTOFF_PARAM
73+
#include "../../Include/Spine-Input-Outline-URP.hlsl"
74+
#include "../../Include/Spine-Outline-Pass-URP.hlsl"
75+
ENDHLSL
76+
}
77+
78+
UsePass "Universal Render Pipeline/2D/Spine/Skeleton Lit/UNIVERSAL2D"
79+
80+
UsePass "Universal Render Pipeline/2D/Spine/Skeleton Lit/NORMALS"
81+
82+
UsePass "Universal Render Pipeline/2D/Spine/Skeleton Lit/UNLIT"
83+
}
84+
FallBack "Universal Render Pipeline/2D/Spine/Skeleton"
85+
CustomEditor "SpineShaderWithOutlineGUI"
86+
}

spine-unity/Modules/com.esotericsoftware.spine.urp-shaders/Shaders/2D/Outline/Spine-SkeletonLit-Outline-URP-2D.shader.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)