Skip to content

Commit

Permalink
Merge pull request godotengine#99536 from lawnjelly/faster_shadow_fade
Browse files Browse the repository at this point in the history
[3.x] Ameliorate performance regression due to directional shadow `fade_start`
  • Loading branch information
lawnjelly authored Nov 23, 2024
2 parents f75abbb + 4c930bb commit b1ea48d
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 8 deletions.
5 changes: 4 additions & 1 deletion drivers/gles3/rasterizer_scene_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2799,7 +2799,10 @@ void RasterizerSceneGLES3::_setup_directional_light(int p_index, const Transform
const float fade_start = li->light_ptr->param[VS::LIGHT_PARAM_SHADOW_FADE_START];
// Using 1.0 would break `smoothstep()` in the shader.
ubo_data.fade_from = -ubo_data.shadow_split_offsets[shadow_count - 1] * MIN(fade_start, 0.999);
ubo_data.fade_to = -ubo_data.shadow_split_offsets[shadow_count - 1];

// To prevent the need for a fade to, store the fade to in the final split offset.
// It will either be the same as before, or the maximum split offset.
ubo_data.shadow_split_offsets[3] = ubo_data.shadow_split_offsets[shadow_count - 1];
}

glBindBuffer(GL_UNIFORM_BUFFER, state.directional_ubo);
Expand Down
3 changes: 1 addition & 2 deletions drivers/gles3/rasterizer_scene_gles3.h
Original file line number Diff line number Diff line change
Expand Up @@ -592,8 +592,7 @@ class RasterizerSceneGLES3 : public RasterizerScene {
float shadow_split_offsets[4];

float fade_from;
float fade_to;
float pad[2];
float pad[3];
};

struct LightInstance : public RID_Data {
Expand Down
8 changes: 3 additions & 5 deletions drivers/gles3/shaders/scene.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,7 @@ layout(std140) uniform DirectionalLightData { //ubo:3
mediump vec4 shadow_split_offsets;

mediump float fade_from;
mediump float fade_to;
mediump vec2 pad;
mediump vec3 pad;
};

#endif //ubershader-skip
Expand Down Expand Up @@ -848,8 +847,7 @@ layout(std140) uniform DirectionalLightData {
mediump vec4 shadow_split_offsets;

mediump float fade_from;
mediump float fade_to;
mediump vec2 pad;
mediump vec3 pad;
};

uniform highp sampler2DShadow directional_shadow; // texunit:-5
Expand Down Expand Up @@ -2292,7 +2290,7 @@ FRAGMENT_SHADER_CODE
shadow = min(shadow, contact_shadow);
}
#endif //ubershader-runtime
float pssm_fade = smoothstep(fade_from, fade_to, vertex.z);
float pssm_fade = smoothstep(fade_from, -shadow_split_offsets.w, vertex.z);
light_attenuation = mix(mix(shadow_color_contact.rgb, vec3(1.0), shadow), vec3(1.0), pssm_fade);
}

Expand Down

0 comments on commit b1ea48d

Please sign in to comment.