146 lines
No EOL
3.3 KiB
HLSL
146 lines
No EOL
3.3 KiB
HLSL
// Upgrade NOTE: upgraded instancing buffer 'InstanceProperties' to new syntax.
|
|
|
|
#if !defined(MY_SHADOWS_INCLUDED)
|
|
#define MY_SHADOWS_INCLUDED
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
#if defined(_RENDERING_FADE) || defined(_RENDERING_TRANSPARENT)
|
|
#if defined(_SEMITRANSPARENT_SHADOWS)
|
|
#define SHADOWS_SEMITRANSPARENT 1
|
|
#else
|
|
#define _RENDERING_CUTOUT
|
|
#endif
|
|
#endif
|
|
|
|
#if SHADOWS_SEMITRANSPARENT || defined(_RENDERING_CUTOUT)
|
|
#if !defined(_SMOOTHNESS_ALBEDO)
|
|
#define SHADOWS_NEED_UV 1
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(_PARALLAX_MAP) && defined(VERTEX_DISPLACEMENT_INSTEAD_OF_PARALLAX)
|
|
#undef _PARALLAX_MAP
|
|
#define VERTEX_DISPLACEMENT 1
|
|
#if !defined(SHADOWS_NEED_UV)
|
|
#define SHADOWS_NEED_UV 1
|
|
#endif
|
|
#endif
|
|
|
|
UNITY_INSTANCING_BUFFER_START(InstanceProperties)
|
|
UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
|
|
#define _Color_arr InstanceProperties
|
|
UNITY_INSTANCING_BUFFER_END(InstanceProperties)
|
|
|
|
sampler2D _MainTex;
|
|
float4 _MainTex_ST;
|
|
float _Cutoff;
|
|
|
|
sampler2D _DisplacementMap;
|
|
float _DisplacementStrength;
|
|
|
|
float _FresnelClip;
|
|
float _FresnelClipPower;
|
|
float _FresnelClipOffset;
|
|
float _AlphaClip;
|
|
float _AlphaRange;
|
|
float _AlphaRangeFeather;
|
|
float _AlphaRangeCenter;
|
|
|
|
sampler3D _DitherMaskLOD;
|
|
|
|
struct VertexData {
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
float4 vertex : POSITION;
|
|
float3 normal : NORMAL;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
struct InterpolatorsVertex {
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
float4 position : SV_POSITION;
|
|
#if SHADOWS_NEED_UV
|
|
float2 uv : TEXCOORD0;
|
|
#endif
|
|
#if defined(SHADOWS_CUBE)
|
|
float3 lightVec : TEXCOORD1;
|
|
#endif
|
|
};
|
|
|
|
struct Interpolators {
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
#if SHADOWS_SEMITRANSPARENT || defined(LOD_FADE_CROSSFADE)
|
|
UNITY_VPOS_TYPE vpos : VPOS;
|
|
#else
|
|
float4 position : SV_POSITION;
|
|
#endif
|
|
|
|
#if SHADOWS_NEED_UV
|
|
float2 uv : TEXCOORD0;
|
|
#endif
|
|
#if defined(SHADOWS_CUBE)
|
|
float3 lightVec : TEXCOORD1;
|
|
#endif
|
|
};
|
|
|
|
float GetAlpha (Interpolators i) {
|
|
float alpha = UNITY_ACCESS_INSTANCED_PROP(_Color_arr, _Color).a;
|
|
#if SHADOWS_NEED_UV
|
|
alpha *= tex2D(_MainTex, i.uv.xy).a;
|
|
#endif
|
|
return alpha;
|
|
}
|
|
|
|
#define MyVertexProgram MyShadowVertexProgram
|
|
|
|
InterpolatorsVertex MyShadowVertexProgram (VertexData v) {
|
|
InterpolatorsVertex i;
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, i);
|
|
|
|
#if SHADOWS_NEED_UV
|
|
i.uv = TRANSFORM_TEX(v.uv, _MainTex);
|
|
#endif
|
|
|
|
float displacement = tex2Dlod(_DisplacementMap, float4(v.uv.xy, 0, 0)).r * _DisplacementStrength;
|
|
v.normal = normalize(v.normal);
|
|
v.vertex.xyz += v.normal * displacement;
|
|
|
|
#if defined(SHADOWS_CUBE)
|
|
i.position = UnityObjectToClipPos(v.vertex);
|
|
i.lightVec =
|
|
mul(unity_ObjectToWorld, v.vertex).xyz - _LightPositionRange.xyz;
|
|
#else
|
|
i.position = UnityClipSpaceShadowCasterPos(v.vertex.xyz, v.normal);
|
|
i.position = UnityApplyLinearShadowBias(i.position);
|
|
#endif
|
|
return i;
|
|
}
|
|
|
|
float4 MyShadowFragmentProgram (Interpolators i) : SV_TARGET {
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
#if defined(LOD_FADE_CROSSFADE)
|
|
UnityApplyDitherCrossFade(i.vpos);
|
|
#endif
|
|
|
|
float alpha = GetAlpha(i);
|
|
#if defined(_RENDERING_CUTOUT)
|
|
clip(alpha - _Cutoff);
|
|
#endif
|
|
|
|
#if SHADOWS_SEMITRANSPARENT
|
|
float dither =
|
|
tex3D(_DitherMaskLOD, float3(i.vpos.xy * 0.25, alpha * 0.9375)).a;
|
|
clip(dither - 0.01);
|
|
#endif
|
|
|
|
#if defined(SHADOWS_CUBE)
|
|
float depth = length(i.lightVec) + unity_LightShadowBias.x;
|
|
depth *= _LightPositionRange.w;
|
|
return UnityEncodeCubeShadowDepth(depth);
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
#endif |