Ver Fonte

[unity] Added shader variant `Spine/Skeleton Lit ZWrite` and moved common functionality to cginc files. Cleanup of `Skeleton Lit` shader.

Harald Csaszar há 6 anos atrás
pai
commit
44f2fa9c69

+ 2 - 1
spine-unity/Assets/Spine/Editor/spine-unity/Editor/Shaders/SpineSpriteShaderGUI.cs

@@ -183,7 +183,8 @@ public class SpineSpriteShaderGUI : ShaderGUI {
 		base.AssignNewShaderToMaterial(material, oldShader, newShader);
 
 		//If not originally a sprite shader set default keywords
-		if (oldShader.name != kShaderVertexLit && oldShader.name != kShaderPixelLit && oldShader.name != kShaderUnlit) {
+		if (oldShader.name != kShaderVertexLit && oldShader.name != kShaderPixelLit && oldShader.name != kShaderUnlit &&
+			oldShader.name != kShaderLitLW) {
 			SetDefaultSpriteKeywords(material, newShader);
 		}
 

+ 9 - 0
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 511f90ee1fe01c146836d5ed23f2e70f
+folderAsset: yes
+timeCreated: 1564083752
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 30 - 0
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Lit-Common-Shadow.cginc

@@ -0,0 +1,30 @@
+#ifndef SKELETON_LIT_COMMON_SHADOW_INCLUDED
+#define SKELETON_LIT_COMMON_SHADOW_INCLUDED
+
+#include "UnityCG.cginc"
+struct v2f { 
+	V2F_SHADOW_CASTER;
+	float4 uvAndAlpha : TEXCOORD1;
+};
+
+uniform float4 _MainTex_ST;
+
+v2f vertShadow(appdata_base v, float4 vertexColor : COLOR) {
+	v2f o;
+	TRANSFER_SHADOW_CASTER(o)
+	o.uvAndAlpha.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
+	o.uvAndAlpha.z = 0;
+	o.uvAndAlpha.a = vertexColor.a;
+	return o;
+}
+
+uniform sampler2D _MainTex;
+uniform fixed SHADOW_CUTOFF;
+
+float4 fragShadow (v2f i) : SV_Target {
+	fixed4 texcol = tex2D(_MainTex, i.uvAndAlpha.xy);
+	clip(texcol.a * i.uvAndAlpha.a - SHADOW_CUTOFF);
+	SHADOW_CASTER_FRAGMENT(i)
+}
+
+#endif

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

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: c7297b25c81d2494e8e73b742e3c7345
+timeCreated: 1564083752
+licenseType: Free
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 120 - 0
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/CGIncludes/Spine-Skeleton-Lit-Common.cginc

@@ -0,0 +1,120 @@
+#ifndef SKELETON_LIT_COMMON_INCLUDED
+#define SKELETON_LIT_COMMON_INCLUDED
+
+#include "UnityCG.cginc"
+
+// ES2.0/WebGL/3DS can not do loops with non-constant-expression iteration counts :(
+#if defined(SHADER_API_GLES)
+#define LIGHT_LOOP_LIMIT 8
+#elif defined(SHADER_API_N3DS)
+#define LIGHT_LOOP_LIMIT 4
+#else
+#define LIGHT_LOOP_LIMIT unity_VertexLightParams.x
+#endif
+
+#pragma multi_compile __ POINT SPOT
+
+////////////////////////////////////////
+// Alpha Clipping
+//
+
+#if defined(_ALPHA_CLIP) 
+	uniform fixed _Cutoff;
+	#define ALPHA_CLIP(pixel, color) clip((pixel.a * color.a) - _Cutoff);
+#else
+	#define ALPHA_CLIP(pixel, color)
+#endif	
+			
+half3 computeLighting (int idx, half3 dirToLight, half3 eyeNormal, half4 diffuseColor, half atten) {
+	half NdotL = max(dot(eyeNormal, dirToLight), 0.0);
+	// diffuse
+	half3 color = NdotL * diffuseColor.rgb * unity_LightColor[idx].rgb;
+	return color * atten;
+}
+
+half3 computeOneLight (int idx, float3 eyePosition, half3 eyeNormal, half4 diffuseColor) {
+	float3 dirToLight = unity_LightPosition[idx].xyz;
+	half att = 1.0;
+
+	#if defined(POINT) || defined(SPOT)
+	dirToLight -= eyePosition * unity_LightPosition[idx].w;
+
+	// distance attenuation
+	float distSqr = dot(dirToLight, dirToLight);
+	att /= (1.0 + unity_LightAtten[idx].z * distSqr);
+	if (unity_LightPosition[idx].w != 0 && distSqr > unity_LightAtten[idx].w) att = 0.0; // set to 0 if outside of range
+	distSqr = max(distSqr, 0.000001); // don't produce NaNs if some vertex position overlaps with the light
+	dirToLight *= rsqrt(distSqr);
+	#if defined(SPOT)
+
+	// spot angle attenuation
+	half rho = max(dot(dirToLight, unity_SpotDirection[idx].xyz), 0.0);
+	half spotAtt = (rho - unity_LightAtten[idx].x) * unity_LightAtten[idx].y;
+	att *= saturate(spotAtt);
+	#endif
+	#endif
+
+	att *= 0.5; // passed in light colors are 2x brighter than what used to be in FFP
+	return min (computeLighting (idx, dirToLight, eyeNormal, diffuseColor, att), 1.0);
+}
+
+int4 unity_VertexLightParams; // x: light count, y: zero, z: one (y/z needed by d3d9 vs loop instruction)
+
+struct appdata {
+	float3 pos : POSITION;
+	float3 normal : NORMAL;
+	half4 color : COLOR;
+	float2 uv0 : TEXCOORD0;
+	UNITY_VERTEX_INPUT_INSTANCE_ID
+};
+
+struct VertexOutput {
+	fixed4 color : COLOR0;
+	float2 uv0 : TEXCOORD0;
+	float4 pos : SV_POSITION;
+	UNITY_VERTEX_OUTPUT_STEREO
+};
+
+VertexOutput vert (appdata v) {
+	VertexOutput o;
+	UNITY_SETUP_INSTANCE_ID(v);
+	UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
+
+	half4 color = v.color;
+	float3 eyePos = UnityObjectToViewPos(float4(v.pos, 1)).xyz; //mul(UNITY_MATRIX_MV, float4(v.pos,1)).xyz;
+	half3 fixedNormal = half3(0,0,-1);
+	half3 eyeNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, fixedNormal));
+	//half3 eyeNormal = half3(0,0,1);
+
+	// Lights
+	half3 lcolor = half4(0,0,0,1).rgb + color.rgb * glstate_lightmodel_ambient.rgb;
+	for (int il = 0; il < LIGHT_LOOP_LIMIT; ++il) {
+		lcolor += computeOneLight(il, eyePos, eyeNormal, color);
+	}
+
+	color.rgb = lcolor.rgb;
+	o.color = saturate(color);
+	o.uv0 = v.uv0;
+	o.pos = UnityObjectToClipPos(v.pos);
+	return o;
+}
+
+sampler2D _MainTex;
+
+fixed4 frag (VertexOutput i) : SV_Target {
+	fixed4 tex = tex2D(_MainTex, i.uv0);
+	ALPHA_CLIP(tex, i.color);
+
+	fixed4 col;
+	#if defined(_STRAIGHT_ALPHA_INPUT)
+	col.rgb = tex * i.color * tex.a;
+	#else
+	col.rgb = tex * i.color;
+	#endif
+				
+	col *= 2;
+	col.a = tex.a * i.color.a;
+	return col;
+}
+
+#endif

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

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 70c77c02aabd5e44f94aab48dd0be7b2
+timeCreated: 1564083752
+licenseType: Free
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 67 - 0
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-Lit-ZWrite.shader

