浏览代码

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.
Hugo Locurcio 9 月之前
父节点
当前提交
dfc05caf06
共有 1 个文件被更改,包括 3 次插入1 次删除
  1. 3 1
      servers/rendering/renderer_rd/storage_rd/light_storage.cpp

+ 3 - 1
servers/rendering/renderer_rd/storage_rd/light_storage.cpp

@@ -714,7 +714,9 @@ void LightStorage::update_light_buffers(RenderDataRD *p_render_data, const Paged
 						light_data.shadow_split_offsets[j] = split;
 						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;
+						// Use lower shadow normal bias for distant splits, relative to the share taken by the split.
+						// This helps reduce peter-panning at a distance.
+						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;
 						light_data.shadow_transmittance_bias[j] = light->param[RS::LIGHT_PARAM_TRANSMITTANCE_BIAS] / 100.0 * bias_scale;
 						light_data.shadow_z_range[j] = light_instance->shadow_transform[j].farplane;
 						light_data.shadow_range_begin[j] = light_instance->shadow_transform[j].range_begin;