[Bf-blender-cvs] [31ad86884cb] master: EEVEE: Shadow: Fix cascade shadowmap bias multiplicator

Clément Foucault noreply at git.blender.org
Fri Feb 14 12:27:15 CET 2020


Commit: 31ad86884cb1b9257f8958cd50942e76aefbd705
Author: Clément Foucault
Date:   Fri Feb 14 12:17:06 2020 +0100
Branches: master
https://developer.blender.org/rB31ad86884cb1b9257f8958cd50942e76aefbd705

EEVEE: Shadow: Fix cascade shadowmap bias multiplicator

This fixes the issue where sun shadowmaps needs a very big bias value to
make any difference.

The bias is now in world space and not dependant on shadow bounds.

Unfortunatelly this breaks compatibility with previous version and old
scene are likely to need user intervention to fix.

Also fixes the property range.

Fix T71661 EEVEE shadow from sun on incorrect face

===================================================================

M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_shadows_cascade.c
M	source/blender/makesrna/intern/rna_light.c

===================================================================

diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index dd67a4d72cb..b14ffa9d0b0 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -4461,5 +4461,14 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
         }
       }
     }
+
+    /* EEVEE: Cascade shadow bias fix */
+    LISTBASE_FOREACH (Light *, light, &bmain->lights) {
+      if (light->type == LA_SUN) {
+        /* Should be 0.0004 but for practical reason we make it bigger.
+         * Correct factor is scene dependent. */
+        light->bias *= 0.002f;
+      }
+    }
   }
 }
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 8ba68589cbd..e39cb430fe5 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -398,6 +398,7 @@ typedef struct EEVEE_ShadowCascadeRender {
   float projmat[MAX_CASCADE_NUM][4][4];
   float viewmat[4][4], viewinv[4][4];
   float radius[MAX_CASCADE_NUM];
+  float original_bias;
   float cascade_max_dist;
   float cascade_exponent;
   float cascade_fade;
diff --git a/source/blender/draw/engines/eevee/eevee_shadows_cascade.c b/source/blender/draw/engines/eevee/eevee_shadows_cascade.c
index b2dc8103df2..32045e12a1c 100644
--- a/source/blender/draw/engines/eevee/eevee_shadows_cascade.c
+++ b/source/blender/draw/engines/eevee/eevee_shadows_cascade.c
@@ -40,7 +40,6 @@ void EEVEE_shadows_cascade_add(EEVEE_LightsInfo *linfo, EEVEE_Light *evli, Objec
   EEVEE_ShadowCascade *csm_data = linfo->shadow_cascade_data + linfo->cascade_len;
   EEVEE_ShadowCascadeRender *csm_render = linfo->shadow_cascade_render + linfo->cascade_len;
 
-  sh_data->bias = max_ff(la->bias * 0.00002f, 0.0f);
   eevee_contact_shadow_setup(la, sh_data);
 
   linfo->shadow_cascade_light_indices[linfo->cascade_len] = linfo->num_light;
@@ -51,6 +50,7 @@ void EEVEE_shadows_cascade_add(EEVEE_LightsInfo *linfo, EEVEE_Light *evli, Objec
   csm_render->cascade_count = la->cascade_count;
   csm_render->cascade_exponent = la->cascade_exponent;
   csm_render->cascade_max_dist = la->cascade_max_dist;
+  csm_render->original_bias = max_ff(la->bias, 0.0f);
 
   linfo->num_cascade_layer += la->cascade_count;
 }
@@ -380,6 +380,8 @@ static void eevee_shadow_cascade_setup(EEVEE_LightsInfo *linfo,
 #endif
   }
 
+  /* Bias is in clipspace, divide by range. */
+  shdw_data->bias = csm_render->original_bias * 0.05f / fabsf(sh_far - sh_near);
   shdw_data->near = sh_near;
   shdw_data->far = sh_far;
 }
diff --git a/source/blender/makesrna/intern/rna_light.c b/source/blender/makesrna/intern/rna_light.c
index ecee413a8e0..988504db2f9 100644
--- a/source/blender/makesrna/intern/rna_light.c
+++ b/source/blender/makesrna/intern/rna_light.c
@@ -294,7 +294,7 @@ static void rna_def_light_shadow(StructRNA *srna, bool sun)
 
   prop = RNA_def_property(srna, "shadow_buffer_bias", PROP_FLOAT, PROP_NONE);
   RNA_def_property_float_sdna(prop, NULL, "bias");
-  RNA_def_property_range(prop, 0.001f, 9999.0f);
+  RNA_def_property_range(prop, 0.0f, FLT_MAX);
   RNA_def_property_ui_range(prop, 0.001f, 5.0f, 1.0, 3);
   RNA_def_property_ui_text(prop, "Shadow Buffer Bias", "Bias for reducing self shadowing");
   RNA_def_property_update(prop, 0, "rna_Light_update");



More information about the Bf-blender-cvs mailing list