mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[unity] Added shader variant Spine/Skeleton Lit ZWrite and moved common functionality to cginc files. Cleanup of Skeleton Lit shader.
This commit is contained in:
parent
a5a749d4a8
commit
44f2fa9c69
@ -183,7 +183,8 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
|||||||
base.AssignNewShaderToMaterial(material, oldShader, newShader);
|
base.AssignNewShaderToMaterial(material, oldShader, newShader);
|
||||||
|
|
||||||
//If not originally a sprite shader set default keywords
|
//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);
|
SetDefaultSpriteKeywords(material, newShader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 511f90ee1fe01c146836d5ed23f2e70f
|
||||||
|
folderAsset: yes
|
||||||
|
timeCreated: 1564083752
|
||||||
|
licenseType: Free
|
||||||
|
DefaultImporter:
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -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
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c7297b25c81d2494e8e73b742e3c7345
|
||||||
|
timeCreated: 1564083752
|
||||||
|
licenseType: Free
|
||||||
|
ShaderImporter:
|
||||||
|
defaultTextures: []
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -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
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 70c77c02aabd5e44f94aab48dd0be7b2
|
||||||
|
timeCreated: 1564083752
|
||||||
|
licenseType: Free
|
||||||
|
ShaderImporter:
|
||||||
|
defaultTextures: []
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fde05abf1f7be4b4da1caf8c8de1823a
|
||||||
|
timeCreated: 1564082883
|
||||||
|
licenseType: Free
|
||||||
|
ShaderImporter:
|
||||||
|
defaultTextures: []
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// - Vertex Lit + ShadowCaster
|
// - Vertex Lit + ShadowCaster
|
||||||
// - Premultiplied Alpha Blending (Optional straight alpha input)
|
// - Premultiplied Alpha Blending (Optional straight alpha input)
|
||||||
// - Double-sided, no depth
|
// - Double-sided, no depth
|
||||||
|
|
||||||
@ -8,39 +8,21 @@ Shader "Spine/Skeleton Lit" {
|
|||||||
[NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {}
|
[NoScaleOffset] _MainTex ("Main Texture", 2D) = "black" {}
|
||||||
[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
|
[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
|
||||||
[HideInInspector] _StencilRef("Stencil Reference", Float) = 1.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 {
|
SubShader {
|
||||||
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
|
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
|
||||||
LOD 100
|
LOD 100
|
||||||
|
|
||||||
Cull Off
|
|
||||||
ZWrite Off
|
|
||||||
Blend One OneMinusSrcAlpha
|
|
||||||
|
|
||||||
Stencil {
|
Stencil {
|
||||||
Ref[_StencilRef]
|
Ref[_StencilRef]
|
||||||
Comp[_StencilComp]
|
Comp[_StencilComp]
|
||||||
Pass Keep
|
Pass Keep
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass {
|
|
||||||
// Tags { "LightMode"="Vertex" }
|
|
||||||
// ColorMaterial AmbientAndDiffuse
|
|
||||||
// Lighting On
|
|
||||||
// SetTexture [_MainTex] {
|
|
||||||
// Combine texture * primary DOUBLE, texture * primary
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
Pass {
|
Pass {
|
||||||
Tags {
|
Tags { "LightMode"="Vertex" "Queue"="Transparent" "IgnoreProjector"="true" "RenderType"="Transparent" }
|
||||||
"LIGHTMODE"="Vertex"
|
|
||||||
"QUEUE"="Transparent"
|
|
||||||
"IGNOREPROJECTOR"="true"
|
|
||||||
"RenderType"="Transparent"
|
|
||||||
}
|
|
||||||
|
|
||||||
ZWrite Off
|
ZWrite Off
|
||||||
Cull Off
|
Cull Off
|
||||||
@ -51,110 +33,8 @@ Shader "Spine/Skeleton Lit" {
|
|||||||
#pragma vertex vert
|
#pragma vertex vert
|
||||||
#pragma fragment frag
|
#pragma fragment frag
|
||||||
#pragma target 2.0
|
#pragma target 2.0
|
||||||
#include "UnityCG.cginc"
|
|
||||||
|
|
||||||
// ES2.0/WebGL/3DS can not do loops with non-constant-expression iteration counts :(
|
#include "CGIncludes/Spine-Skeleton-Lit-Common.cginc"
|
||||||
#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;
|
|
||||||
}
|
|
||||||
ENDCG
|
ENDCG
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -171,35 +51,14 @@ Shader "Spine/Skeleton Lit" {
|
|||||||
Lighting Off
|
Lighting Off
|
||||||
|
|
||||||
CGPROGRAM
|
CGPROGRAM
|
||||||
#pragma vertex vert
|
#pragma vertex vertShadow
|
||||||
#pragma fragment frag
|
#pragma fragment fragShadow
|
||||||
#pragma multi_compile_shadowcaster
|
#pragma multi_compile_shadowcaster
|
||||||
#pragma fragmentoption ARB_precision_hint_fastest
|
#pragma fragmentoption ARB_precision_hint_fastest
|
||||||
#include "UnityCG.cginc"
|
|
||||||
struct v2f {
|
#define SHADOW_CUTOFF _Cutoff
|
||||||
V2F_SHADOW_CASTER;
|
#include "CGIncludes/Spine-Skeleton-Lit-Common-Shadow.cginc"
|
||||||
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;
|
|
||||||
|
|
||||||
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
|
ENDCG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user