From aca8999cc9eb442b1c8c8b87244d7ccaf06abfd5 Mon Sep 17 00:00:00 2001 From: norrath-hero <117745457+norrath-hero@users.noreply.github.com> Date: Sat, 10 Dec 2022 04:03:36 +0800 Subject: [PATCH] Fix GLES 2 Spotlight Bug Fixes https://github.com/godotengine/godot/issues/69759 Fixes https://github.com/godotengine/godot/issues/54343 Fixes https://github.com/godotengine/godot/issues/25526 --- drivers/gles2/shaders/scene.glsl | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/drivers/gles2/shaders/scene.glsl b/drivers/gles2/shaders/scene.glsl index f9a127cb7348..a41cda80e1f7 100644 --- a/drivers/gles2/shaders/scene.glsl +++ b/drivers/gles2/shaders/scene.glsl @@ -1499,9 +1499,12 @@ LIGHT_SHADER_CODE #endif #define SAMPLE_SHADOW_TEXEL(p_shadow, p_pos, p_depth) step(p_depth, SHADOW_DEPTH(texture2D(p_shadow, p_pos))) -#define SAMPLE_SHADOW_TEXEL_PROJ(p_shadow, p_pos) step(p_pos.z, SHADOW_DEPTH(texture2DProj(p_shadow, p_pos))) float sample_shadow(highp sampler2D shadow, highp vec4 spos) { + spos.xyz /= spos.w; + vec2 pos = spos.xy; + float depth = spos.z; + #ifdef SHADOW_MODE_PCF_13 // Soft PCF filter adapted from three.js: @@ -1509,9 +1512,6 @@ float sample_shadow(highp sampler2D shadow, highp vec4 spos) { // This method actually uses 16 shadow samples. This soft filter isn't needed in GLES3 // as we can use hardware-based linear filtering instead of emulating it in the shader // like we're doing here. - spos.xyz /= spos.w; - vec2 pos = spos.xy; - float depth = spos.z; vec2 f = fract(pos * (1.0 / shadow_pixel_size) + 0.5); pos -= f * shadow_pixel_size; @@ -1549,10 +1549,6 @@ float sample_shadow(highp sampler2D shadow, highp vec4 spos) { #ifdef SHADOW_MODE_PCF_5 - spos.xyz /= spos.w; - vec2 pos = spos.xy; - float depth = spos.z; - float avg = SAMPLE_SHADOW_TEXEL(shadow, pos, depth); avg += SAMPLE_SHADOW_TEXEL(shadow, pos + vec2(shadow_pixel_size.x, 0.0), depth); avg += SAMPLE_SHADOW_TEXEL(shadow, pos + vec2(-shadow_pixel_size.x, 0.0), depth); @@ -1562,9 +1558,9 @@ float sample_shadow(highp sampler2D shadow, highp vec4 spos) { #endif -#if !defined(SHADOW_MODE_PCF_5) || !defined(SHADOW_MODE_PCF_13) +#if !defined(SHADOW_MODE_PCF_5) && !defined(SHADOW_MODE_PCF_13) - return SAMPLE_SHADOW_TEXEL_PROJ(shadow, spos); + return SAMPLE_SHADOW_TEXEL(shadow, pos, depth); #endif }