|
@@ -1263,7 +1263,20 @@ LIGHT_SHADER_CODE
|
|
|
float sample_shadow(highp sampler2DShadow shadow, vec2 shadow_pixel_size, vec2 pos, float depth, vec4 clamp_rect) {
|
|
|
#ifdef SHADOW_MODE_PCF_13 //ubershader-runtime
|
|
|
|
|
|
- float avg = textureProj(shadow, vec4(pos, depth, 1.0));
|
|
|
+ float avg = textureProj(shadow, vec4(pos + vec2(shadow_pixel_size.x * 2.0, 0.0), depth, 1.0));
|
|
|
+ avg += textureProj(shadow, vec4(pos + vec2(-shadow_pixel_size.x * 2.0, 0.0), depth, 1.0));
|
|
|
+ avg += textureProj(shadow, vec4(pos + vec2(0.0, shadow_pixel_size.y * 2.0), depth, 1.0));
|
|
|
+ avg += textureProj(shadow, vec4(pos + vec2(0.0, -shadow_pixel_size.y * 2.0), depth, 1.0));
|
|
|
+ // Early bail if distant samples are fully shaded (or none are shaded) to improve performance.
|
|
|
+ if (avg <= 0.000001) {
|
|
|
+ // None shaded at all.
|
|
|
+ return 0.0;
|
|
|
+ } else if (avg >= 3.999999) {
|
|
|
+ // All fully shaded.
|
|
|
+ return 1.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ avg += textureProj(shadow, vec4(pos, depth, 1.0));
|
|
|
avg += textureProj(shadow, vec4(pos + vec2(shadow_pixel_size.x, 0.0), depth, 1.0));
|
|
|
avg += textureProj(shadow, vec4(pos + vec2(-shadow_pixel_size.x, 0.0), depth, 1.0));
|
|
|
avg += textureProj(shadow, vec4(pos + vec2(0.0, shadow_pixel_size.y), depth, 1.0));
|
|
@@ -1272,10 +1285,6 @@ float sample_shadow(highp sampler2DShadow shadow, vec2 shadow_pixel_size, vec2 p
|
|
|
avg += textureProj(shadow, vec4(pos + vec2(-shadow_pixel_size.x, shadow_pixel_size.y), depth, 1.0));
|
|
|
avg += textureProj(shadow, vec4(pos + vec2(shadow_pixel_size.x, -shadow_pixel_size.y), depth, 1.0));
|
|
|
avg += textureProj(shadow, vec4(pos + vec2(-shadow_pixel_size.x, -shadow_pixel_size.y), depth, 1.0));
|
|
|
- avg += textureProj(shadow, vec4(pos + vec2(shadow_pixel_size.x * 2.0, 0.0), depth, 1.0));
|
|
|
- avg += textureProj(shadow, vec4(pos + vec2(-shadow_pixel_size.x * 2.0, 0.0), depth, 1.0));
|
|
|
- avg += textureProj(shadow, vec4(pos + vec2(0.0, shadow_pixel_size.y * 2.0), depth, 1.0));
|
|
|
- avg += textureProj(shadow, vec4(pos + vec2(0.0, -shadow_pixel_size.y * 2.0), depth, 1.0));
|
|
|
return avg * (1.0 / 13.0);
|
|
|
#endif //ubershader-runtime
|
|
|
|