У меня есть модель 2д героя из нескольких спрайтов, которая помещена в трехмерное окружение. Мне требуется чтобы герой принимал и отбрасывал тени, как полноценный трехмерный объект только плоский.
т.к. станадртными средствами тени на спрайтах не получить, то есть вот такой шэйдер:
Синтаксис:
Используется csharp
Shader "Custom/NewSurfaceShader" {
Properties {
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
Tags {
"Queue"="AlphaTest"
"RenderType"="TransparentCutout"
}
LOD 200
Zwrite On
CGPROGRAM
#pragma surface surf Lambert addshadow fullforwardshadows
sampler2D _MainTex;
fixed4 _Color;
fixed _Cutoff;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
clip(o.Alpha - _Cutoff);
}
ENDCG
}
FallBack "Diffuse"
}
Properties {
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Color", Color) = (1,1,1,1)
_Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
Tags {
"Queue"="AlphaTest"
"RenderType"="TransparentCutout"
}
LOD 200
Zwrite On
CGPROGRAM
#pragma surface surf Lambert addshadow fullforwardshadows
sampler2D _MainTex;
fixed4 _Color;
fixed _Cutoff;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
clip(o.Alpha - _Cutoff);
}
ENDCG
}
FallBack "Diffuse"
}
Теперь Спрайты принимают и отбрасывают тени как надо. Но появилась проблема в том, что модель героя сборная, и пока это обычный спрайт - неважно где он находится по отношению к другим спрайтам, их порядок отображения зависит только от order in layer. Однако после применения Zwrite On порядок теперь зависит от их положения, как у 3д объектов, что совершенно не подходит. Можно добавить Ztest Off и механика слоев снова вернется, но тогда спрайты отображаются поверх всех объектов и его невозможно перекрыть. Есть ли какой-нибудь выход из этой ситуации? Нужно чтобы спрайты принимали и отбрасывали тени как 3д объекты, а в остальном оставались спрайтами и подчинялись сортировке по слоям.
Заранее спасибо!