|
|
@@ -44,34 +44,39 @@ float GetSpecular(float3 normal, float3 worldPos, float3 lightDir, float specula
|
|
|
|
|
|
float GetShadow(float4 shadowPos)
|
|
|
{
|
|
|
- // Take four samples and average them
|
|
|
- float4 pcfValues = cShadowIntensity.x;
|
|
|
- #ifdef SM3
|
|
|
- float2 ofs = cSampleOffsets.xy;
|
|
|
- float4 projShadowPos = float4(shadowPos.xyz / shadowPos.w, 0.0);
|
|
|
- float4 inLight = float4(
|
|
|
- tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.x, ofs.x), projShadowPos.zw)).r,
|
|
|
- tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.y, ofs.x), projShadowPos.zw)).r,
|
|
|
- tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.x, ofs.y), projShadowPos.zw)).r,
|
|
|
- tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.y, ofs.y), projShadowPos.zw)).r
|
|
|
- );
|
|
|
- #ifdef HWSHADOW
|
|
|
- return cShadowIntensity.y + dot(inLight, pcfValues);
|
|
|
+ #ifndef FALLBACK
|
|
|
+ // Take four samples and average them
|
|
|
+ float4 pcfValues = cShadowIntensity.x;
|
|
|
+ #ifdef SM3
|
|
|
+ float2 ofs = cSampleOffsets.xy;
|
|
|
+ float4 projShadowPos = float4(shadowPos.xyz / shadowPos.w, 0.0);
|
|
|
+ float4 inLight = float4(
|
|
|
+ tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.x, ofs.x), projShadowPos.zw)).r,
|
|
|
+ tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.y, ofs.x), projShadowPos.zw)).r,
|
|
|
+ tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.x, ofs.y), projShadowPos.zw)).r,
|
|
|
+ tex2Dlod(sShadowMap, float4(projShadowPos.xy + float2(ofs.y, ofs.y), projShadowPos.zw)).r
|
|
|
+ );
|
|
|
+ #ifdef HWSHADOW
|
|
|
+ return cShadowIntensity.y + dot(inLight, pcfValues);
|
|
|
+ #else
|
|
|
+ return cShadowIntensity.y + dot(inLight > projShadowPos.z, pcfValues);
|
|
|
+ #endif
|
|
|
#else
|
|
|
- return cShadowIntensity.y + dot(inLight > projShadowPos.z, pcfValues);
|
|
|
+ float2 projOfs = cSampleOffsets.xy * shadowPos.w;
|
|
|
+ float4 inLight = float4(
|
|
|
+ tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.x, projOfs.x), shadowPos.zw)).r,
|
|
|
+ tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.y, projOfs.x), shadowPos.zw)).r,
|
|
|
+ tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.x, projOfs.y), shadowPos.zw)).r,
|
|
|
+ tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.y, projOfs.y), shadowPos.zw)).r
|
|
|
+ );
|
|
|
+ #ifdef HWSHADOW
|
|
|
+ return cShadowIntensity.y + dot(inLight, pcfValues);
|
|
|
+ #else
|
|
|
+ return cShadowIntensity.y + dot((inLight * shadowPos.w) > shadowPos.z, pcfValues);
|
|
|
+ #endif
|
|
|
#endif
|
|
|
#else
|
|
|
- float2 projOfs = cSampleOffsets.xy * shadowPos.w;
|
|
|
- float4 inLight = float4(
|
|
|
- tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.x, projOfs.x), shadowPos.zw)).r,
|
|
|
- tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.y, projOfs.x), shadowPos.zw)).r,
|
|
|
- tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.x, projOfs.y), shadowPos.zw)).r,
|
|
|
- tex2Dproj(sShadowMap, float4(shadowPos.xy + float2(projOfs.y, projOfs.y), shadowPos.zw)).r
|
|
|
- );
|
|
|
- #ifdef HWSHADOW
|
|
|
- return cShadowIntensity.y + dot(inLight, pcfValues);
|
|
|
- #else
|
|
|
- return cShadowIntensity.y + dot((inLight * shadowPos.w) > shadowPos.z, pcfValues);
|
|
|
- #endif
|
|
|
+ float inLight = DecodeDepth(tex2Dproj(sShadowMap, shadowPos).rg);
|
|
|
+ return cShadowIntensity.y + cShadowIntensity.x * ((inLight * shadowPos.w) > shadowPos.z);
|
|
|
#endif
|
|
|
}
|