Skip to content

Commit dfc05ca

Browse files
committed
Use lower shadow normal bias for distant directional shadow splits
This reduces the visual discrepancy between shadow splits when Normal Bias is greater than 0. Shadow acne at a distance may be slightly more present, but if the bias and normal bias values are tuned to avoid acne up close, acne will usually not be present in distant splits.
1 parent 1b7b009 commit dfc05ca

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

servers/rendering/renderer_rd/storage_rd/light_storage.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,9 @@ void LightStorage::update_light_buffers(RenderDataRD *p_render_data, const Paged
714714
light_data.shadow_split_offsets[j] = split;
715715
float bias_scale = light_instance->shadow_transform[j].bias_scale * light_data.soft_shadow_scale;
716716
light_data.shadow_bias[j] = light->param[RS::LIGHT_PARAM_SHADOW_BIAS] / 100.0 * bias_scale;
717-
light_data.shadow_normal_bias[j] = light->param[RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS] * light_instance->shadow_transform[j].shadow_texel_size;
717+
// Use lower shadow normal bias for distant splits, relative to the share taken by the split.
718+
// This helps reduce peter-panning at a distance.
719+
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_split_offsets[0] / split;
718720
light_data.shadow_transmittance_bias[j] = light->param[RS::LIGHT_PARAM_TRANSMITTANCE_BIAS] / 100.0 * bias_scale;
719721
light_data.shadow_z_range[j] = light_instance->shadow_transform[j].farplane;
720722
light_data.shadow_range_begin[j] = light_instance->shadow_transform[j].range_begin;

0 commit comments

Comments
 (0)