Ameliorate performance regression due to directional shadow fade_start

This commit is contained in:
lawnjelly 2024-11-22 12:13:35 +00:00 committed by Relintai
parent 55f20acfa5
commit 5dbdd73b0a
3 changed files with 8 additions and 8 deletions

View File

@ -2799,7 +2799,10 @@ void RasterizerSceneGLES3::_setup_directional_light(int p_index, const Transform
const float fade_start = li->light_ptr->param[RS::LIGHT_PARAM_SHADOW_FADE_START]; const float fade_start = li->light_ptr->param[RS::LIGHT_PARAM_SHADOW_FADE_START];
// Using 1.0 would break `smoothstep()` in the shader. // 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_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); glBindBuffer(GL_UNIFORM_BUFFER, state.directional_ubo);

View File

@ -594,8 +594,7 @@ public:
float shadow_split_offsets[4]; float shadow_split_offsets[4];
float fade_from; float fade_from;
float fade_to; float pad[3];
float pad[2];
}; };
struct LightInstance : public RID_Data { struct LightInstance : public RID_Data {

View File

@ -148,8 +148,7 @@ layout(std140) uniform DirectionalLightData { //ubo:3
mediump vec4 shadow_split_offsets; mediump vec4 shadow_split_offsets;
mediump float fade_from; mediump float fade_from;
mediump float fade_to; mediump vec3 pad;
mediump vec2 pad;
}; };
#endif //ubershader-skip #endif //ubershader-skip
@ -848,8 +847,7 @@ layout(std140) uniform DirectionalLightData {
mediump vec4 shadow_split_offsets; mediump vec4 shadow_split_offsets;
mediump float fade_from; mediump float fade_from;
mediump float fade_to; mediump vec3 pad;
mediump vec2 pad;
}; };
uniform highp sampler2DShadow directional_shadow; // texunit:-5 uniform highp sampler2DShadow directional_shadow; // texunit:-5
@ -2292,7 +2290,7 @@ FRAGMENT_SHADER_CODE
shadow = min(shadow, contact_shadow); shadow = min(shadow, contact_shadow);
} }
#endif //ubershader-runtime #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); light_attenuation = mix(mix(shadow_color_contact.rgb, vec3(1.0), shadow), vec3(1.0), pssm_fade);
} }