@@ -0,0 +1,67 @@
+// - Vertex Lit + ShadowCaster
+// - Premultiplied Alpha Blending (Optional straight alpha input)
+// - Double-sided, ZWrite
+
+Shader "Spine/Skeleton Lit ZWrite" {
+	Properties {
+		_Cutoff ("Depth alpha cutoff", Range(0,1)) = 0.1
+		_ShadowAlphaCutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1
+		[NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {}
+		[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
+		[HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
+		[HideInInspector] [HideInInspector, Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 // Set to Always as default
+	}
+
+	SubShader {
+		Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
+		LOD 100
+
+		Stencil {
+			Ref[_StencilRef]
+			Comp[_StencilComp]
+			Pass Keep
+		}
+
+		Pass {
+			Tags { "LightMode"="Vertex" "Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent" }
+
+			ZWrite On
+			Cull Off
+			Blend One OneMinusSrcAlpha
+
+			CGPROGRAM
+			#pragma shader_feature _ _STRAIGHT_ALPHA_INPUT
+			#pragma vertex vert
+			#pragma fragment frag
+			#pragma target 2.0
+
+			#define _ALPHA_CLIP
+			#include "CGIncludes/Spine-Skeleton-Lit-Common.cginc"
+			ENDCG
+
+	 	}
+
+		Pass {
+			Name "Caster"
+			Tags { "LightMode"="ShadowCaster" }
+			Offset 1, 1
+			
+			Fog { Mode Off }
+			ZWrite On
+			ZTest LEqual
+			Cull Off
+			Lighting Off
+
+			CGPROGRAM
+			#pragma vertex vertShadow
+			#pragma fragment fragShadow
+			#pragma multi_compile_shadowcaster
+			#pragma fragmentoption ARB_precision_hint_fastest
+			
+			#define SHADOW_CUTOFF _ShadowAlphaCutoff
+			#include "CGIncludes/Spine-Skeleton-Lit-Common-Shadow.cginc"
+
+			ENDCG
+		}
+	}
+}

+ 9 - 0
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton-Lit-ZWrite.shader.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: fde05abf1f7be4b4da1caf8c8de1823a
+timeCreated: 1564082883
+licenseType: Free
+ShaderImporter:
+  defaultTextures: []
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 150
spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-SkeletonLit.shader

@@ -1,4 +1,4 @@
-// - Vertex Lit + ShadowCaster
+// - Vertex Lit + ShadowCaster
 // - Premultiplied Alpha Blending (Optional straight alpha input)
 // - Double-sided, no depth
 
@@ -8,39 +8,21 @@ Shader "Spine/Skeleton Lit" {
 		[NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {}
 		[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
 		[HideInInspector] _StencilRef("Stencil Reference", Float) = 1.0
-		[Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 // Set to Always as default
+		[HideInInspector] [Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp("Stencil Comparison", Float) = 8 // Set to Always as default
 	}
 
 	SubShader {
 		Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
 		LOD 100
 
-		Cull Off
-		ZWrite Off
-		Blend One OneMinusSrcAlpha
-		
 		Stencil {
 			Ref[_StencilRef]
 			Comp[_StencilComp]
 			Pass Keep
 		}
 
-//		Pass {
-//			Tags { "LightMode"="Vertex" }
-//			ColorMaterial AmbientAndDiffuse
-//			Lighting On
-//			SetTexture [_MainTex] {
-//				Combine texture * primary DOUBLE, texture * primary
-//			}
-//		}
-
 		Pass {
-			Tags {
-				"LIGHTMODE"="Vertex"
-				"QUEUE"="Transparent"
-				"IGNOREPROJECTOR"="true"
-				"RenderType"="Transparent"
-			}
+			Tags { "LightMode"="Vertex" "Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent" }
 
 			ZWrite Off
 			Cull Off
@@ -51,110 +33,8 @@ Shader "Spine/Skeleton Lit" {
 			#pragma vertex vert
 			#pragma fragment frag
 			#pragma target 2.0
-			#include "UnityCG.cginc"
-
-			// ES2.0/WebGL/3DS can not do loops with non-constant-expression iteration counts :(
-			#if defined(SHADER_API_GLES)
-			#define LIGHT_LOOP_LIMIT 8
-			#elif defined(SHADER_API_N3DS)
-			#define LIGHT_LOOP_LIMIT 4
-			#else
-			#define LIGHT_LOOP_LIMIT unity_VertexLightParams.x
-			#endif
-
-			#pragma multi_compile __ POINT SPOT
-
-			half3 computeLighting (int idx, half3 dirToLight, half3 eyeNormal, half4 diffuseColor, half atten) {
-				half NdotL = max(dot(eyeNormal, dirToLight), 0.0);
-				// diffuse
-				half3 color = NdotL * diffuseColor.rgb * unity_LightColor[idx].rgb;
-				return color * atten;
-			}
-
-			half3 computeOneLight (int idx, float3 eyePosition, half3 eyeNormal, half4 diffuseColor) {
-				float3 dirToLight = unity_LightPosition[idx].xyz;
-				half att = 1.0;
-
-				#if defined(POINT) || defined(SPOT)
-				dirToLight -= eyePosition * unity_LightPosition[idx].w;
-
-				// distance attenuation
-				float distSqr = dot(dirToLight, dirToLight);
-				att /= (1.0 + unity_LightAtten[idx].z * distSqr);
-				if (unity_LightPosition[idx].w != 0 && distSqr > unity_LightAtten[idx].w) att = 0.0; // set to 0 if outside of range
-				distSqr = max(distSqr, 0.000001); // don't produce NaNs if some vertex position overlaps with the light
-				dirToLight *= rsqrt(distSqr);
-				#if defined(SPOT)
-
-				// spot angle attenuation
-				half rho = max(dot(dirToLight, unity_SpotDirection[idx].xyz), 0.0);
-				half spotAtt = (rho - unity_LightAtten[idx].x) * unity_LightAtten[idx].y;
-				att *= saturate(spotAtt);
-				#endif
-				#endif
-
-				att *= 0.5; // passed in light colors are 2x brighter than what used to be in FFP
-				return min (computeLighting (idx, dirToLight, eyeNormal, diffuseColor, att), 1.0);
-			}
-
-			int4 unity_VertexLightParams; // x: light count, y: zero, z: one (y/z needed by d3d9 vs loop instruction)
-
-			struct appdata {
-				float3 pos : POSITION;
-				float3 normal : NORMAL;
-				half4 color : COLOR;
-				float2 uv0 : TEXCOORD0;
-				UNITY_VERTEX_INPUT_INSTANCE_ID
-			};
-
-			struct VertexOutput {
-				fixed4 color : COLOR0;
-				float2 uv0 : TEXCOORD0;
-				float4 pos : SV_POSITION;
-				UNITY_VERTEX_OUTPUT_STEREO
-			};
-
-			VertexOutput vert (appdata v) {
-				VertexOutput o;
-				UNITY_SETUP_INSTANCE_ID(v);
-				UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
 
-				half4 color = v.color;
-				float3 eyePos = UnityObjectToViewPos(float4(v.pos, 1)).xyz; //mul(UNITY_MATRIX_MV, float4(v.pos,1)).xyz;
-				half3 fixedNormal = half3(0,0,-1);
-				half3 eyeNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, fixedNormal));
-				//half3 eyeNormal = half3(0,0,1);
-
-				// Lights
-				half3 lcolor = half4(0,0,0,1).rgb + color.rgb * glstate_lightmodel_ambient.rgb;
-				for (int il = 0; il < LIGHT_LOOP_LIMIT; ++il) {
-					lcolor += computeOneLight(il, eyePos, eyeNormal, color);
-				}
-
-				color.rgb = lcolor.rgb;
-				o.color = saturate(color);
-				o.uv0 = v.uv0;
-				o.pos = UnityObjectToClipPos(v.pos);
-				return o;
-			}
-
-			sampler2D _MainTex;
-
-			fixed4 frag (VertexOutput i) : SV_Target {
-				fixed4 tex = tex2D(_MainTex, i.uv0);
-
-				fixed4 col;
-
-				#if defined(_STRAIGHT_ALPHA_INPUT)
-				col.rgb = tex * i.color * tex.a;
-				#else
-				col.rgb = tex * i.color;
-				#endif
-				
-				col *= 2;
-				col.a = tex.a * i.color.a;
-				return col;
-			}
+			#include "CGIncludes/Spine-Skeleton-Lit-Common.cginc"
 			ENDCG
 
 	 	}
@@ -171,35 +51,14 @@ Shader "Spine/Skeleton Lit" {
 			Lighting Off
 
 			CGPROGRAM
-			#pragma vertex vert
-			#pragma fragment frag
+			#pragma vertex vertShadow
+			#pragma fragment fragShadow
 			#pragma multi_compile_shadowcaster
 			#pragma fragmentoption ARB_precision_hint_fastest
-			#include "UnityCG.cginc"
-			struct v2f { 
-				V2F_SHADOW_CASTER;
-				float4 uvAndAlpha : TEXCOORD1;
-			};
-
-			uniform float4 _MainTex_ST;
-
-			v2f vert (appdata_base v, float4 vertexColor : COLOR) {
-				v2f o;
-				TRANSFER_SHADOW_CASTER(o)
-				o.uvAndAlpha.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
-				o.uvAndAlpha.z = 0;
-				o.uvAndAlpha.a = vertexColor.a;
-				return o;
-			}
-
-			uniform sampler2D _MainTex;
-			uniform fixed _Cutoff;
+			
+			#define SHADOW_CUTOFF _Cutoff
+			#include "CGIncludes/Spine-Skeleton-Lit-Common-Shadow.cginc"
 
-			float4 frag (v2f i) : SV_Target {
-				fixed4 texcol = tex2D(_MainTex, i.uvAndAlpha.xy);
-				clip(texcol.a * i.uvAndAlpha.a - _Cutoff);
-				SHADOW_CASTER_FRAGMENT(i)
-			}
 			ENDCG
 		}
 	}