Aetheria/Assets/Shaders/Terrain/My Shadows.cginc
Reinier Vens 983c51b4ac Hotfix
2021-05-29 13:59:09 +01:00

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