UniqueShadow_ShadowSample.cginc
#ifndef FILE_UNIQUESHADOW_SHADOWSAMPLE
#define FILE_UNIQUESHADOW_SHADOWSAMPLE
#if defined(UNIQUE_SHADOW) || defined(UNIQUE_SHADOW_LIGHT_COOKIE)
#if (defined(DIRECTIONAL) && !defined(UNIQUE_SHADOW_LIGHT_COOKIE)) || (defined(DIRECTIONAL_COOKIE) && defined(UNIQUE_SHADOW_LIGHT_COOKIE))
#define USE_UNIQUE_SHADOW
#endif
#endif
#ifndef USE_UNIQUE_SHADOW
#define UNIQUE_SHADOW_SAMPLE(i) 1.f
#define UNIQUE_SHADOW_INTERP(i)
#define UNIQUE_SHADOW_TRANSFER(o)
#define UNIQUE_SHADOW_ATTENUATION(i) 1.f
#define UNIQUE_SHADOW_SHADOW_ATTENUATION(i) (SHADOW_ATTENUATION(i) * UNIQUE_SHADOW_ATTENUATION(i))
#define UNIQUE_SHADOW_LIGHT_ATTENUATION(i) (LIGHT_ATTENUATION(i) * UNIQUE_SHADOW_ATTENUATION(i))
#endif
#ifdef USE_UNIQUE_SHADOW //<-ends at the very bottom
#if defined(SHADER_API_D3D11) && !defined(UNIQUE_SHADOW_FORCE_CHEAP)
cbuffer POISSON_DISKS {
static half2 poisson[40] = {
half2(0.02971195f, 0.8905211f),
half2(0.2495298f, 0.732075f),
half2(-0.3469206f, 0.6437836f),
half2(-0.01878909f, 0.4827394f),
half2(-0.2725213f, 0.896188f),
half2(-0.6814336f, 0.6480481f),
half2(0.4152045f, 0.2794172f),
half2(0.1310554f, 0.2675925f),
half2(0.5344744f, 0.5624411f),
half2(0.8385689f, 0.5137348f),
half2(0.6045052f, 0.08393857f),
half2(0.4643163f, 0.8684642f),
half2(0.335507f, -0.110113f),
half2(0.03007669f, -0.0007075319f),
half2(0.8077537f, 0.2551664f),
half2(-0.1521498f, 0.2429521f),
half2(-0.2997617f, 0.0234927f),
half2(0.2587779f, -0.4226915f),
half2(-0.01448214f, -0.2720358f),
half2(-0.3937779f, -0.228529f),
half2(-0.7833176f, 0.1737299f),
half2(-0.4447537f, 0.2582748f),
half2(-0.9030743f, 0.406874f),
half2(-0.729588f, -0.2115215f),
half2(-0.5383645f, -0.6681151f),
half2(-0.07709587f, -0.5395499f),
half2(-0.3402214f, -0.4782109f),
half2(-0.5580465f, 0.01399586f),
half2(-0.105644f, -0.9191031f),
half2(-0.8343651f, -0.4750755f),
half2(-0.9959937f, -0.0540134f),
half2(0.1747736f, -0.936202f),
half2(-0.3642297f, -0.926432f),
half2(0.1719682f, -0.6798802f),
half2(0.4424475f, -0.7744268f),
half2(0.6849481f, -0.3031401f),
half2(0.5453879f, -0.5152272f),
half2(0.9634013f, -0.2050581f),
half2(0.9907925f, 0.08320642f),
half2(0.8386722f, -0.5428791f)
};
};
uniform Texture2D u_UniqueShadowTexture;
uniform SamplerComparisonState sampleru_UniqueShadowTexture;
uniform Texture2D u_UniqueShadowTextureFakePoint;
uniform SamplerState sampleru_UniqueShadowTextureFakePoint;
uniform half2 u_UniqueShadowBlockerWidth;
uniform half u_UniqueShadowBlockerDistanceScale;
uniform half2 u_UniqueShadowLightWidth;
uniform sampler2D unity_RandomRotation16;
uniform samplerCUBE _ShadowsCube;
uniform half4 _ShadowsCubeRoot;
half SampleUniqueD3D11(half4 uv, half4 screen) {
float dist = u_UniqueShadowTextureFakePoint.Sample(sampleru_UniqueShadowTextureFakePoint, float2(0,0)).a;
for(int j = 0; j < 10; ++j) {
const half2 poi = poisson[j + 24];
const half2 off = poi * u_UniqueShadowBlockerWidth;
float depth = u_UniqueShadowTexture.Sample(sampleru_UniqueShadowTextureFakePoint, uv.xy + off).r;
#if defined(UNITY_REVERSED_Z)
depth = 1.f - depth;
#endif
float d = uv.z - depth;
dist += max(0.f, d);
}
dist *= u_UniqueShadowBlockerDistanceScale;
#if 0
const float randomRotationTextureSize = 1.f / 16.f;
float4 rotation = tex2D(unity_RandomRotation16, screen.xy * _ScreenParams.xy * randomRotationTextureSize) * 2.f - 1.f;
#elif 0
const half s = sin(uv.x * 20.f);
const half c = cos(uv.y * 20.f);
#endif
half shadow = 0.f;
for(int i = 0; i < 32; ++i) {
const float c_LightWidth = lerp(u_UniqueShadowLightWidth.x, u_UniqueShadowLightWidth.y, min(1.f, dist));
#if 0
half2 poi = poisson[i];
poi.x = dot( poi.xy, rotation.rg );
poi.y = dot( poi.xy, rotation.ba );
const half2 rotPoi = poi;
#else
const half2 poi = poisson[i];
//const half2 rotPoi = half2(c * poi.x - s * poi.y, s * poi.x + c * poi.y);
const half2 rotPoi = poi;
#endif
const half2 off = rotPoi * c_LightWidth;
shadow += u_UniqueShadowTexture.SampleCmpLevelZero(sampleru_UniqueShadowTexture, uv.xy + off, uv.z);
}
return shadow / 32.f;
}
#define UNIQUE_SHADOW_SAMPLE(i) SampleUniqueD3D11(i.uniqueShadowPos, half4(0,0,0,0)/*i.pos*/)
#else//defined(SHADER_API_D3D11) && !defined(UNIQUE_SHADOW_FORCE_CHEAP)
static half2 poisson[8] = {
half2(0.02971195f, -0.8905211f),
half2(0.2495298f, 0.732075f),
half2(-0.3469206f, -0.6437836f),
half2(-0.01878909f, 0.4827394f),
half2(-0.2725213f, -0.896188f),
half2(-0.6814336f, 0.6480481f),
half2(0.4152045f, -0.2794172f),
half2(0.1310554f, 0.2675925f),
};
// Normally, we would just force define SHADOWS_NATIVE to auto-set these correctly,
// but that currently seems to cause issues with surface shaders.
#if defined(SHADER_TARGET_GLSL) || defined(SHADER_API_D3D9)
#undef UNITY_DECLARE_SHADOWMAP
#undef UNITY_SAMPLE_SHADOW
#endif
#if defined(SHADER_TARGET_GLSL)
// OpenGL-like platforms, when "native shadow maps" are supported: special hlsl2glsl syntax
#define UNITY_DECLARE_SHADOWMAP(tex) sampler2DShadow tex
#define UNITY_SAMPLE_SHADOW(tex,coord) shadow2D (tex,(coord).xyz)
#elif defined(SHADER_API_D3D9)
#define UNITY_DECLARE_SHADOWMAP(tex) sampler2D tex
#define UNITY_SAMPLE_SHADOW(tex,coord) tex2Dproj (tex,float4((coord).xyz,1)).r
#endif
UNITY_DECLARE_SHADOWMAP(u_UniqueShadowTexture);
uniform half2 u_UniqueShadowFilterWidth;
half SampleUniqueD3D9OGL(const half4 coords) {
half4 uv = coords;
half shadow = 0.f;
for(int i = 0; i < 8; ++i) {
uv.xy = coords.xy + poisson[i] * u_UniqueShadowFilterWidth;
shadow += UNITY_SAMPLE_SHADOW(u_UniqueShadowTexture, uv.xyz);
}
return shadow / 8.f;
}
#define UNIQUE_SHADOW_SAMPLE(i) SampleUniqueD3D9OGL(i.uniqueShadowPos)
#endif//defined(SHADER_API_D3D11) && !defined(UNIQUE_SHADOW_FORCE_CHEAP)
uniform float4x4 u_UniqueShadowMatrix;
#define UNIQUE_SHADOW_INTERP(i) half4 uniqueShadowPos : TEXCOORD##i ;
#define UNIQUE_SHADOW_TRANSFER(o) o.uniqueShadowPos = mul(u_UniqueShadowMatrix, float4(posWorld.xyz, 1.f));
#define UNIQUE_SHADOW_ATTENUATION(i) UNIQUE_SHADOW_SAMPLE(i)
#define UNIQUE_SHADOW_SHADOW_ATTENUATION(i) (SHADOW_ATTENUATION(i) * UNIQUE_SHADOW_ATTENUATION(i))
#define UNIQUE_SHADOW_LIGHT_ATTENUATION(i) (LIGHT_ATTENUATION(i) * UNIQUE_SHADOW_ATTENUATION(i))
#if defined(UNITY_PASS_FORWARDBASE) || defined(UNITY_PASS_FORWARDADD) || defined(UNIQUE_SHADOW_FORCE_REPLACE_BUILTIN)
#undef UNITY_SHADOW_COORDS
#undef UNITY_TRANSFER_SHADOW
#undef UNITY_SHADOW_ATTENUATION
#define UNITY_SHADOW_COORDS(i) UNIQUE_SHADOW_INTERP(i)
#define UNITY_TRANSFER_SHADOW(i,coord) o.uniqueShadowPos = mul(u_UniqueShadowMatrix, float4(worldPos.xyz, 1.f));
#define UNITY_SHADOW_ATTENUATION(i, worldPos) UNIQUE_SHADOW_SAMPLE(i);
#endif
#endif//USE_UNIQUE_SHADOWS
#endif //FILE_UNIQUESHADOW_SHADOWSAMPLE