mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[unity] Fixed Spine/Sprite core shaders now correctly drawing Additive Slots. Closes #1853.
This commit is contained in:
parent
c5c71747c3
commit
47e357aa88
@ -109,16 +109,11 @@ sampler2D _MainTex;
|
|||||||
fixed4 frag (VertexOutput i) : SV_Target {
|
fixed4 frag (VertexOutput i) : SV_Target {
|
||||||
fixed4 tex = tex2D(_MainTex, i.uv0);
|
fixed4 tex = tex2D(_MainTex, i.uv0);
|
||||||
ALPHA_CLIP(tex, i.color);
|
ALPHA_CLIP(tex, i.color);
|
||||||
|
#if defined(_STRAIGHT_ALPHA_INPUT)
|
||||||
fixed4 col;
|
tex.rgb *= tex.a;
|
||||||
#if defined(_STRAIGHT_ALPHA_INPUT)
|
#endif
|
||||||
col.rgb = tex * i.color * tex.a;
|
fixed4 col = tex * i.color;
|
||||||
#else
|
col.rgb *= 2;
|
||||||
col.rgb = tex * i.color;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
col *= 2;
|
|
||||||
col.a = tex.a * i.color.a;
|
|
||||||
return col;
|
return col;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -240,6 +240,20 @@ uniform fixed _Cutoff;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
////////////////////////////////////////
|
||||||
|
// Additive Slot blend mode
|
||||||
|
// return unlit textureColor, alpha clip textureColor.a only
|
||||||
|
//
|
||||||
|
#if defined(_ALPHAPREMULTIPLY_ON)
|
||||||
|
#define RETURN_UNLIT_IF_ADDITIVE_SLOT(textureColor, vertexColor) \
|
||||||
|
if (vertexColor.a == 0 && (vertexColor.r || vertexColor.g || vertexColor.b)) {\
|
||||||
|
ALPHA_CLIP(texureColor, fixed4(1, 1, 1, 1))\
|
||||||
|
return texureColor * vertexColor;\
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define RETURN_UNLIT_IF_ADDITIVE_SLOT(textureColor, vertexColor)
|
||||||
|
#endif
|
||||||
|
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
// Color functions
|
// Color functions
|
||||||
//
|
//
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#ifndef SPRITE_PIXEL_LIGHTING_INCLUDED
|
#ifndef SPRITE_PIXEL_LIGHTING_INCLUDED
|
||||||
#define SPRITE_PIXEL_LIGHTING_INCLUDED
|
#define SPRITE_PIXEL_LIGHTING_INCLUDED
|
||||||
|
|
||||||
#include "ShaderShared.cginc"
|
#include "ShaderShared.cginc"
|
||||||
#include "SpriteLighting.cginc"
|
#include "SpriteLighting.cginc"
|
||||||
#include "SpriteSpecular.cginc"
|
#include "SpriteSpecular.cginc"
|
||||||
@ -24,24 +24,24 @@
|
|||||||
#define _LIGHT_COORD_INDEX_0 4
|
#define _LIGHT_COORD_INDEX_0 4
|
||||||
#define _LIGHT_COORD_INDEX_1 5
|
#define _LIGHT_COORD_INDEX_1 5
|
||||||
#define _FOG_COORD_INDEX 6
|
#define _FOG_COORD_INDEX 6
|
||||||
#endif // _NORMALMAP
|
#endif // _NORMALMAP
|
||||||
|
|
||||||
struct VertexOutput
|
struct VertexOutput
|
||||||
{
|
{
|
||||||
float4 pos : SV_POSITION;
|
float4 pos : SV_POSITION;
|
||||||
fixed4 color : COLOR;
|
fixed4 color : COLOR;
|
||||||
float2 texcoord : TEXCOORD0;
|
float2 texcoord : TEXCOORD0;
|
||||||
float4 posWorld : TEXCOORD1;
|
float4 posWorld : TEXCOORD1;
|
||||||
half3 normalWorld : TEXCOORD2;
|
half3 normalWorld : TEXCOORD2;
|
||||||
#if defined(_NORMALMAP)
|
#if defined(_NORMALMAP)
|
||||||
half3 tangentWorld : TEXCOORD3;
|
half3 tangentWorld : TEXCOORD3;
|
||||||
half3 binormalWorld : TEXCOORD4;
|
half3 binormalWorld : TEXCOORD4;
|
||||||
#endif // _NORMALMAP
|
#endif // _NORMALMAP
|
||||||
fixed3 vertexLighting : _VERTEX_LIGHTING_INDEX;
|
fixed3 vertexLighting : _VERTEX_LIGHTING_INDEX;
|
||||||
LIGHTING_COORDS(_LIGHT_COORD_INDEX_0, _LIGHT_COORD_INDEX_1)
|
LIGHTING_COORDS(_LIGHT_COORD_INDEX_0, _LIGHT_COORD_INDEX_1)
|
||||||
#if defined(_FOG)
|
#if defined(_FOG)
|
||||||
UNITY_FOG_COORDS(_FOG_COORD_INDEX)
|
UNITY_FOG_COORDS(_FOG_COORD_INDEX)
|
||||||
#endif // _FOG
|
#endif // _FOG
|
||||||
|
|
||||||
UNITY_VERTEX_OUTPUT_STEREO
|
UNITY_VERTEX_OUTPUT_STEREO
|
||||||
};
|
};
|
||||||
@ -56,16 +56,16 @@ inline fixed3 calculateLightDiffuse(VertexOutput input, float3 normalWorld, inou
|
|||||||
{
|
{
|
||||||
//For directional lights _WorldSpaceLightPos0.w is set to zero
|
//For directional lights _WorldSpaceLightPos0.w is set to zero
|
||||||
float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
|
float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
|
||||||
|
|
||||||
float attenuation = LIGHT_ATTENUATION(input);
|
float attenuation = LIGHT_ATTENUATION(input);
|
||||||
float angleDot = max(0, dot(normalWorld, lightWorldDirection));
|
float angleDot = max(0, dot(normalWorld, lightWorldDirection));
|
||||||
|
|
||||||
#if defined(_DIFFUSE_RAMP)
|
#if defined(_DIFFUSE_RAMP)
|
||||||
fixed3 lightDiffuse = calculateRampedDiffuse(_LightColor0.rgb, attenuation, angleDot);
|
fixed3 lightDiffuse = calculateRampedDiffuse(_LightColor0.rgb, attenuation, angleDot);
|
||||||
#else
|
#else
|
||||||
fixed3 lightDiffuse = _LightColor0.rgb * (attenuation * angleDot);
|
fixed3 lightDiffuse = _LightColor0.rgb * (attenuation * angleDot);
|
||||||
#endif // _DIFFUSE_RAMP
|
#endif // _DIFFUSE_RAMP
|
||||||
|
|
||||||
return lightDiffuse;
|
return lightDiffuse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ fixed3 calculateAmbientLight(half3 normalWorld)
|
|||||||
{
|
{
|
||||||
#if defined(_SPHERICAL_HARMONICS)
|
#if defined(_SPHERICAL_HARMONICS)
|
||||||
fixed3 ambient = ShadeSH9(half4(normalWorld, 1.0));
|
fixed3 ambient = ShadeSH9(half4(normalWorld, 1.0));
|
||||||
#else
|
#else
|
||||||
fixed3 ambient = unity_AmbientSky.rgb;
|
fixed3 ambient = unity_AmbientSky.rgb;
|
||||||
#endif
|
#endif
|
||||||
return ambient;
|
return ambient;
|
||||||
@ -129,124 +129,124 @@ fixed4 calculateSpecularLightAdditive(SpecularCommonData s, float3 viewDir, floa
|
|||||||
VertexOutput vert(VertexInput v)
|
VertexOutput vert(VertexInput v)
|
||||||
{
|
{
|
||||||
VertexOutput output;
|
VertexOutput output;
|
||||||
|
|
||||||
UNITY_SETUP_INSTANCE_ID(input);
|
UNITY_SETUP_INSTANCE_ID(input);
|
||||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
||||||
|
|
||||||
output.pos = calculateLocalPos(v.vertex);
|
output.pos = calculateLocalPos(v.vertex);
|
||||||
output.color = calculateVertexColor(v.color);
|
output.color = calculateVertexColor(v.color);
|
||||||
output.texcoord = calculateTextureCoord(v.texcoord);
|
output.texcoord = calculateTextureCoord(v.texcoord);
|
||||||
output.posWorld = calculateWorldPos(v.vertex);
|
output.posWorld = calculateWorldPos(v.vertex);
|
||||||
|
|
||||||
float backFaceSign = 1;
|
float backFaceSign = 1;
|
||||||
#if defined(FIXED_NORMALS_BACKFACE_RENDERING)
|
#if defined(FIXED_NORMALS_BACKFACE_RENDERING)
|
||||||
backFaceSign = calculateBackfacingSign(output.posWorld.xyz);
|
backFaceSign = calculateBackfacingSign(output.posWorld.xyz);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
output.normalWorld = calculateSpriteWorldNormal(v, backFaceSign);
|
output.normalWorld = calculateSpriteWorldNormal(v, backFaceSign);
|
||||||
output.vertexLighting = calculateVertexLighting(output.posWorld, output.normalWorld);
|
output.vertexLighting = calculateVertexLighting(output.posWorld, output.normalWorld);
|
||||||
|
|
||||||
#if defined(_NORMALMAP)
|
#if defined(_NORMALMAP)
|
||||||
output.tangentWorld = calculateWorldTangent(v.tangent);
|
output.tangentWorld = calculateWorldTangent(v.tangent);
|
||||||
output.binormalWorld = calculateSpriteWorldBinormal(v, output.normalWorld, output.tangentWorld, backFaceSign);
|
output.binormalWorld = calculateSpriteWorldBinormal(v, output.normalWorld, output.tangentWorld, backFaceSign);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRANSFER_VERTEX_TO_FRAGMENT(output)
|
TRANSFER_VERTEX_TO_FRAGMENT(output)
|
||||||
|
|
||||||
#if defined(_FOG)
|
#if defined(_FOG)
|
||||||
UNITY_TRANSFER_FOG(output,output.pos);
|
UNITY_TRANSFER_FOG(output,output.pos);
|
||||||
#endif // _FOG
|
#endif // _FOG
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
// Fragment programs
|
// Fragment programs
|
||||||
//
|
//
|
||||||
|
|
||||||
fixed4 fragBase(VertexOutput input) : SV_Target
|
fixed4 fragBase(VertexOutput input) : SV_Target
|
||||||
{
|
{
|
||||||
fixed4 texureColor = calculateTexturePixel(input.texcoord);
|
fixed4 texureColor = calculateTexturePixel(input.texcoord);
|
||||||
|
RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.color) // shall be called before ALPHA_CLIP
|
||||||
ALPHA_CLIP(texureColor, input.color)
|
ALPHA_CLIP(texureColor, input.color)
|
||||||
|
|
||||||
//Get normal direction
|
//Get normal direction
|
||||||
fixed3 normalWorld = calculateNormalWorld(input);
|
fixed3 normalWorld = calculateNormalWorld(input);
|
||||||
|
|
||||||
//Get Ambient diffuse
|
//Get Ambient diffuse
|
||||||
fixed3 ambient = calculateAmbientLight(normalWorld);
|
fixed3 ambient = calculateAmbientLight(normalWorld);
|
||||||
|
|
||||||
|
|
||||||
#if defined(SPECULAR)
|
#if defined(SPECULAR)
|
||||||
|
|
||||||
//For directional lights _WorldSpaceLightPos0.w is set to zero
|
//For directional lights _WorldSpaceLightPos0.w is set to zero
|
||||||
float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
|
float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
|
||||||
float attenuation = LIGHT_ATTENUATION(input);
|
float attenuation = LIGHT_ATTENUATION(input);
|
||||||
|
|
||||||
//Returns pixel lit by light, texture color should inlcluded alpha
|
//Returns pixel lit by light, texture color should inlcluded alpha
|
||||||
half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz);
|
half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz);
|
||||||
fixed4 pixel = calculateSpecularLight(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation, ambient + input.vertexLighting);
|
fixed4 pixel = calculateSpecularLight(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation, ambient + input.vertexLighting);
|
||||||
|
|
||||||
APPLY_EMISSION_SPECULAR(pixel, input.texcoord)
|
APPLY_EMISSION_SPECULAR(pixel, input.texcoord)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
//Get primary pixel light diffuse
|
//Get primary pixel light diffuse
|
||||||
fixed3 diffuse = calculateLightDiffuse(input, normalWorld, texureColor);
|
fixed3 diffuse = calculateLightDiffuse(input, normalWorld, texureColor);
|
||||||
|
|
||||||
//Combine along with vertex lighting for the base lighting pass
|
//Combine along with vertex lighting for the base lighting pass
|
||||||
fixed3 lighting = ambient + diffuse + input.vertexLighting;
|
fixed3 lighting = ambient + diffuse + input.vertexLighting;
|
||||||
|
|
||||||
APPLY_EMISSION(lighting, input.texcoord)
|
APPLY_EMISSION(lighting, input.texcoord)
|
||||||
|
|
||||||
fixed4 pixel = calculateLitPixel(texureColor, input.color, lighting);
|
fixed4 pixel = calculateLitPixel(texureColor, input.color, lighting);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_RIM_LIGHTING)
|
#if defined(_RIM_LIGHTING)
|
||||||
pixel.rgb = applyRimLighting(input.posWorld, normalWorld, pixel);
|
pixel.rgb = applyRimLighting(input.posWorld, normalWorld, pixel);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
COLORISE(pixel)
|
COLORISE(pixel)
|
||||||
APPLY_FOG(pixel, input)
|
APPLY_FOG(pixel, input)
|
||||||
|
|
||||||
return pixel;
|
return pixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
fixed4 fragAdd(VertexOutput input) : SV_Target
|
fixed4 fragAdd(VertexOutput input) : SV_Target
|
||||||
{
|
{
|
||||||
fixed4 texureColor = calculateTexturePixel(input.texcoord);
|
fixed4 texureColor = calculateTexturePixel(input.texcoord);
|
||||||
|
|
||||||
#if defined(_COLOR_ADJUST)
|
#if defined(_COLOR_ADJUST)
|
||||||
texureColor = adjustColor(texureColor);
|
texureColor = adjustColor(texureColor);
|
||||||
#endif // _COLOR_ADJUST
|
#endif // _COLOR_ADJUST
|
||||||
|
|
||||||
ALPHA_CLIP(texureColor, input.color)
|
ALPHA_CLIP(texureColor, input.color)
|
||||||
|
|
||||||
//Get normal direction
|
//Get normal direction
|
||||||
fixed3 normalWorld = calculateNormalWorld(input);
|
fixed3 normalWorld = calculateNormalWorld(input);
|
||||||
|
|
||||||
#if defined(SPECULAR)
|
#if defined(SPECULAR)
|
||||||
|
|
||||||
//For directional lights _WorldSpaceLightPos0.w is set to zero
|
//For directional lights _WorldSpaceLightPos0.w is set to zero
|
||||||
float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
|
float3 lightWorldDirection = normalize(_WorldSpaceLightPos0.xyz - input.posWorld.xyz * _WorldSpaceLightPos0.w);
|
||||||
float attenuation = LIGHT_ATTENUATION(input);
|
float attenuation = LIGHT_ATTENUATION(input);
|
||||||
|
|
||||||
half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz);
|
half3 viewDir = normalize(_WorldSpaceCameraPos - input.posWorld.xyz);
|
||||||
fixed4 pixel = calculateSpecularLightAdditive(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation);
|
fixed4 pixel = calculateSpecularLightAdditive(getSpecularData(input.texcoord.xy, texureColor, input.color), viewDir, normalWorld, lightWorldDirection, _LightColor0.rgb * attenuation);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
//Get light diffuse
|
//Get light diffuse
|
||||||
fixed3 lighting = calculateLightDiffuse(input, normalWorld, texureColor);
|
fixed3 lighting = calculateLightDiffuse(input, normalWorld, texureColor);
|
||||||
fixed4 pixel = calculateAdditiveLitPixel(texureColor, input.color, lighting);
|
fixed4 pixel = calculateAdditiveLitPixel(texureColor, input.color, lighting);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
COLORISE_ADDITIVE(pixel)
|
COLORISE_ADDITIVE(pixel)
|
||||||
APPLY_FOG_ADDITIVE(pixel, input)
|
APPLY_FOG_ADDITIVE(pixel, input)
|
||||||
|
|
||||||
return pixel;
|
return pixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif // SPRITE_PIXEL_LIGHTING_INCLUDED
|
#endif // SPRITE_PIXEL_LIGHTING_INCLUDED
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
// Vertex structs
|
// Vertex structs
|
||||||
//
|
//
|
||||||
|
|
||||||
struct VertexInput
|
struct VertexInput
|
||||||
{
|
{
|
||||||
float4 vertex : POSITION;
|
float4 vertex : POSITION;
|
||||||
@ -22,7 +22,7 @@ struct VertexOutput
|
|||||||
fixed4 color : COLOR;
|
fixed4 color : COLOR;
|
||||||
#if defined(_FOG)
|
#if defined(_FOG)
|
||||||
UNITY_FOG_COORDS(1)
|
UNITY_FOG_COORDS(1)
|
||||||
#endif // _FOG
|
#endif // _FOG
|
||||||
|
|
||||||
UNITY_VERTEX_OUTPUT_STEREO
|
UNITY_VERTEX_OUTPUT_STEREO
|
||||||
};
|
};
|
||||||
@ -34,39 +34,35 @@ struct VertexOutput
|
|||||||
VertexOutput vert(VertexInput input)
|
VertexOutput vert(VertexInput input)
|
||||||
{
|
{
|
||||||
VertexOutput output;
|
VertexOutput output;
|
||||||
|
|
||||||
UNITY_SETUP_INSTANCE_ID(input);
|
UNITY_SETUP_INSTANCE_ID(input);
|
||||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
|
||||||
|
|
||||||
output.pos = calculateLocalPos(input.vertex);
|
output.pos = calculateLocalPos(input.vertex);
|
||||||
output.texcoord = calculateTextureCoord(input.texcoord);
|
output.texcoord = calculateTextureCoord(input.texcoord);
|
||||||
output.color = calculateVertexColor(input.color);
|
output.color = calculateVertexColor(input.color);
|
||||||
|
|
||||||
#if defined(_FOG)
|
#if defined(_FOG)
|
||||||
UNITY_TRANSFER_FOG(output,output.pos);
|
UNITY_TRANSFER_FOG(output,output.pos);
|
||||||
#endif // _FOG
|
#endif // _FOG
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
// Fragment program
|
// Fragment program
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fixed4 frag(VertexOutput input) : SV_Target
|
fixed4 frag(VertexOutput input) : SV_Target
|
||||||
{
|
{
|
||||||
fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
|
fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
|
||||||
|
RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.color) // shall be called before ALPHA_CLIP
|
||||||
ALPHA_CLIP(texureColor, input.color)
|
ALPHA_CLIP(texureColor, input.color)
|
||||||
|
|
||||||
fixed4 pixel = calculatePixel(texureColor, input.color);
|
fixed4 pixel = calculatePixel(texureColor, input.color);
|
||||||
|
|
||||||
COLORISE(pixel)
|
COLORISE(pixel)
|
||||||
APPLY_FOG(pixel, input)
|
APPLY_FOG(pixel, input)
|
||||||
|
|
||||||
return pixel;
|
return pixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // SPRITE_UNLIT_INCLUDED
|
#endif // SPRITE_UNLIT_INCLUDED
|
||||||
|
|||||||
@ -399,10 +399,10 @@ VertexOutput vert(VertexInput input)
|
|||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
// Fragment program
|
// Fragment program
|
||||||
//
|
//
|
||||||
|
|
||||||
fixed4 frag(VertexOutput input) : SV_Target
|
fixed4 frag(VertexOutput input) : SV_Target
|
||||||
{
|
{
|
||||||
fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
|
fixed4 texureColor = calculateTexturePixel(input.texcoord.xy);
|
||||||
|
RETURN_UNLIT_IF_ADDITIVE_SLOT(texureColor, input.color) // shall be called before ALPHA_CLIP
|
||||||
ALPHA_CLIP(texureColor, input.color)
|
ALPHA_CLIP(texureColor, input.color)
|
||||||
|
|
||||||
#if defined(PER_PIXEL_LIGHTING)
|
#if defined(PER_PIXEL_LIGHTING)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user