Scale light shadow bias by soft_shadow_scale to reduce shadow acne on high quality settings
This commit is contained in:
parent
f814e15c7f
commit
5f4a561f6c
@ -653,6 +653,14 @@ void LightStorage::update_light_buffers(RenderDataRD *p_render_data, const Paged
|
||||
if (light_data.shadow_opacity > 0.001) {
|
||||
RS::LightDirectionalShadowMode smode = light->directional_shadow_mode;
|
||||
|
||||
light_data.soft_shadow_scale = light->param[RS::LIGHT_PARAM_SHADOW_BLUR];
|
||||
light_data.softshadow_angle = angular_diameter;
|
||||
light_data.bake_mode = light->bake_mode;
|
||||
|
||||
if (angular_diameter <= 0.0) {
|
||||
light_data.soft_shadow_scale *= RendererSceneRenderRD::get_singleton()->directional_shadow_quality_radius_get(); // Only use quality radius for PCF
|
||||
}
|
||||
|
||||
int limit = smode == RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL ? 0 : (smode == RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_2_SPLITS ? 1 : 3);
|
||||
light_data.blend_splits = (smode != RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL) && light->directional_blend_splits;
|
||||
for (int j = 0; j < 4; j++) {
|
||||
@ -669,7 +677,7 @@ void LightStorage::update_light_buffers(RenderDataRD *p_render_data, const Paged
|
||||
|
||||
Projection shadow_mtx = rectm * bias * matrix * modelview;
|
||||
light_data.shadow_split_offsets[j] = split;
|
||||
float bias_scale = light_instance->shadow_transform[j].bias_scale;
|
||||
float bias_scale = light_instance->shadow_transform[j].bias_scale * light_data.soft_shadow_scale;
|
||||
light_data.shadow_bias[j] = light->param[RS::LIGHT_PARAM_SHADOW_BIAS] / 100.0 * bias_scale;
|
||||
light_data.shadow_normal_bias[j] = light->param[RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS] * light_instance->shadow_transform[j].shadow_texel_size;
|
||||
light_data.shadow_transmittance_bias[j] = light->param[RS::LIGHT_PARAM_TRANSMITTANCE_BIAS] * bias_scale;
|
||||
@ -702,14 +710,6 @@ void LightStorage::update_light_buffers(RenderDataRD *p_render_data, const Paged
|
||||
float fade_start = light->param[RS::LIGHT_PARAM_SHADOW_FADE_START];
|
||||
light_data.fade_from = -light_data.shadow_split_offsets[3] * MIN(fade_start, 0.999); //using 1.0 would break smoothstep
|
||||
light_data.fade_to = -light_data.shadow_split_offsets[3];
|
||||
|
||||
light_data.soft_shadow_scale = light->param[RS::LIGHT_PARAM_SHADOW_BLUR];
|
||||
light_data.softshadow_angle = angular_diameter;
|
||||
light_data.bake_mode = light->bake_mode;
|
||||
|
||||
if (angular_diameter <= 0.0) {
|
||||
light_data.soft_shadow_scale *= RendererSceneRenderRD::get_singleton()->directional_shadow_quality_radius_get(); // Only use quality radius for PCF
|
||||
}
|
||||
}
|
||||
|
||||
r_directional_light_count++;
|
||||
@ -978,6 +978,7 @@ void LightStorage::update_light_buffers(RenderDataRD *p_render_data, const Paged
|
||||
light_data.soft_shadow_size = 0.0;
|
||||
light_data.soft_shadow_scale *= RendererSceneRenderRD::get_singleton()->shadows_quality_radius_get(); // Only use quality radius for PCF
|
||||
}
|
||||
light_data.shadow_bias *= light_data.soft_shadow_scale;
|
||||
}
|
||||
} else {
|
||||
light_data.shadow_opacity = 0.0;
|
||||
|
Loading…
Reference in New Issue
Block a user