瀏覽代碼

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

(cherry picked from commit aca8999cc9eb442b1c8c8b87244d7ccaf06abfd5)
norrath-hero 2 年之前
父節點
當前提交
3924c1685a
共有 1 個文件被更改,包括 6 次插入10 次删除
  1. 6 10
      drivers/gles2/shaders/scene.glsl

+ 6 - 10
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
 }