|
@@ -201,6 +201,33 @@ float computeShadow(vec4 vPositionFromLight, sampler2D shadowSampler, float dark
|
|
return 1.;
|
|
return 1.;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+float computeShadowWithPCF(vec4 vPositionFromLight, sampler2D shadowSampler)
|
|
|
|
+{
|
|
|
|
+ vec3 depth = vPositionFromLight.xyz / vPositionFromLight.w;
|
|
|
|
+ vec2 uv = 0.5 * depth.xy + vec2(0.5, 0.5);
|
|
|
|
+
|
|
|
|
+ if (uv.x < 0. || uv.x > 1.0 || uv.y < 0. || uv.y > 1.0)
|
|
|
|
+ {
|
|
|
|
+ return 1.0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ float visibility = 1.;
|
|
|
|
+
|
|
|
|
+ vec2 poissonDisk[4];
|
|
|
|
+ poissonDisk[0] = vec2( -0.94201624, -0.39906216 );
|
|
|
|
+ poissonDisk[1] = vec2( 0.94558609, -0.76890725 );
|
|
|
|
+ poissonDisk[2] = vec2( -0.094184101, -0.92938870 );
|
|
|
|
+ poissonDisk[3] = vec2( 0.34495938, 0.29387760 );
|
|
|
|
+
|
|
|
|
+ // Poisson Sampling
|
|
|
|
+ for (int i=0;i<4;i++){
|
|
|
|
+ if ( unpack(texture2D( shadowSampler, uv + poissonDisk[i]/1500.0 )) < depth.z ){
|
|
|
|
+ visibility -= 0.2;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return visibility;
|
|
|
|
+}
|
|
|
|
+
|
|
// Thanks to http://devmaster.net/
|
|
// Thanks to http://devmaster.net/
|
|
float ChebychevInequality(vec2 moments, float t)
|
|
float ChebychevInequality(vec2 moments, float t)
|
|
{
|
|
{
|
|
@@ -469,8 +496,12 @@ void main(void) {
|
|
#ifdef SHADOWVSM0
|
|
#ifdef SHADOWVSM0
|
|
shadow = computeShadowWithVSM(vPositionFromLight0, shadowSampler0);
|
|
shadow = computeShadowWithVSM(vPositionFromLight0, shadowSampler0);
|
|
#else
|
|
#else
|
|
|
|
+#ifdef SHADOWPCF0
|
|
|
|
+ shadow = computeShadowWithPCF(vPositionFromLight0, shadowSampler0);
|
|
|
|
+#else
|
|
shadow = computeShadow(vPositionFromLight0, shadowSampler0, darkness0);
|
|
shadow = computeShadow(vPositionFromLight0, shadowSampler0, darkness0);
|
|
#endif
|
|
#endif
|
|
|
|
+#endif
|
|
#else
|
|
#else
|
|
shadow = 1.;
|
|
shadow = 1.;
|
|
#endif
|
|
#endif
|
|
@@ -492,8 +523,12 @@ void main(void) {
|
|
#ifdef SHADOWVSM1
|
|
#ifdef SHADOWVSM1
|
|
shadow = computeShadowWithVSM(vPositionFromLight1, shadowSampler1);
|
|
shadow = computeShadowWithVSM(vPositionFromLight1, shadowSampler1);
|
|
#else
|
|
#else
|
|
|
|
+#ifdef SHADOWPCF1
|
|
|
|
+ shadow = computeShadowWithPCF(vPositionFromLight1, shadowSampler1);
|
|
|
|
+#else
|
|
shadow = computeShadow(vPositionFromLight1, shadowSampler1, darkness1);
|
|
shadow = computeShadow(vPositionFromLight1, shadowSampler1, darkness1);
|
|
#endif
|
|
#endif
|
|
|
|
+#endif
|
|
#else
|
|
#else
|
|
shadow = 1.;
|
|
shadow = 1.;
|
|
#endif
|
|
#endif
|
|
@@ -515,8 +550,12 @@ void main(void) {
|
|
#ifdef SHADOWVSM2
|
|
#ifdef SHADOWVSM2
|
|
shadow = computeShadowWithVSM(vPositionFromLight2, shadowSampler2);
|
|
shadow = computeShadowWithVSM(vPositionFromLight2, shadowSampler2);
|
|
#else
|
|
#else
|
|
|
|
+#ifdef SHADOWPCF2
|
|
|
|
+ shadow = computeShadowWithPCF(vPositionFromLight2, shadowSampler2);
|
|
|
|
+#else
|
|
shadow = computeShadow(vPositionFromLight2, shadowSampler2, darkness2);
|
|
shadow = computeShadow(vPositionFromLight2, shadowSampler2, darkness2);
|
|
#endif
|
|
#endif
|
|
|
|
+#endif
|
|
#else
|
|
#else
|
|
shadow = 1.;
|
|
shadow = 1.;
|
|
#endif
|
|
#endif
|
|
@@ -538,8 +577,12 @@ void main(void) {
|
|
#ifdef SHADOWVSM3
|
|
#ifdef SHADOWVSM3
|
|
shadow = computeShadowWithVSM(vPositionFromLight3, shadowSampler3);
|
|
shadow = computeShadowWithVSM(vPositionFromLight3, shadowSampler3);
|
|
#else
|
|
#else
|
|
|
|
+#ifdef SHADOWPCF3
|
|
|
|
+ shadow = computeShadowWithPCF(vPositionFromLight3, shadowSampler3);
|
|
|
|
+#else
|
|
shadow = computeShadow(vPositionFromLight3, shadowSampler3, darkness3);
|
|
shadow = computeShadow(vPositionFromLight3, shadowSampler3, darkness3);
|
|
#endif
|
|
#endif
|
|
|
|
+#endif
|
|
#else
|
|
#else
|
|
shadow = 1.;
|
|
shadow = 1.;
|
|
#endif
|
|
#endif
|